Ian Romanick <i...@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; >> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev