[virglrenderer-devel] [PATCH] features: convert current feature list to an array
Dave Airlie
airlied at gmail.com
Mon Jul 23 11:02:31 UTC 2018
From: Dave Airlie <airlied at redhat.com>
Instead of having the features in separate named bool, convert it
to an array of bools indexed by an enum.
This is a straight mechanical patch, no code flows should change
and it doesn't change any functionality, it just refactors the
code to use the enum list and a bool array.
Future work should be a lot easier on this, so I'd like to
land it first.
---
src/vrend_renderer.c | 249 +++++++++++++++++++++++--------------------
1 file changed, 132 insertions(+), 117 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 13a61bb..e011815 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -87,6 +87,34 @@ struct global_error_state {
enum virgl_errors last_error;
};
+enum features_id
+{
+ FEAT_MESA_INVERT,
+ FEAT_SAMPLERS,
+ FEAT_GLES_KHR_ROBUSTNESS,
+ FEAT_ARB_ROBUSTNESS,
+ FEAT_ARB_OR_GLES_EXT_TEXTURE_BUFFER,
+ FEAT_MULTISAMPLE,
+ FEAT_MS_SCALED_BLIT,
+ FEAT_NV_PRIM_RESTART,
+ FEAT_GL_PRIM_RESTART,
+ FEAT_GL_CONDITIONAL_RENDER,
+ FEAT_NV_CONDITIONAL_RENDER,
+ FEAT_BIT_ENCODING,
+ FEAT_GLES31_VERTEX_ATTRIB_BINDING,
+ FEAT_TF2,
+ FEAT_STENCIL_TEXTURING,
+ FEAT_SAMPLE_SHADING,
+ FEAT_TEXTURE_BUFFER_RANGE,
+ FEAT_POLYGON_OFFSET_CLAMP,
+ FEAT_TEXTURE_STORAGE,
+ FEAT_TESSELLATION,
+ FEAT_TEXTURE_VIEW,
+ FEAT_COPY_IMAGE,
+ FEAT_SSBO,
+ FEAT_LAST,
+};
+
struct global_renderer_state {
int gl_major_ver;
int gl_minor_ver;
@@ -99,31 +127,8 @@ struct global_renderer_state {
bool use_gles;
bool use_core_profile;
+ bool features[FEAT_LAST];
bool have_debug_cb;
- bool have_mesa_invert;
- bool have_samplers;
- bool have_gles_khr_robustness;
- bool have_arb_robustness;
- bool have_arb_or_gles_ext_texture_buffer;
- bool have_multisample;
- bool have_ms_scaled_blit;
- bool have_nv_prim_restart;
- bool have_gl_prim_restart;
- bool have_gl_conditional_render;
- bool have_nv_conditional_render;
- bool have_bit_encoding;
- bool have_gles31_vertex_attrib_binding;
- bool have_tf2;
- bool have_stencil_texturing;
- bool have_sample_shading;
- bool have_texture_buffer_range;
- bool have_polygon_offset_clamp;
- bool have_texture_storage;
- bool have_tessellation;
- bool have_texture_view;
- bool have_copy_image;
- bool have_ssbo;
-
/* these appeared broken on at least one driver */
bool use_explicit_locations;
uint32_t max_uniform_blocks;
@@ -145,6 +150,16 @@ struct global_renderer_state {
static struct global_renderer_state vrend_state;
+static inline bool has_feature(enum features_id feature_id)
+{
+ return vrend_state.features[feature_id];
+}
+
+static inline void set_feature(enum features_id feature_id)
+{
+ vrend_state.features[feature_id] = true;
+}
+
struct vrend_linked_shader_program {
struct list_head head;
struct list_head sl[PIPE_SHADER_TYPES];
@@ -1072,7 +1087,7 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_conte
} else
sprog->dual_src_linked = false;
- if (vrend_state.have_gles31_vertex_attrib_binding) {
+ if (has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
uint32_t mask = vs->sel->sinfo.attrib_input_mask;
while (mask) {
i = u_bit_scan(&mask);
@@ -1135,7 +1150,7 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_conte
bind_ssbo_locs(sprog, id);
}
- if (!vrend_state.have_gles31_vertex_attrib_binding) {
+ if (!has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
if (vs->sel->sinfo.num_inputs) {
sprog->attrib_locs = calloc(vs->sel->sinfo.num_inputs, sizeof(uint32_t));
if (sprog->attrib_locs) {
@@ -1226,7 +1241,7 @@ static void vrend_destroy_streamout_object(struct vrend_streamout_object *obj)
list_del(&obj->head);
for (i = 0; i < obj->num_targets; i++)
vrend_so_target_reference(&obj->so_targets[i], NULL);
- if (vrend_state.have_tf2)
+ if (has_feature(FEAT_TF2))
glDeleteTransformFeedbacks(1, &obj->id);
FREE(obj);
}
@@ -1260,7 +1275,7 @@ int vrend_create_surface(struct vrend_context *ctx,
surf->val1 = val1;
surf->id = res->id;
- if (vrend_state.have_texture_view && !res->is_buffer) {
+ if (has_feature(FEAT_TEXTURE_VIEW) && !res->is_buffer) {
/* We don't need texture views for buffer objects.
* Otherwise we only need a texture view if the
* a) formats differ between the surface and base texture
@@ -1329,10 +1344,10 @@ static void vrend_destroy_so_target_object(void *obj_ptr)
if (obj == sub_ctx->current_so)
sub_ctx->current_so = NULL;
if (obj->xfb_state == XFB_STATE_PAUSED) {
- if (vrend_state.have_tf2)
+ if (has_feature(FEAT_TF2))
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, obj->id);
glEndTransformFeedback();
- if (sub_ctx->current_so && vrend_state.have_tf2)
+ if (sub_ctx->current_so && has_feature(FEAT_TF2))
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, sub_ctx->current_so->id);
}
vrend_destroy_streamout_object(obj);
@@ -1346,7 +1361,7 @@ static void vrend_destroy_vertex_elements_object(void *obj_ptr)
{
struct vrend_vertex_element_array *v = obj_ptr;
- if (vrend_state.have_gles31_vertex_attrib_binding) {
+ if (has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
glDeleteVertexArrays(1, &v->id);
}
FREE(v);
@@ -1356,7 +1371,7 @@ static void vrend_destroy_sampler_state_object(void *obj_ptr)
{
struct vrend_sampler_state *state = obj_ptr;
- if (vrend_state.have_samplers)
+ if (has_feature(FEAT_SAMPLERS))
glDeleteSamplers(1, &state->id);
FREE(state);
}
@@ -1418,7 +1433,7 @@ int vrend_create_sampler_state(struct vrend_context *ctx,
state->base = *templ;
- if (vrend_state.have_samplers) {
+ if (has_feature(FEAT_SAMPLERS)) {
glGenSamplers(1, &state->id);
glSamplerParameteri(state->id, GL_TEXTURE_WRAP_S, convert_wrap(templ->wrap_s));
@@ -1444,7 +1459,7 @@ int vrend_create_sampler_state(struct vrend_context *ctx,
ret_handle = vrend_renderer_object_insert(ctx, state, sizeof(struct vrend_sampler_state), handle,
VIRGL_OBJECT_SAMPLER_STATE);
if (!ret_handle) {
- if (vrend_state.have_samplers)
+ if (has_feature(FEAT_SAMPLERS))
glDeleteSamplers(1, &state->id);
FREE(state);
return ENOMEM;
@@ -1506,7 +1521,7 @@ int vrend_create_sampler_view(struct vrend_context *ctx,
if (!view->target)
view->target = view->texture->target;
- if (vrend_state.have_texture_view && !view->texture->is_buffer) {
+ if (has_feature(FEAT_TEXTURE_VIEW) && !view->texture->is_buffer) {
enum pipe_format format;
bool needs_view = false;
@@ -2003,7 +2018,7 @@ int vrend_create_vertex_elements_state(struct vrend_context *ctx,
v->elements[i].nr_chan = desc->nr_channels;
}
- if (vrend_state.have_gles31_vertex_attrib_binding) {
+ if (has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
glGenVertexArrays(1, &v->id);
glBindVertexArray(v->id);
for (i = 0; i < num_elements; i++) {
@@ -2208,7 +2223,7 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
view->depth_texture_mode = GL_RED;
}
}
- if (vrend_state.have_stencil_texturing) {
+ if (has_feature(FEAT_STENCIL_TEXTURING)) {
const struct util_format_description *desc = util_format_description(view->format);
if (!util_format_has_depth(desc)) {
glTexParameteri(view->texture->target, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
@@ -2243,7 +2258,7 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
view->cur_swizzle_a = view->gl_swizzle_a;
}
if (view->cur_srgb_decode != view->srgb_decode && util_format_is_srgb(view->format)) {
- if (vrend_state.have_samplers)
+ if (has_feature(FEAT_SAMPLERS))
ctx->sub->sampler_state_dirty = true;
else {
glTexParameteri(view->texture->target, GL_TEXTURE_SRGB_DECODE_EXT,
@@ -2259,7 +2274,7 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
glBindTexture(GL_TEXTURE_BUFFER, view->texture->tbo_tex_id);
internalformat = tex_conv_table[view->format].internalformat;
- if (vrend_state.have_texture_buffer_range) {
+ if (has_feature(FEAT_TEXTURE_BUFFER_RANGE)) {
unsigned offset = view->val0;
unsigned size = view->val1 - view->val0 + 1;
int blsize = util_format_get_blocksize(view->format);
@@ -2566,7 +2581,7 @@ int vrend_create_shader(struct vrend_context *ctx,
if (type > PIPE_SHADER_TESS_EVAL)
return EINVAL;
- if (!vrend_state.have_tessellation &&
+ if (!has_feature(FEAT_TESSELLATION) &&
(type == PIPE_SHADER_TESS_CTRL ||
type == PIPE_SHADER_TESS_EVAL))
return EINVAL;
@@ -2993,7 +3008,7 @@ static void vrend_draw_bind_vertex_legacy(struct vrend_context *ctx,
continue;
}
- if (vrend_state.use_explicit_locations || vrend_state.have_gles31_vertex_attrib_binding) {
+ if (vrend_state.use_explicit_locations || has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
loc = i;
} else {
if (ctx->sub->prog->attrib_locs) {
@@ -3390,7 +3405,7 @@ void vrend_draw_vbo(struct vrend_context *ctx,
}
}
- if (vrend_state.have_gles31_vertex_attrib_binding)
+ if (has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING))
vrend_draw_bind_vertex_binding(ctx, ctx->sub->ve);
else
vrend_draw_bind_vertex_legacy(ctx, ctx->sub->ve);
@@ -3430,10 +3445,10 @@ void vrend_draw_vbo(struct vrend_context *ctx,
if (info->primitive_restart) {
if (vrend_state.use_gles) {
glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
- } else if (vrend_state.have_nv_prim_restart) {
+ } else if (has_feature(FEAT_NV_PRIM_RESTART)) {
glEnableClientState(GL_PRIMITIVE_RESTART_NV);
glPrimitiveRestartIndexNV(info->restart_index);
- } else if (vrend_state.have_gl_prim_restart) {
+ } else if (has_feature(FEAT_GL_PRIM_RESTART)) {
glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(info->restart_index);
}
@@ -3444,7 +3459,7 @@ void vrend_draw_vbo(struct vrend_context *ctx,
else
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
- if (info->vertices_per_patch && vrend_state.have_tessellation)
+ if (info->vertices_per_patch && has_feature(FEAT_TESSELLATION))
glPatchParameteri(GL_PATCH_VERTICES, info->vertices_per_patch);
/* set the vertex state up now on a delay */
@@ -3497,14 +3512,14 @@ void vrend_draw_vbo(struct vrend_context *ctx,
if (info->primitive_restart) {
if (vrend_state.use_gles) {
glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
- } else if (vrend_state.have_nv_prim_restart) {
+ } else if (has_feature(FEAT_NV_PRIM_RESTART)) {
glDisableClientState(GL_PRIMITIVE_RESTART_NV);
- } else if (vrend_state.have_gl_prim_restart) {
+ } else if (has_feature(FEAT_GL_PRIM_RESTART)) {
glDisable(GL_PRIMITIVE_RESTART);
}
}
- if (ctx->sub->current_so && vrend_state.have_tf2) {
+ if (ctx->sub->current_so && has_feature(FEAT_TF2)) {
if (ctx->sub->current_so->xfb_state == XFB_STATE_STARTED) {
glPauseTransformFeedback();
ctx->sub->current_so->xfb_state = XFB_STATE_PAUSED;
@@ -3708,7 +3723,7 @@ static void vrend_hw_emit_blend(struct vrend_context *ctx, struct pipe_blend_sta
}
ctx->sub->hw_blend_state.independent_blend_enable = state->independent_blend_enable;
- if (vrend_state.have_multisample) {
+ if (has_feature(FEAT_MULTISAMPLE)) {
if (state->alpha_to_coverage)
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
else
@@ -4039,7 +4054,7 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
}
}
- if (!vrend_state.use_gles && vrend_state.have_polygon_offset_clamp)
+ if (!vrend_state.use_gles && has_feature(FEAT_POLYGON_OFFSET_CLAMP))
glPolygonOffsetClampEXT(state->offset_scale, state->offset_units, state->offset_clamp);
else
glPolygonOffset(state->offset_scale, state->offset_units);
@@ -4154,7 +4169,7 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
report_core_warn(ctx, CORE_PROFILE_WARN_CLAMP, 0);
}
- if (vrend_state.have_multisample) {
+ if (has_feature(FEAT_MULTISAMPLE)) {
if (state->multisample)
glEnable(GL_SAMPLE_MASK);
else
@@ -4168,7 +4183,7 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
glDisable(GL_MULTISAMPLE);
}
- if (vrend_state.have_sample_shading) {
+ if (has_feature(FEAT_SAMPLE_SHADING)) {
if (state->force_persample_interp)
glEnable(GL_SAMPLE_SHADING);
else
@@ -4265,7 +4280,7 @@ static void vrend_apply_sampler_state(struct vrend_context *ctx,
* the sampler to use the red channel and not the alpha one
* by swizzling the GL_TEXTURE_BORDER_COLOR parameter.
*/
- if (vrend_state.have_samplers) {
+ if (has_feature(FEAT_SAMPLERS)) {
if (vrend_format_is_emulated_alpha(res->base.format)) {
union pipe_color_union border_color;
border_color = vstate->base.border_color;
@@ -4582,79 +4597,79 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags)
glGetIntegerv(GL_MAX_DRAW_BUFFERS, (GLint *) &vrend_state.max_draw_buffers);
if (epoxy_has_gl_extension("GL_ARB_robustness")) {
- vrend_state.have_arb_robustness = true;
+ set_feature(FEAT_ARB_ROBUSTNESS);
} else if (gles && epoxy_has_gl_extension("GL_KHR_robustness")) {
- vrend_state.have_gles_khr_robustness = true;
+ set_feature(FEAT_GLES_KHR_ROBUSTNESS);
} else {
fprintf(stderr,"WARNING: running without ARB/KHR robustness in place may crash\n");
}
/* used for buffers that we want to texture from */
if (epoxy_has_gl_extension("GL_ARB_texture_buffer_object")) {
- vrend_state.have_arb_or_gles_ext_texture_buffer = true;
+ set_feature(FEAT_ARB_OR_GLES_EXT_TEXTURE_BUFFER);
}
if (gles && epoxy_has_gl_extension("GL_EXT_texture_buffer")) {
- vrend_state.have_arb_or_gles_ext_texture_buffer = true;
+ set_feature(FEAT_ARB_OR_GLES_EXT_TEXTURE_BUFFER);
}
if (epoxy_has_gl_extension("GL_MESA_pack_invert"))
- vrend_state.have_mesa_invert = true;
+ set_feature(FEAT_MESA_INVERT);
if (gl_ver >= 43 || (gles && gl_ver >= 31) ||
epoxy_has_gl_extension("GL_ARB_vertex_attrib_binding"))
- vrend_state.have_gles31_vertex_attrib_binding = true;
+ set_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING);
if (gl_ver >= 33 || epoxy_has_gl_extension("GL_ARB_sampler_objects"))
- vrend_state.have_samplers = true;
+ set_feature(FEAT_SAMPLERS);
if (gl_ver >= 33 || epoxy_has_gl_extension("GL_ARB_shader_bit_encoding"))
- vrend_state.have_bit_encoding = true;
+ set_feature(FEAT_BIT_ENCODING);
if (!gles && gl_ver >= 31)
- vrend_state.have_gl_prim_restart = true;
+ set_feature(FEAT_GL_PRIM_RESTART);
else if (epoxy_has_gl_extension("GL_NV_primitive_restart"))
- vrend_state.have_nv_prim_restart = true;
+ set_feature(FEAT_NV_PRIM_RESTART);
if (!gles && gl_ver >= 30)
- vrend_state.have_gl_conditional_render = true;
+ set_feature(FEAT_GL_CONDITIONAL_RENDER);
else if (epoxy_has_gl_extension("GL_NV_conditional_render"))
- vrend_state.have_nv_conditional_render = true;
+ set_feature(FEAT_NV_CONDITIONAL_RENDER);
if (gl_ver >= 40 || (gles && gl_ver >= 30) ||
epoxy_has_gl_extension("GL_ARB_transform_feedback2")) {
- vrend_state.have_tf2 = true;
+ set_feature(FEAT_TF2);
}
if (epoxy_has_gl_extension("GL_ARB_stencil_texturing"))
- vrend_state.have_stencil_texturing = true;
+ set_feature(FEAT_STENCIL_TEXTURING);
if ((gles && gl_ver >= 30) ||
(epoxy_has_gl_extension("GL_EXT_framebuffer_multisample") &&
epoxy_has_gl_extension("GL_ARB_texture_multisample"))) {
- vrend_state.have_multisample = true;
+ set_feature(FEAT_MULTISAMPLE);
if (epoxy_has_gl_extension("GL_EXT_framebuffer_multisample_blit_scaled"))
- vrend_state.have_ms_scaled_blit = true;
+ set_feature(FEAT_MS_SCALED_BLIT);
}
if (gl_ver >= 40 || epoxy_has_gl_extension("GL_ARB_sample_shading"))
- vrend_state.have_sample_shading = true;
+ set_feature(FEAT_SAMPLE_SHADING);
if (gl_ver >= 40 || epoxy_has_gl_extension("GL_ARB_tessellation_shader"))
- vrend_state.have_tessellation = true;
+ set_feature(FEAT_TESSELLATION);
if (gl_ver >= 43 || epoxy_has_gl_extension("GL_ARB_texture_buffer_range"))
- vrend_state.have_texture_buffer_range = true;
+ set_feature(FEAT_TEXTURE_BUFFER_RANGE);
if (gl_ver >= 42 || epoxy_has_gl_extension("GL_ARB_texture_storage"))
- vrend_state.have_texture_storage = true;
+ set_feature(FEAT_TEXTURE_STORAGE);
if (gl_ver >= 43 || epoxy_has_gl_extension("GL_ARB_texture_view"))
- vrend_state.have_texture_view = true;
+ set_feature(FEAT_TEXTURE_VIEW);
if (gl_ver >= 43 || epoxy_has_gl_extension("GL_ARB_shader_storage_buffer_object"))
- vrend_state.have_ssbo = true;
+ set_feature(FEAT_SSBO);
if (gl_ver >= 46 || epoxy_has_gl_extension("GL_ARB_polygon_offset_clamp"))
- vrend_state.have_polygon_offset_clamp = true;
+ set_feature(FEAT_POLYGON_OFFSET_CLAMP);
if (gl_ver >= 43 || (gles && gl_ver >= 32) ||
epoxy_has_gl_extension("GL_ARB_copy_image") ||
epoxy_has_gl_extension("GL_EXT_copy_image") ||
epoxy_has_gl_extension("GL_OES_copy_image"))
- vrend_state.have_copy_image = true;
+ set_feature(FEAT_COPY_IMAGE);
/* callbacks for when we are cleaning up the object table */
vrend_resource_set_destroy_callback(vrend_destroy_resource_object);
@@ -4734,7 +4749,7 @@ static void vrend_destroy_sub_context(struct vrend_sub_context *sub)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- if (!vrend_state.have_gles31_vertex_attrib_binding) {
+ if (!has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
while (sub->enabled_attribs_bitmask) {
i = u_bit_scan(&sub->enabled_attribs_bitmask);
@@ -5061,7 +5076,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
return EINVAL;
}
} else if (pr->nr_samples > 1) {
- if (vrend_state.use_gles || vrend_state.have_texture_storage) {
+ if (vrend_state.use_gles || has_feature(FEAT_TEXTURE_STORAGE)) {
if (gr->target == GL_TEXTURE_2D_MULTISAMPLE) {
glTexStorage2DMultisample(gr->target, pr->nr_samples,
internalformat, pr->width0, pr->height0,
@@ -5084,7 +5099,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
}
} else if (gr->target == GL_TEXTURE_CUBE_MAP) {
int i;
- if (vrend_state.have_texture_storage)
+ if (has_feature(FEAT_TEXTURE_STORAGE))
glTexStorage2D(GL_TEXTURE_CUBE_MAP, pr->last_level + 1, internalformat, pr->width0, pr->height0);
else {
for (i = 0; i < 6; i++) {
@@ -5101,7 +5116,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
} else if (gr->target == GL_TEXTURE_3D ||
gr->target == GL_TEXTURE_2D_ARRAY ||
gr->target == GL_TEXTURE_CUBE_MAP_ARRAY) {
- if (vrend_state.have_texture_storage) {
+ if (has_feature(FEAT_TEXTURE_STORAGE)) {
unsigned depth_param = (gr->target == GL_TEXTURE_2D_ARRAY || gr->target == GL_TEXTURE_CUBE_MAP_ARRAY) ?
pr->array_size : pr->depth0;
glTexStorage3D(gr->target, pr->last_level + 1, internalformat, pr->width0, pr->height0, depth_param);
@@ -5118,7 +5133,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
} else if (gr->target == GL_TEXTURE_1D && vrend_state.use_gles) {
report_gles_missing_func(NULL, "glTexImage1D");
} else if (gr->target == GL_TEXTURE_1D) {
- if (vrend_state.have_texture_storage) {
+ if (has_feature(FEAT_TEXTURE_STORAGE)) {
glTexStorage1D(gr->target, pr->last_level + 1, internalformat, pr->width0);
} else {
for (level = 0; level <= pr->last_level; level++) {
@@ -5128,7 +5143,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
}
}
} else {
- if (vrend_state.have_texture_storage)
+ if (has_feature(FEAT_TEXTURE_STORAGE))
glTexStorage2D(gr->target, pr->last_level + 1, internalformat, pr->width0,
gr->target == GL_TEXTURE_1D_ARRAY ? pr->array_size : pr->height0);
else {
@@ -5142,7 +5157,7 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
}
}
- if (!vrend_state.have_texture_storage) {
+ if (!has_feature(FEAT_TEXTURE_STORAGE)) {
glTexParameteri(gr->target, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(gr->target, GL_TEXTURE_MAX_LEVEL, pr->last_level);
}
@@ -5205,7 +5220,7 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a
#endif
/* need to check GL version here */
- if (vrend_state.have_arb_or_gles_ext_texture_buffer) {
+ if (has_feature(FEAT_ARB_OR_GLES_EXT_TEXTURE_BUFFER)) {
gr->target = GL_TEXTURE_BUFFER;
} else {
gr->target = GL_PIXEL_PACK_BUFFER_ARB;
@@ -5776,7 +5791,7 @@ static int vrend_transfer_send_getteximage(struct vrend_context *ctx,
target = res->target;
if (compressed) {
- if (vrend_state.have_arb_robustness) {
+ if (has_feature(FEAT_ARB_ROBUSTNESS)) {
glGetnCompressedTexImageARB(target, info->level, tex_size, data);
} else if (vrend_state.use_gles) {
report_gles_missing_func(ctx, "glGetCompressedTexImage");
@@ -5784,7 +5799,7 @@ static int vrend_transfer_send_getteximage(struct vrend_context *ctx,
glGetCompressedTexImage(target, info->level, data);
}
} else {
- if (vrend_state.have_arb_robustness) {
+ if (has_feature(FEAT_ARB_ROBUSTNESS)) {
glGetnTexImageARB(target, info->level, format, type, tex_size, data);
} else if (vrend_state.use_gles) {
report_gles_missing_func(ctx, "glGetTexImage");
@@ -5827,7 +5842,7 @@ static int vrend_transfer_send_readpixels(struct vrend_context *ctx,
actually_invert = res->y_0_top;
- if (actually_invert && !vrend_state.have_mesa_invert)
+ if (actually_invert && !has_feature(FEAT_MESA_INVERT))
separate_invert = true;
if (num_iovs > 1 || separate_invert)
@@ -5866,7 +5881,7 @@ static int vrend_transfer_send_readpixels(struct vrend_context *ctx,
else
y1 = info->box->y;
- if (vrend_state.have_mesa_invert && actually_invert)
+ if (has_feature(FEAT_MESA_INVERT) && actually_invert)
glPixelStorei(GL_PACK_INVERT_MESA, 1);
if (!vrend_format_is_ds(res->base.format))
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
@@ -5927,9 +5942,9 @@ static int vrend_transfer_send_readpixels(struct vrend_context *ctx,
}
}
- if (vrend_state.have_arb_robustness)
+ if (has_feature(FEAT_ARB_ROBUSTNESS))
glReadnPixelsARB(info->box->x, y1, info->box->width, info->box->height, format, type, send_size, data);
- else if (vrend_state.have_gles_khr_robustness)
+ else if (has_feature(FEAT_GLES_KHR_ROBUSTNESS))
glReadnPixelsKHR(info->box->x, y1, info->box->width, info->box->height, format, type, send_size, data);
else
glReadPixels(info->box->x, y1, info->box->width, info->box->height, format, type, data);
@@ -5940,7 +5955,7 @@ static int vrend_transfer_send_readpixels(struct vrend_context *ctx,
else
vrend_scale_depth(data, send_size, depth_scale);
}
- if (vrend_state.have_mesa_invert && actually_invert)
+ if (has_feature(FEAT_MESA_INVERT) && actually_invert)
glPixelStorei(GL_PACK_INVERT_MESA, 0);
if (!need_temp && info->stride)
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
@@ -6217,13 +6232,13 @@ void vrend_set_min_samples(struct vrend_context *ctx, unsigned min_samples)
min_sample_shading /= MAX2(1, ctx->sub->surf[0]->texture->base.nr_samples);
}
- if (vrend_state.have_sample_shading)
+ if (has_feature(FEAT_SAMPLE_SHADING))
glMinSampleShading(min_sample_shading);
}
void vrend_set_tess_state(UNUSED struct vrend_context *ctx, const float tess_factors[6])
{
- if (vrend_state.have_tessellation) {
+ if (has_feature(FEAT_TESSELLATION)) {
glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, tess_factors);
glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, &tess_factors[4]);
}
@@ -6267,7 +6282,7 @@ void vrend_set_streamout_targets(struct vrend_context *ctx,
}
obj = CALLOC_STRUCT(vrend_streamout_object);
- if (vrend_state.have_tf2) {
+ if (has_feature(FEAT_TF2)) {
glGenTransformFeedbacks(1, &obj->id);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, obj->id);
}
@@ -6287,7 +6302,7 @@ void vrend_set_streamout_targets(struct vrend_context *ctx,
ctx->sub->current_so = obj;
obj->xfb_state = XFB_STATE_STARTED_NEED_BEGIN;
} else {
- if (vrend_state.have_tf2)
+ if (has_feature(FEAT_TF2))
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
ctx->sub->current_so = NULL;
}
@@ -6403,12 +6418,12 @@ static void vrend_resource_copy_fallback(struct vrend_resource *src_res,
GLenum ctarget = src_res->target == GL_TEXTURE_CUBE_MAP ?
(GLenum)(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) : src_res->target;
if (compressed) {
- if (vrend_state.have_arb_robustness)
+ if (has_feature(FEAT_ARB_ROBUSTNESS))
glGetnCompressedTexImageARB(ctarget, src_level, read_chunk_size, tptr + slice_offset);
else
glGetCompressedTexImage(ctarget, src_level, tptr + slice_offset);
} else {
- if (vrend_state.have_arb_robustness)
+ if (has_feature(FEAT_ARB_ROBUSTNESS))
glGetnTexImageARB(ctarget, src_level, glformat, gltype, read_chunk_size, tptr + slice_offset);
else
glGetTexImage(ctarget, src_level, glformat, gltype, tptr + slice_offset);
@@ -6519,7 +6534,7 @@ void vrend_renderer_resource_copy_region(struct vrend_context *ctx,
return;
}
- if (vrend_state.have_copy_image) {
+ if (has_feature(FEAT_COPY_IMAGE)) {
if (format_is_copy_compatible(src_res->base.format,dst_res->base.format) &&
src_res->base.nr_samples == dst_res->base.nr_samples) {
vrend_copy_sub_image(src_res, dst_res, src_level, src_box,
@@ -6627,7 +6642,7 @@ static void vrend_renderer_blit_int(struct vrend_context *ctx,
src_res->base.nr_samples != dst_res->base.nr_samples &&
(info->src.box.width != info->dst.box.width ||
info->src.box.height != info->dst.box.height)) {
- if (vrend_state.have_ms_scaled_blit)
+ if (has_feature(FEAT_MS_SCALED_BLIT))
filter = GL_SCALED_RESOLVE_NICEST_EXT;
else
use_gl = true;
@@ -6808,7 +6823,7 @@ void vrend_renderer_blit(struct vrend_context *ctx,
* glCopyImageSubData. For the latter case forward the call to the
* glCopyImageSubData function, otherwise use a framebuffer blit.
*/
- if (vrend_state.have_copy_image && !info->render_condition_enable &&
+ if (has_feature(FEAT_COPY_IMAGE) && !info->render_condition_enable &&
format_is_copy_compatible(info->src.format,info->dst.format) &&
!info->scissor_enable && (info->filter == PIPE_TEX_FILTER_NEAREST) &&
!info->alpha_blend && (info->mask == PIPE_MASK_RGBA) &&
@@ -7151,17 +7166,17 @@ static void vrend_pause_render_condition(struct vrend_context *ctx, bool pause)
{
if (pause) {
if (ctx->sub->cond_render_q_id) {
- if (vrend_state.have_gl_conditional_render)
+ if (has_feature(FEAT_GL_CONDITIONAL_RENDER))
glEndConditionalRender();
- else if (vrend_state.have_nv_conditional_render)
+ else if (has_feature(FEAT_NV_CONDITIONAL_RENDER))
glEndConditionalRenderNV();
}
} else {
if (ctx->sub->cond_render_q_id) {
- if (vrend_state.have_gl_conditional_render)
+ if (has_feature(FEAT_GL_CONDITIONAL_RENDER))
glBeginConditionalRender(ctx->sub->cond_render_q_id,
ctx->sub->cond_render_gl_mode);
- else if (vrend_state.have_nv_conditional_render)
+ else if (has_feature(FEAT_NV_CONDITIONAL_RENDER))
glBeginConditionalRenderNV(ctx->sub->cond_render_q_id,
ctx->sub->cond_render_gl_mode);
}
@@ -7177,9 +7192,9 @@ void vrend_render_condition(struct vrend_context *ctx,
GLenum glmode = 0;
if (handle == 0) {
- if (vrend_state.have_gl_conditional_render)
+ if (has_feature(FEAT_GL_CONDITIONAL_RENDER))
glEndConditionalRender();
- else if (vrend_state.have_nv_conditional_render)
+ else if (has_feature(FEAT_NV_CONDITIONAL_RENDER))
glEndConditionalRenderNV();
ctx->sub->cond_render_q_id = 0;
ctx->sub->cond_render_gl_mode = 0;
@@ -7209,9 +7224,9 @@ void vrend_render_condition(struct vrend_context *ctx,
ctx->sub->cond_render_q_id = q->id;
ctx->sub->cond_render_gl_mode = glmode;
- if (vrend_state.have_gl_conditional_render)
+ if (has_feature(FEAT_GL_CONDITIONAL_RENDER))
glBeginConditionalRender(q->id, glmode);
- if (vrend_state.have_nv_conditional_render)
+ if (has_feature(FEAT_NV_CONDITIONAL_RENDER))
glBeginConditionalRenderNV(q->id, glmode);
}
@@ -7383,8 +7398,8 @@ static bool vrend_renderer_fill_caps_common(uint32_t set, UNUSED uint32_t versio
/* These are filled in by the init code, so are common. */
- if (vrend_state.have_nv_prim_restart ||
- vrend_state.have_gl_prim_restart) {
+ if (has_feature(FEAT_NV_PRIM_RESTART) ||
+ has_feature(FEAT_GL_PRIM_RESTART)) {
caps->v1.bset.primitive_restart = 1;
}
@@ -7514,7 +7529,7 @@ static void vrend_renderer_fill_caps_gles(uint32_t set, UNUSED uint32_t version,
caps->v1.max_samples = vrend_renderer_query_multisample_caps(max, &caps->v2);
- if (vrend_state.have_copy_image)
+ if (has_feature(FEAT_COPY_IMAGE))
caps->v2.capability_bits |= VIRGL_CAP_COPY_IMAGE;
}
@@ -7763,7 +7778,7 @@ void vrend_renderer_fill_caps(uint32_t set, uint32_t version,
if (gl_ver >= 43 || epoxy_has_gl_extension("GL_ARB_texture_view"))
caps->v2.capability_bits |= VIRGL_CAP_TEXTURE_VIEW;
- if (vrend_state.have_copy_image)
+ if (has_feature(FEAT_COPY_IMAGE))
caps->v2.capability_bits |= VIRGL_CAP_COPY_IMAGE;
}
@@ -7810,7 +7825,7 @@ void *vrend_renderer_get_cursor_contents(uint32_t res_handle, uint32_t *width, u
return NULL;
}
- if (vrend_state.have_arb_robustness) {
+ if (has_feature(FEAT_ARB_ROBUSTNESS)) {
glBindTexture(res->target, res->id);
glGetnTexImageARB(res->target, 0, format, type, size, data);
} else if (vrend_state.use_gles) {
@@ -7833,9 +7848,9 @@ void *vrend_renderer_get_cursor_contents(uint32_t res_handle, uint32_t *width, u
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, res->readback_fb_id);
}
- if (vrend_state.have_arb_robustness) {
+ if (has_feature(FEAT_ARB_ROBUSTNESS)) {
glReadnPixelsARB(0, 0, *width, *height, format, type, size, data);
- } else if (vrend_state.have_gles_khr_robustness) {
+ } else if (has_feature(FEAT_GLES_KHR_ROBUSTNESS)) {
glReadnPixelsKHR(0, 0, *width, *height, format, type, size, data);
} else {
glReadPixels(0, 0, *width, *height, format, type, data);
@@ -8016,7 +8031,7 @@ void vrend_renderer_create_sub_ctx(struct vrend_context *ctx, int sub_ctx_id)
sub->vps[i].far_val = 1.0;
}
- if (!vrend_state.have_gles31_vertex_attrib_binding) {
+ if (!has_feature(FEAT_GLES31_VERTEX_ATTRIB_BINDING)) {
glGenVertexArrays(1, &sub->vaoid);
glBindVertexArray(sub->vaoid);
}
--
2.17.1
More information about the virglrenderer-devel
mailing list