[Mesa-dev] [PATCH 2/7] mesa: Add core mesa support for GL_ARB_shader_draw_parameters

Kristian Høgsberg Kristensen kristian.h.kristensen at intel.com
Wed Dec 16 12:02:58 PST 2015


Ian Romanick <idr at freedesktop.org> writes:

> On 12/15/2015 12:28 AM, Kristian Høgsberg Kristensen wrote:
>> ---
>>  src/glsl/builtin_variables.cpp      |  5 +++++
>>  src/glsl/glsl_parser_extras.cpp     |  1 +
>>  src/glsl/glsl_parser_extras.h       |  2 ++
>>  src/glsl/nir/nir.c                  |  8 ++++++++
>>  src/glsl/nir/nir_intrinsics.h       |  2 ++
>>  src/glsl/nir/shader_enums.h         | 20 ++++++++++++++++++++
>>  src/glsl/standalone_scaffolding.cpp |  1 +
>>  src/mesa/main/extensions_table.h    |  1 +
>>  src/mesa/main/mtypes.h              |  1 +
>>  9 files changed, 41 insertions(+)
>> 
>> diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
>> index e8eab80..e82c99e 100644
>> --- a/src/glsl/builtin_variables.cpp
>> +++ b/src/glsl/builtin_variables.cpp
>> @@ -951,6 +951,11 @@ builtin_variable_generator::generate_vs_special_vars()
>>        add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceIDARB");
>>     if (state->ARB_draw_instanced_enable || state->is_version(140, 300))
>>        add_system_value(SYSTEM_VALUE_INSTANCE_ID, int_t, "gl_InstanceID");
>> +   if (state->ARB_shader_draw_parameters_enable) {
>> +      add_system_value(SYSTEM_VALUE_BASE_VERTEX, int_t, "gl_BaseVertexARB");
>> +      add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstanceARB");
>> +      add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
>> +   }
>>     if (state->AMD_vertex_shader_layer_enable) {
>>        var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
>>        var->data.interpolation = INTERP_QUALIFIER_FLAT;
>> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
>> index 29cf0c6..8c46f14 100644
>> --- a/src/glsl/glsl_parser_extras.cpp
>> +++ b/src/glsl/glsl_parser_extras.cpp
>> @@ -608,6 +608,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>>     EXT(ARB_shader_atomic_counters,       true,  false,     ARB_shader_atomic_counters),
>>     EXT(ARB_shader_bit_encoding,          true,  false,     ARB_shader_bit_encoding),
>>     EXT(ARB_shader_clock,                 true,  false,     ARB_shader_clock),
>> +   EXT(ARB_shader_draw_parameters,       true,  false,     ARB_shader_draw_parameters),
>>     EXT(ARB_shader_image_load_store,      true,  false,     ARB_shader_image_load_store),
>>     EXT(ARB_shader_image_size,            true,  false,     ARB_shader_image_size),
>>     EXT(ARB_shader_precision,             true,  false,     ARB_shader_precision),
>> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
>> index a4bda77..afb99af 100644
>> --- a/src/glsl/glsl_parser_extras.h
>> +++ b/src/glsl/glsl_parser_extras.h
>> @@ -536,6 +536,8 @@ struct _mesa_glsl_parse_state {
>>     bool ARB_shader_bit_encoding_warn;
>>     bool ARB_shader_clock_enable;
>>     bool ARB_shader_clock_warn;
>> +   bool ARB_shader_draw_parameters_enable;
>> +   bool ARB_shader_draw_parameters_warn;
>>     bool ARB_shader_image_load_store_enable;
>>     bool ARB_shader_image_load_store_warn;
>>     bool ARB_shader_image_size_enable;
>> diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
>> index 35fc1de..4b70e7c 100644
>> --- a/src/glsl/nir/nir.c
>> +++ b/src/glsl/nir/nir.c
>> @@ -1588,6 +1588,10 @@ nir_intrinsic_from_system_value(gl_system_value val)
>>        return nir_intrinsic_load_vertex_id;
>>     case SYSTEM_VALUE_INSTANCE_ID:
>>        return nir_intrinsic_load_instance_id;
>> +   case SYSTEM_VALUE_DRAW_ID:
>> +      return nir_intrinsic_load_draw_id;
>> +   case SYSTEM_VALUE_BASE_INSTANCE:
>> +      return nir_intrinsic_load_base_instance;
>>     case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
>>        return nir_intrinsic_load_vertex_id_zero_base;
>>     case SYSTEM_VALUE_BASE_VERTEX:
>> @@ -1633,6 +1637,10 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
>>        return SYSTEM_VALUE_VERTEX_ID;
>>     case nir_intrinsic_load_instance_id:
>>        return SYSTEM_VALUE_INSTANCE_ID;
>> +   case nir_intrinsic_load_draw_id:
>> +      return SYSTEM_VALUE_DRAW_ID;
>> +   case nir_intrinsic_load_base_instance:
>> +      return SYSTEM_VALUE_BASE_INSTANCE;
>>     case nir_intrinsic_load_vertex_id_zero_base:
>>        return SYSTEM_VALUE_VERTEX_ID_ZERO_BASE;
>>     case nir_intrinsic_load_base_vertex:
>> diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h
>> index 9811fb3..917c805 100644
>> --- a/src/glsl/nir/nir_intrinsics.h
>> +++ b/src/glsl/nir/nir_intrinsics.h
>> @@ -239,6 +239,8 @@ SYSTEM_VALUE(vertex_id, 1, 0)
>>  SYSTEM_VALUE(vertex_id_zero_base, 1, 0)
>>  SYSTEM_VALUE(base_vertex, 1, 0)
>>  SYSTEM_VALUE(instance_id, 1, 0)
>> +SYSTEM_VALUE(base_instance, 1, 0)
>> +SYSTEM_VALUE(draw_id, 1, 0)
>>  SYSTEM_VALUE(sample_id, 1, 0)
>>  SYSTEM_VALUE(sample_pos, 2, 0)
>>  SYSTEM_VALUE(sample_mask_in, 1, 0)
>> diff --git a/src/glsl/nir/shader_enums.h b/src/glsl/nir/shader_enums.h
>> index dd0e0ba..0be217c 100644
>> --- a/src/glsl/nir/shader_enums.h
>> +++ b/src/glsl/nir/shader_enums.h
>> @@ -379,6 +379,26 @@ typedef enum
>>      * \sa SYSTEM_VALUE_VERTEX_ID, SYSTEM_VALUE_VERTEX_ID_ZERO_BASE
>>      */
>>     SYSTEM_VALUE_BASE_VERTEX,
>> +
>> +   /**
>> +    * Value of \c baseinstance passed to instanced draw entry points
>> +    *
>> +    * \sa SYSTEM_VALUE_INSTANCE_ID
>> +    */
>> +   SYSTEM_VALUE_BASE_INSTANCE,
>> +
>> +   /**
>> +    * From _ARB_shader_draw_parameters:
>> +    *
>> +    *   "Additionally, this extension adds a further built-in variable,
>> +    *    gl_DrawID to the shading language. This variable contains the index
>> +    *    of the draw currently being processed by a Multi* variant of a
>> +    *    drawing command (such as MultiDrawElements or
>> +    *    MultiDrawArraysIndirect)."
>> +    *
>> +    * If GL_ARB_multi_draw_indirect is not supported, this is always 0.
>> +    */
>> +   SYSTEM_VALUE_DRAW_ID,
>>     /*@}*/
>>  
>>     /**
>> diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp
>> index 1f69d0d..e350f70 100644
>> --- a/src/glsl/standalone_scaffolding.cpp
>> +++ b/src/glsl/standalone_scaffolding.cpp
>> @@ -149,6 +149,7 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api)
>>     ctx->Extensions.ARB_gpu_shader_fp64 = true;
>>     ctx->Extensions.ARB_sample_shading = true;
>>     ctx->Extensions.ARB_shader_bit_encoding = true;
>> +   ctx->Extensions.ARB_shader_draw_parameters = true;
>>     ctx->Extensions.ARB_shader_stencil_export = true;
>>     ctx->Extensions.ARB_shader_subroutine = true;
>>     ctx->Extensions.ARB_shader_texture_lod = true;
>> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
>> index 52a4ed6..789b55a 100644
>> --- a/src/mesa/main/extensions_table.h
>> +++ b/src/mesa/main/extensions_table.h
>> @@ -96,6 +96,7 @@ EXT(ARB_separate_shader_objects             , dummy_true
>>  EXT(ARB_shader_atomic_counters              , ARB_shader_atomic_counters             , GLL, GLC,  x ,  x , 2011)
>>  EXT(ARB_shader_bit_encoding                 , ARB_shader_bit_encoding                , GLL, GLC,  x ,  x , 2010)
>>  EXT(ARB_shader_clock                        , ARB_shader_clock                       , GLL, GLC,  x ,  x , 2015)
>> +EXT(ARB_shader_draw_parameters              , ARB_shader_draw_parameters             , GLL, GLC,  x ,  x , 2013)
>
> Does this extension make any sense without GL_ARB_draw_indirect?  If it
> does not, then we should not expose it in compatibility profile because
> GL_ARB_draw_indirect is not exposed in compatibility either.

gl_BaseVertexID and gl_BaseInstanceID are useful for anything that takes
a base instance or base vertex. We expose GL_ARB_base_instance in legacy
contexts so it seems like it makes sense to also expose this extension
in legacy.

Kristian

>>  EXT(ARB_shader_image_load_store             , ARB_shader_image_load_store            , GLL, GLC,  x ,  x , 2011)
>>  EXT(ARB_shader_image_size                   , ARB_shader_image_size                  , GLL, GLC,  x ,  x , 2012)
>>  EXT(ARB_shader_objects                      , dummy_true                             , GLL, GLC,  x ,  x , 2002)
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 48309bf..05d51a3 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -3714,6 +3714,7 @@ struct gl_extensions
>>     GLboolean ARB_shader_atomic_counters;
>>     GLboolean ARB_shader_bit_encoding;
>>     GLboolean ARB_shader_clock;
>> +   GLboolean ARB_shader_draw_parameters;
>>     GLboolean ARB_shader_image_load_store;
>>     GLboolean ARB_shader_image_size;
>>     GLboolean ARB_shader_precision;
>> 


More information about the mesa-dev mailing list