[virglrenderer-devel] [PATCH 02/21] features: add transform_feedback3 feature

Dave Airlie airlied at gmail.com
Tue Jul 24 03:38:54 UTC 2018


From: Dave Airlie <airlied at redhat.com>

this blocks access to indexed queries if tf3 isn't enabled.
---
 src/vrend_decode.c   |  6 ++----
 src/vrend_renderer.c | 27 ++++++++++++++++++++-------
 src/vrend_renderer.h |  4 ++--
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/vrend_decode.c b/src/vrend_decode.c
index 7013cd5..ff4fa08 100644
--- a/src/vrend_decode.c
+++ b/src/vrend_decode.c
@@ -977,8 +977,7 @@ static int vrend_decode_begin_query(struct vrend_decode_ctx *ctx, int length)
 
    uint32_t handle = get_buf_entry(ctx, VIRGL_QUERY_BEGIN_HANDLE);
 
-   vrend_begin_query(ctx->grctx, handle);
-   return 0;
+   return vrend_begin_query(ctx->grctx, handle);
 }
 
 static int vrend_decode_end_query(struct vrend_decode_ctx *ctx, int length)
@@ -988,8 +987,7 @@ static int vrend_decode_end_query(struct vrend_decode_ctx *ctx, int length)
 
    uint32_t handle = get_buf_entry(ctx, VIRGL_QUERY_END_HANDLE);
 
-   vrend_end_query(ctx->grctx, handle);
-   return 0;
+   return vrend_end_query(ctx->grctx, handle);
 }
 
 static int vrend_decode_get_query_result(struct vrend_decode_ctx *ctx, int length)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 8afaf7f..9e1700d 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -113,6 +113,7 @@ enum features_id
    feat_texture_storage,
    feat_texture_view,
    feat_transform_feedback2,
+   feat_transform_feedback3,
    feat_last,
 };
 
@@ -4638,6 +4639,10 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags)
       set_feature(feat_transform_feedback2);
    }
 
+   if (gl_ver >= 40 ||
+       epoxy_has_gl_extension("GL_ARB_transform_feedback3"))
+      set_feature(feat_transform_feedback3);
+
    if (epoxy_has_gl_extension("GL_ARB_stencil_texturing"))
       set_feature(feat_stencil_texturing);
    if ((gles && gl_ver >= 30) ||
@@ -7109,29 +7114,36 @@ static void vrend_destroy_query_object(void *obj_ptr)
    vrend_destroy_query(query);
 }
 
-void vrend_begin_query(struct vrend_context *ctx, uint32_t handle)
+int vrend_begin_query(struct vrend_context *ctx, uint32_t handle)
 {
    struct vrend_query *q;
 
    q = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_QUERY);
    if (!q)
-      return;
+      return EINVAL;
+
+   if (q->index > 0 && !has_feature(feat_transform_feedback3))
+      return EINVAL;
 
    if (q->gltype == GL_TIMESTAMP)
-      return;
+      return 0;
 
    if (q->index > 0)
       glBeginQueryIndexed(q->gltype, q->index, q->id);
    else
       glBeginQuery(q->gltype, q->id);
+   return 0;
 }
 
-void vrend_end_query(struct vrend_context *ctx, uint32_t handle)
+int vrend_end_query(struct vrend_context *ctx, uint32_t handle)
 {
    struct vrend_query *q;
    q = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_QUERY);
    if (!q)
-      return;
+      return EINVAL;
+
+   if (q->index > 0 && !has_feature(feat_transform_feedback3))
+      return EINVAL;
 
    if (vrend_is_timer_query(q->gltype)) {
       if (vrend_state.use_gles && q->gltype == GL_TIMESTAMP) {
@@ -7142,13 +7154,14 @@ void vrend_end_query(struct vrend_context *ctx, uint32_t handle)
          /* remove from active query list for this context */
          glEndQuery(q->gltype);
       }
-      return;
+      return 0;
    }
 
    if (q->index > 0)
       glEndQueryIndexed(q->gltype, q->index);
    else
       glEndQuery(q->gltype);
+   return 0;
 }
 
 void vrend_get_query_result(struct vrend_context *ctx, uint32_t handle,
@@ -7686,7 +7699,7 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
       caps->v1.bset.streamout_pause_resume = 1;
    }
 
-   if (epoxy_has_gl_extension("GL_ARB_transform_feedback3")) {
+   if (has_feature(feat_transform_feedback3)) {
       glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_BUFFERS, &max);
       caps->v1.max_streamout_buffers = max;
    } else if (epoxy_has_gl_extension("GL_EXT_transform_feedback")) {
diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
index bb76b44..4c3dd41 100644
--- a/src/vrend_renderer.h
+++ b/src/vrend_renderer.h
@@ -311,8 +311,8 @@ int vrend_create_query(struct vrend_context *ctx, uint32_t handle,
                        uint32_t query_type, uint32_t query_index,
                        uint32_t res_handle, uint32_t offset);
 
-void vrend_begin_query(struct vrend_context *ctx, uint32_t handle);
-void vrend_end_query(struct vrend_context *ctx, uint32_t handle);
+int vrend_begin_query(struct vrend_context *ctx, uint32_t handle);
+int vrend_end_query(struct vrend_context *ctx, uint32_t handle);
 void vrend_get_query_result(struct vrend_context *ctx, uint32_t handle,
                             uint32_t wait);
 void vrend_render_condition(struct vrend_context *ctx,
-- 
2.17.1



More information about the virglrenderer-devel mailing list