Mesa (master): virgl: add ARB_cull_distance support.

Dave Airlie airlied at kemper.freedesktop.org
Fri Mar 23 00:26:30 UTC 2018


Module: Mesa
Branch: master
Commit: fa683385de515c24f4c7cf62dfce8a16faa4b2be
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa683385de515c24f4c7cf62dfce8a16faa4b2be

Author: Dave Airlie <airlied at redhat.com>
Date:   Tue Mar 13 15:37:36 2018 +1000

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 <airlied at redhat.com>

---

 src/gallium/drivers/virgl/virgl_context.c |  2 +-
 src/gallium/drivers/virgl/virgl_context.h |  2 +-
 src/gallium/drivers/virgl/virgl_screen.c  |  3 ++-
 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 f1b6ef4501..8d701bb8f4 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 d8d4ccbb39..3492dcfa49 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 1878def474..02613f1866 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 ca0591322d..ff5abf6ddb 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;




More information about the mesa-commit mailing list