mesa/get: allow image/buffer/atomic variables to be fetched in es3.1

Right now these rely on the desktop extension enables being set. However
some drivers may not be able to support that full functionality. Allow
presence of ES 3.1 to be sufficient.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10569>
This commit is contained in:
Ilia Mirkin
2021-05-01 23:29:00 -04:00
parent a5379ef4a7
commit 08fe7d72d1
4 changed files with 40 additions and 29 deletions

View File

@@ -180,12 +180,12 @@ get_buffer_target(struct gl_context *ctx, GLenum target)
}
break;
case GL_SHADER_STORAGE_BUFFER:
if (ctx->Extensions.ARB_shader_storage_buffer_object) {
if (ctx->Extensions.ARB_shader_storage_buffer_object || _mesa_is_gles31(ctx)) {
return &ctx->ShaderStorageBuffer;
}
break;
case GL_ATOMIC_COUNTER_BUFFER:
if (ctx->Extensions.ARB_shader_atomic_counters) {
if (ctx->Extensions.ARB_shader_atomic_counters || _mesa_is_gles31(ctx)) {
return &ctx->AtomicBuffer;
}
break;

View File

@@ -407,6 +407,12 @@ static const int extra_ARB_shader_atomic_counters_and_geometry_shader[] = {
EXTRA_END
};
static const int extra_ARB_shader_atomic_counters_es31[] = {
EXT(ARB_shader_atomic_counters),
EXTRA_API_ES31,
EXTRA_END
};
static const int extra_ARB_shader_image_load_store_and_geometry_shader[] = {
EXTRA_EXT_SHADER_IMAGE_GS,
EXTRA_END
@@ -422,6 +428,12 @@ static const int extra_ARB_shader_image_load_store_and_tessellation[] = {
EXTRA_END
};
static const int extra_ARB_shader_image_load_store_es31[] = {
EXT(ARB_shader_image_load_store),
EXTRA_API_ES31,
EXTRA_END
};
/* HACK: remove when ARB_compute_shader is actually supported */
static const int extra_ARB_compute_shader_es31[] = {
EXT(ARB_compute_shader),
@@ -527,7 +539,6 @@ EXTRA_EXT2(ARB_texture_cube_map_array, OES_texture_cube_map_array);
EXTRA_EXT(ARB_texture_buffer_range);
EXTRA_EXT(ARB_texture_multisample);
EXTRA_EXT(ARB_texture_gather);
EXTRA_EXT(ARB_shader_atomic_counters);
EXTRA_EXT(ARB_draw_indirect);
EXTRA_EXT(ARB_shader_image_load_store);
EXTRA_EXT(ARB_query_buffer_object);
@@ -2617,7 +2628,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
/* ARB_shader_storage_buffer_object */
case GL_SHADER_STORAGE_BUFFER_BINDING:
if (!ctx->Extensions.ARB_shader_storage_buffer_object)
if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxShaderStorageBufferBindings)
goto invalid_value;
@@ -2626,7 +2637,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_SHADER_STORAGE_BUFFER_START:
if (!ctx->Extensions.ARB_shader_storage_buffer_object)
if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxShaderStorageBufferBindings)
goto invalid_value;
@@ -2635,7 +2646,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_SHADER_STORAGE_BUFFER_SIZE:
if (!ctx->Extensions.ARB_shader_storage_buffer_object)
if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxShaderStorageBufferBindings)
goto invalid_value;
@@ -2653,7 +2664,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_ATOMIC_COUNTER_BUFFER_BINDING:
if (!ctx->Extensions.ARB_shader_atomic_counters)
if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxAtomicBufferBindings)
goto invalid_value;
@@ -2662,7 +2673,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_ATOMIC_COUNTER_BUFFER_START:
if (!ctx->Extensions.ARB_shader_atomic_counters)
if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxAtomicBufferBindings)
goto invalid_value;
@@ -2671,7 +2682,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT64;
case GL_ATOMIC_COUNTER_BUFFER_SIZE:
if (!ctx->Extensions.ARB_shader_atomic_counters)
if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxAtomicBufferBindings)
goto invalid_value;
@@ -2717,7 +2728,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
case GL_IMAGE_BINDING_NAME: {
struct gl_texture_object *t;
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;
@@ -2728,7 +2739,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
}
case GL_IMAGE_BINDING_LEVEL:
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;
@@ -2737,7 +2748,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_IMAGE_BINDING_LAYERED:
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;
@@ -2746,7 +2757,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_IMAGE_BINDING_LAYER:
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;
@@ -2755,7 +2766,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_IMAGE_BINDING_ACCESS:
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;
@@ -2764,7 +2775,7 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
return TYPE_INT;
case GL_IMAGE_BINDING_FORMAT:
if (!ctx->Extensions.ARB_shader_image_load_store)
if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
goto invalid_enum;
if (index >= ctx->Const.MaxImageUnits)
goto invalid_value;

View File

@@ -505,21 +505,21 @@ descriptor=[
[ "TEXTURE_BUFFER_OFFSET_ALIGNMENT", "CONTEXT_INT(Const.TextureBufferOffsetAlignment), extra_ARB_texture_buffer_range" ],
# GL_ARB_shader_image_load_store / GLES 3.1
[ "MAX_IMAGE_UNITS", "CONTEXT_INT(Const.MaxImageUnits), extra_ARB_shader_image_load_store" ],
[ "MAX_VERTEX_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms), extra_ARB_shader_image_load_store" ],
[ "MAX_FRAGMENT_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms), extra_ARB_shader_image_load_store" ],
[ "MAX_COMBINED_IMAGE_UNIFORMS", "CONTEXT_INT(Const.MaxCombinedImageUniforms), extra_ARB_shader_image_load_store" ],
[ "MAX_IMAGE_UNITS", "CONTEXT_INT(Const.MaxImageUnits), extra_ARB_shader_image_load_store_es31" ],
[ "MAX_VERTEX_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms), extra_ARB_shader_image_load_store_es31" ],
[ "MAX_FRAGMENT_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms), extra_ARB_shader_image_load_store_es31" ],
[ "MAX_COMBINED_IMAGE_UNIFORMS", "CONTEXT_INT(Const.MaxCombinedImageUniforms), extra_ARB_shader_image_load_store_es31" ],
# GL_ARB_shader_atomic_counters / GLES 3.1
[ "ATOMIC_COUNTER_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_shader_atomic_counters" ],
[ "MAX_ATOMIC_COUNTER_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxAtomicBufferBindings), extra_ARB_shader_atomic_counters" ],
[ "MAX_ATOMIC_COUNTER_BUFFER_SIZE", "CONTEXT_INT(Const.MaxAtomicBufferSize), extra_ARB_shader_atomic_counters" ],
[ "MAX_VERTEX_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers), extra_ARB_shader_atomic_counters" ],
[ "MAX_VERTEX_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters), extra_ARB_shader_atomic_counters" ],
[ "MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers), extra_ARB_shader_atomic_counters" ],
[ "MAX_FRAGMENT_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters), extra_ARB_shader_atomic_counters" ],
[ "MAX_COMBINED_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.MaxCombinedAtomicBuffers), extra_ARB_shader_atomic_counters" ],
[ "MAX_COMBINED_ATOMIC_COUNTERS", "CONTEXT_INT(Const.MaxCombinedAtomicCounters), extra_ARB_shader_atomic_counters" ],
[ "ATOMIC_COUNTER_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_ATOMIC_COUNTER_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxAtomicBufferBindings), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_ATOMIC_COUNTER_BUFFER_SIZE", "CONTEXT_INT(Const.MaxAtomicBufferSize), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_VERTEX_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_VERTEX_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_FRAGMENT_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_COMBINED_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.MaxCombinedAtomicBuffers), extra_ARB_shader_atomic_counters_es31" ],
[ "MAX_COMBINED_ATOMIC_COUNTERS", "CONTEXT_INT(Const.MaxCombinedAtomicCounters), extra_ARB_shader_atomic_counters_es31" ],
# GL_ARB_texture_multisample / GLES 3.1
[ "TEXTURE_BINDING_2D_MULTISAMPLE", "LOC_CUSTOM, TYPE_INT, TEXTURE_2D_MULTISAMPLE_INDEX, extra_ARB_texture_multisample" ],

View File

@@ -914,7 +914,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
}
return;
case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
if (!ctx->Extensions.ARB_shader_atomic_counters)
if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
break;
*params = shProg->data->NumAtomicBuffers;