[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