summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2018-03-13 15:37:36 +1000
committerDave Airlie <[email protected]>2018-03-23 10:21:10 +1000
commitfa683385de515c24f4c7cf62dfce8a16faa4b2be (patch)
tree4756ff5ae207ebcdb45cec16a77dc908533bb90d /src/gallium
parentd7a015cbc6a6c12a87ee7ec725cc399d3712f43c (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]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/virgl/virgl_context.c2
-rw-r--r--src/gallium/drivers/virgl/virgl_context.h2
-rw-r--r--src/gallium/drivers/virgl/virgl_screen.c3
-rw-r--r--src/gallium/drivers/virgl/virgl_tgsi.c11
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;