diff options
author | Dave Airlie <[email protected]> | 2018-03-13 15:37:36 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2018-03-23 10:21:10 +1000 |
commit | fa683385de515c24f4c7cf62dfce8a16faa4b2be (patch) | |
tree | 4756ff5ae207ebcdb45cec16a77dc908533bb90d | |
parent | d7a015cbc6a6c12a87ee7ec725cc399d3712f43c (diff) |
virgl: add ARB_cull_distance support.
This just allows the properties through to the host if we have
cull dist support.
Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/gallium/drivers/virgl/virgl_context.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_context.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_screen.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_tgsi.c | 11 |
4 files changed, 13 insertions, 5 deletions
diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index f1b6ef45018..8d701bb8f40 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -469,7 +469,7 @@ static void *virgl_shader_encoder(struct pipe_context *ctx, struct tgsi_token *new_tokens; int ret; - new_tokens = virgl_tgsi_transform(shader->tokens); + new_tokens = virgl_tgsi_transform(vctx, shader->tokens); if (!new_tokens) return NULL; diff --git a/src/gallium/drivers/virgl/virgl_context.h b/src/gallium/drivers/virgl/virgl_context.h index d8d4ccbb392..3492dcfa494 100644 --- a/src/gallium/drivers/virgl/virgl_context.h +++ b/src/gallium/drivers/virgl/virgl_context.h @@ -109,6 +109,6 @@ void virgl_transfer_inline_write(struct pipe_context *ctx, unsigned stride, unsigned layer_stride); -struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in); +struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in); #endif diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 1878def4745..02613f18663 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -196,6 +196,8 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_SAMPLE_SHADING: case PIPE_CAP_FORCE_PERSAMPLE_INTERP: return vscreen->caps.caps.v1.bset.has_sample_shading; + case PIPE_CAP_CULL_DISTANCE: + return vscreen->caps.caps.v1.bset.has_cull; case PIPE_CAP_TEXTURE_GATHER_SM5: case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: case PIPE_CAP_FAKE_SW_MSAA: @@ -239,7 +241,6 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_PCI_FUNCTION: case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: - case PIPE_CAP_CULL_DISTANCE: case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_MAX_WINDOW_RECTANGLES: diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c index ca0591322da..ff5abf6ddbd 100644 --- a/src/gallium/drivers/virgl/virgl_tgsi.c +++ b/src/gallium/drivers/virgl/virgl_tgsi.c @@ -27,8 +27,10 @@ */ #include "tgsi/tgsi_transform.h" #include "virgl_context.h" +#include "virgl_screen.h" struct virgl_transform_context { struct tgsi_transform_context base; + bool cull_enabled; }; static void @@ -55,9 +57,13 @@ static void virgl_tgsi_transform_property(struct tgsi_transform_context *ctx, struct tgsi_full_property *prop) { + struct virgl_transform_context *vtctx = (struct virgl_transform_context *)ctx; switch (prop->Property.PropertyName) { case TGSI_PROPERTY_NUM_CLIPDIST_ENABLED: case TGSI_PROPERTY_NUM_CULLDIST_ENABLED: + if (vtctx->cull_enabled) + ctx->emit_property(ctx, prop); + break; case TGSI_PROPERTY_NEXT_SHADER: break; default: @@ -82,9 +88,9 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx, ctx->emit_instruction(ctx, inst); } -struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in) +struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in) { - + struct virgl_screen *vscreen = (struct virgl_screen *)vctx->base.screen; struct virgl_transform_context transform; const uint newLen = tgsi_num_tokens(tokens_in); struct tgsi_token *new_tokens; @@ -97,6 +103,7 @@ struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in) transform.base.transform_declaration = virgl_tgsi_transform_declaration; transform.base.transform_property = virgl_tgsi_transform_property; transform.base.transform_instruction = virgl_tgsi_transform_instruction; + transform.cull_enabled = vscreen->caps.caps.v1.bset.has_cull; tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base); return new_tokens; |