[virglrenderer-devel] [PATCH 08/21] features: add indirect draw feature.

Dave Airlie airlied at gmail.com
Tue Jul 24 03:39:00 UTC 2018


From: Dave Airlie <airlied at redhat.com>

Protect against indirect draws without the feature bit.
---
 src/vrend_renderer.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 587447e..41d00ab 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -101,6 +101,7 @@ enum features_id
    feat_gles_khr_robustness,
    feat_gles31_vertex_attrib_binding,
    feat_indep_blend,
+   feat_indirect_draw,
    feat_mesa_invert,
    feat_ms_scaled_blit,
    feat_multisample,
@@ -140,6 +141,7 @@ static const  struct {
    [feat_gles_khr_robustness] = { UNAVAIL, UNAVAIL, { "GL_KHR_robustness" } },
    [feat_gles31_vertex_attrib_binding] = { 43, 31, { "GL_ARB_vertex_attrib_binding" } },
    [feat_indep_blend] = { 30, UNAVAIL, { "GL_EXT_draw_buffers2" } },
+   [feat_indirect_draw] = { 40, UNAVAIL, { "GL_ARB_indirect_draw" } },
    [feat_mesa_invert] = { UNAVAIL, UNAVAIL, { "GL_MESA_pack_invert" } },
    [feat_ms_scaled_blit] = { UNAVAIL, UNAVAIL, { "GL_EXT_framebuffer_multisample_blit_scaled" } },
    [feat_multisample] = { 32, 30, { "GL_ARB_texture_multisample" } },
@@ -3353,6 +3355,8 @@ int vrend_draw_vbo(struct vrend_context *ctx,
       return EINVAL;
 
    if (indirect_handle) {
+      if (!has_feature(feat_indirect_draw))
+         return EINVAL;
       indirect_res = vrend_renderer_ctx_res_lookup(ctx, indirect_handle);
       if (!indirect_res) {
          report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_RESOURCE, indirect_handle);
@@ -3527,10 +3531,12 @@ int vrend_draw_vbo(struct vrend_context *ctx,
       }
    }
 
-   if (indirect_res)
-      glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirect_res->id);
-   else
-      glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
+   if (has_feature(feat_indirect_draw)) {
+      if (indirect_res)
+         glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirect_res->id);
+      else
+         glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
+   }
 
    if (info->vertices_per_patch && has_feature(feat_tessellation))
       glPatchParameteri(GL_PATCH_VERTICES, info->vertices_per_patch);
@@ -7624,11 +7630,12 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
    if (has_feature(feat_sample_shading))
       caps->v1.bset.has_sample_shading = 1;
 
+   if (has_feature(feat_indirect_draw))
+      caps->v1.bset.has_indirect_draw = 1;
    if (gl_ver >= 40) {
       caps->v1.bset.indep_blend_func = 1;
       caps->v1.bset.cube_map_array = 1;
       caps->v1.bset.texture_query_lod = 1;
-      caps->v1.bset.has_indirect_draw = 1;
       caps->v1.bset.has_fp64 = 1;
    } else {
       if (epoxy_has_gl_extension("GL_ARB_draw_buffers_blend"))
@@ -7637,8 +7644,6 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
          caps->v1.bset.cube_map_array = 1;
       if (epoxy_has_gl_extension("GL_ARB_texture_query_lod"))
          caps->v1.bset.texture_query_lod = 1;
-      if (epoxy_has_gl_extension("GL_ARB_indirect_draw"))
-         caps->v1.bset.has_indirect_draw = 1;
       /* need gpu shader 5 for bitfield insert */
       if (epoxy_has_gl_extension("GL_ARB_gpu_shader_fp64") &&
           epoxy_has_gl_extension("GL_ARB_gpu_shader5"))
-- 
2.17.1



More information about the virglrenderer-devel mailing list