[Mesa-dev] [PATCH 4/7] glsl: add core plumbing for GL_ANDROID_extension_pack_es31a
Ilia Mirkin
imirkin at alum.mit.edu
Thu Sep 1 02:59:10 UTC 2016
On Wed, Aug 31, 2016 at 10:28 PM, Ian Romanick <idr at freedesktop.org> wrote:
> I'm not sure how I feel about this change. I had also been thinking
> about adding AEP support after the rest of 3.2 was complete. I had
> imagined that adding it would look something like adding code to
> _mesa_glsl_process_extension that would call
> _mesa_glsl_process_extension for each of the extensions implicitly
> enabled by '#extension GL_ANDROID_extension_pack_es31a'. One nice
> feature of that is you could add a spec quote that would have prevented
> Matt's comments. :)
>
> Did you try or think about that approach? It's possible there's some
> fatal flaw that I didn't think about...
I believe the source of Matt's confusion was extension enablement in
the exposed GL string vs which extensions are enabled in a particular
GLSL shader compile. What I'm doing is roughly equivalent to calling
_mesa_glsl_process_extension for each one, but I end up short-cutting
it a bit. I avoid all the double-parsing, etc.
We have a ton of extensions that have various dependencies on other
extensions. We could consider a system for expressing these, similar
to how GL versions are determined, but I think that should be a
separate change. Also it'd be wholly unrelated to the logic in
glsl_parser_extras.cpp.
Cheers,
-ilia
>
> On 08/28/2016 07:10 PM, Ilia Mirkin wrote:
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> src/compiler/glsl/glsl_parser_extras.cpp | 57 +++++++++++++++++++++++---------
>> src/compiler/glsl/glsl_parser_extras.h | 2 ++
>> src/mesa/main/extensions_table.h | 2 ++
>> src/mesa/main/mtypes.h | 1 +
>> 4 files changed, 46 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
>> index b33cd3a..a44f014 100644
>> --- a/src/compiler/glsl/glsl_parser_extras.cpp
>> +++ b/src/compiler/glsl/glsl_parser_extras.cpp
>> @@ -523,6 +523,11 @@ struct _mesa_glsl_extension {
>> const char *name;
>>
>> /**
>> + * Whether this extension is a part of AEP
>> + */
>> + bool aep;
>> +
>> + /**
>> * Predicate that checks whether the relevant extension is available for
>> * this context.
>> */
>> @@ -565,9 +570,14 @@ has_##name_str(const struct gl_context *ctx, gl_api api, uint8_t version) \
>> #undef EXT
>>
>> #define EXT(NAME) \
>> - { "GL_" #NAME, has_##NAME, \
>> - &_mesa_glsl_parse_state::NAME##_enable, \
>> - &_mesa_glsl_parse_state::NAME##_warn }
>> + { "GL_" #NAME, false, has_##NAME, \
>> + &_mesa_glsl_parse_state::NAME##_enable, \
>> + &_mesa_glsl_parse_state::NAME##_warn }
>> +
>> +#define EXT_AEP(NAME) \
>> + { "GL_" #NAME, true, has_##NAME, \
>> + &_mesa_glsl_parse_state::NAME##_enable, \
>> + &_mesa_glsl_parse_state::NAME##_warn }
>>
>> /**
>> * Table of extensions that can be enabled/disabled within a shader,
>> @@ -623,7 +633,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>>
>> /* KHR extensions go here, sorted alphabetically.
>> */
>> - EXT(KHR_blend_equation_advanced),
>> + EXT_AEP(KHR_blend_equation_advanced),
>>
>> /* OES extensions go here, sorted alphabetically.
>> */
>> @@ -632,17 +642,17 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>> EXT(OES_geometry_shader),
>> EXT(OES_gpu_shader5),
>> EXT(OES_primitive_bounding_box),
>> - EXT(OES_sample_variables),
>> - EXT(OES_shader_image_atomic),
>> + EXT_AEP(OES_sample_variables),
>> + EXT_AEP(OES_shader_image_atomic),
>> EXT(OES_shader_io_blocks),
>> - EXT(OES_shader_multisample_interpolation),
>> + EXT_AEP(OES_shader_multisample_interpolation),
>> EXT(OES_standard_derivatives),
>> EXT(OES_tessellation_point_size),
>> EXT(OES_tessellation_shader),
>> EXT(OES_texture_3D),
>> EXT(OES_texture_buffer),
>> EXT(OES_texture_cube_map_array),
>> - EXT(OES_texture_storage_multisample_2d_array),
>> + EXT_AEP(OES_texture_storage_multisample_2d_array),
>>
>> /* All other extensions go here, sorted alphabetically.
>> */
>> @@ -651,23 +661,24 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>> EXT(AMD_shader_trinary_minmax),
>> EXT(AMD_vertex_shader_layer),
>> EXT(AMD_vertex_shader_viewport_index),
>> + EXT(ANDROID_extension_pack_es31a),
>> EXT(EXT_blend_func_extended),
>> EXT(EXT_draw_buffers),
>> EXT(EXT_clip_cull_distance),
>> EXT(EXT_geometry_point_size),
>> - EXT(EXT_geometry_shader),
>> - EXT(EXT_gpu_shader5),
>> - EXT(EXT_primitive_bounding_box),
>> + EXT_AEP(EXT_geometry_shader),
>> + EXT_AEP(EXT_gpu_shader5),
>> + EXT_AEP(EXT_primitive_bounding_box),
>> EXT(EXT_separate_shader_objects),
>> EXT(EXT_shader_framebuffer_fetch),
>> EXT(EXT_shader_integer_mix),
>> - EXT(EXT_shader_io_blocks),
>> + EXT_AEP(EXT_shader_io_blocks),
>> EXT(EXT_shader_samples_identical),
>> EXT(EXT_tessellation_point_size),
>> - EXT(EXT_tessellation_shader),
>> + EXT_AEP(EXT_tessellation_shader),
>> EXT(EXT_texture_array),
>> - EXT(EXT_texture_buffer),
>> - EXT(EXT_texture_cube_map_array),
>> + EXT_AEP(EXT_texture_buffer),
>> + EXT_AEP(EXT_texture_cube_map_array),
>> EXT(MESA_shader_integer_functions),
>> };
>>
>> @@ -713,7 +724,6 @@ static const _mesa_glsl_extension *find_extension(const char *name)
>> return NULL;
>> }
>>
>> -
>> bool
>> _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
>> const char *behavior_string, YYLTYPE *behavior_locp,
>> @@ -768,6 +778,21 @@ _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
>> const _mesa_glsl_extension *extension = find_extension(name);
>> if (extension && extension->compatible_with_state(state, api, gl_version)) {
>> extension->set_flags(state, behavior);
>> + if (extension->available_pred == has_ANDROID_extension_pack_es31a) {
>> + for (unsigned i = 0;
>> + i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
>> + const _mesa_glsl_extension *extension =
>> + &_mesa_glsl_supported_extensions[i];
>> +
>> + if (!extension->aep)
>> + continue;
>> + // AEP should not be enabled if all of the sub-extensions can't
>> + // also be enabled. This is not the proper layer to do such
>> + // error-checking though.
>> + assert(extension->compatible_with_state(state, api, gl_version));
>> + extension->set_flags(state, behavior);
>> + }
>> + }
>> } else {
>> static const char fmt[] = "extension `%s' unsupported in %s shader";
>>
>> diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
>> index e146fe1..027b97e 100644
>> --- a/src/compiler/glsl/glsl_parser_extras.h
>> +++ b/src/compiler/glsl/glsl_parser_extras.h
>> @@ -709,6 +709,8 @@ struct _mesa_glsl_parse_state {
>> bool AMD_vertex_shader_layer_warn;
>> bool AMD_vertex_shader_viewport_index_enable;
>> bool AMD_vertex_shader_viewport_index_warn;
>> + bool ANDROID_extension_pack_es31a_enable;
>> + bool ANDROID_extension_pack_es31a_warn;
>> bool EXT_blend_func_extended_enable;
>> bool EXT_blend_func_extended_warn;
>> bool EXT_clip_cull_distance_enable;
>> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
>> index 75cdcb8..b10e708 100644
>> --- a/src/mesa/main/extensions_table.h
>> +++ b/src/mesa/main/extensions_table.h
>> @@ -18,6 +18,8 @@ EXT(AMD_shader_trinary_minmax , dummy_true
>> EXT(AMD_vertex_shader_layer , AMD_vertex_shader_layer , x , GLC, x , x , 2012)
>> EXT(AMD_vertex_shader_viewport_index , AMD_vertex_shader_viewport_index , x , GLC, x , x , 2012)
>>
>> +EXT(ANDROID_extension_pack_es31a , ANDROID_extension_pack_es31a , x , x , x , 31, 2014)
>> +
>> EXT(ANGLE_texture_compression_dxt3 , ANGLE_texture_compression_dxt , GLL, GLC, ES1, ES2, 2011)
>> EXT(ANGLE_texture_compression_dxt5 , ANGLE_texture_compression_dxt , GLL, GLC, ES1, ES2, 2011)
>>
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 6b8dab6..2a93f29 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -3956,6 +3956,7 @@ struct gl_extensions
>> GLboolean AMD_seamless_cubemap_per_texture;
>> GLboolean AMD_vertex_shader_layer;
>> GLboolean AMD_vertex_shader_viewport_index;
>> + GLboolean ANDROID_extension_pack_es31a;
>> GLboolean APPLE_object_purgeable;
>> GLboolean ATI_meminfo;
>> GLboolean ATI_texture_compression_3dc;
>>
>
More information about the mesa-dev
mailing list