From b5711d5e1a7c281a5f4fb3101333e3cc64bd418b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Thu, 30 Mar 2017 12:10:00 +0200 Subject: [PATCH] glsl: add gl_SubGroup*ARB builtins MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák --- src/compiler/glsl/builtin_variables.cpp | 22 +++++++++ src/compiler/shader_enums.c | 7 +++ src/compiler/shader_enums.h | 59 +++++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp index fc0443e7156..c232571f26e 100644 --- a/src/compiler/glsl/builtin_variables.cpp +++ b/src/compiler/glsl/builtin_variables.cpp @@ -365,6 +365,7 @@ public: struct _mesa_glsl_parse_state *state); void generate_constants(); void generate_uniforms(); + void generate_special_vars(); void generate_vs_special_vars(); void generate_tcs_special_vars(); void generate_tes_special_vars(); @@ -428,6 +429,7 @@ private: const glsl_type * const bool_t; const glsl_type * const int_t; const glsl_type * const uint_t; + const glsl_type * const uint64_t; const glsl_type * const float_t; const glsl_type * const vec2_t; const glsl_type * const vec3_t; @@ -447,6 +449,7 @@ builtin_variable_generator::builtin_variable_generator( compatibility(state->compat_shader || !state->is_version(140, 100)), bool_t(glsl_type::bool_type), int_t(glsl_type::int_type), uint_t(glsl_type::uint_type), + uint64_t(glsl_type::uint64_t_type), float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type), vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type), uvec3_t(glsl_type::uvec3_type), @@ -983,6 +986,24 @@ builtin_variable_generator::generate_uniforms() } +/** + * Generate special variables which exist in all shaders. + */ +void +builtin_variable_generator::generate_special_vars() +{ + if (state->ARB_shader_ballot_enable) { + add_system_value(SYSTEM_VALUE_SUBGROUP_SIZE, uint_t, "gl_SubGroupSizeARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_INVOCATION, uint_t, "gl_SubGroupInvocationARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_EQ_MASK, uint64_t, "gl_SubGroupEqMaskARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_GE_MASK, uint64_t, "gl_SubGroupGeMaskARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_GT_MASK, uint64_t, "gl_SubGroupGtMaskARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_LE_MASK, uint64_t, "gl_SubGroupLeMaskARB"); + add_system_value(SYSTEM_VALUE_SUBGROUP_LT_MASK, uint64_t, "gl_SubGroupLtMaskARB"); + } +} + + /** * Generate variables which only exist in vertex shaders. */ @@ -1416,6 +1437,7 @@ _mesa_glsl_initialize_variables(exec_list *instructions, gen.generate_constants(); gen.generate_uniforms(); + gen.generate_special_vars(); gen.generate_varyings(); diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index e704c95a6bc..ca62cdaf500 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -203,6 +203,13 @@ const char * gl_system_value_name(gl_system_value sysval) { static const char *names[] = { + ENUM(SYSTEM_VALUE_SUBGROUP_SIZE), + ENUM(SYSTEM_VALUE_SUBGROUP_INVOCATION), + ENUM(SYSTEM_VALUE_SUBGROUP_EQ_MASK), + ENUM(SYSTEM_VALUE_SUBGROUP_GE_MASK), + ENUM(SYSTEM_VALUE_SUBGROUP_GT_MASK), + ENUM(SYSTEM_VALUE_SUBGROUP_LE_MASK), + ENUM(SYSTEM_VALUE_SUBGROUP_LT_MASK), ENUM(SYSTEM_VALUE_VERTEX_ID), ENUM(SYSTEM_VALUE_INSTANCE_ID), ENUM(SYSTEM_VALUE_INSTANCE_INDEX), diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 98565c80cb8..930d99748e7 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -317,6 +317,65 @@ const char *gl_varying_slot_name(gl_varying_slot slot); */ typedef enum { + /** + * \name System values applicable to all shaders + */ + /*@{*/ + + /** + * Builtin variables added by GL_ARB_shader_ballot. + */ + /*@{*/ + + /** + * From the GL_ARB_shader-ballot spec: + * + * "A sub-group is a collection of invocations which execute in lockstep. + * The variable is the maximum number of + * invocations in a sub-group. The maximum + * supported in this extension is 64." + * + * The spec defines this as a uniform. However, it's highly unlikely that + * implementations actually treat it as a uniform (which is loaded from a + * constant buffer). Most likely, this is an implementation-wide constant, + * or perhaps something that depends on the shader stage. + */ + SYSTEM_VALUE_SUBGROUP_SIZE, + + /** + * From the GL_ARB_shader_ballot spec: + * + * "The variable holds the index of the + * invocation within sub-group. This variable is in the range 0 to + * -1, where is the total + * number of invocations in a sub-group." + */ + SYSTEM_VALUE_SUBGROUP_INVOCATION, + + /** + * From the GL_ARB_shader_ballot spec: + * + * "The variables provide a bitmask for all + * invocations, with one bit per invocation starting with the least + * significant bit, according to the following table, + * + * variable equation for bit values + * -------------------- ------------------------------------ + * gl_SubGroupEqMaskARB bit index == gl_SubGroupInvocationARB + * gl_SubGroupGeMaskARB bit index >= gl_SubGroupInvocationARB + * gl_SubGroupGtMaskARB bit index > gl_SubGroupInvocationARB + * gl_SubGroupLeMaskARB bit index <= gl_SubGroupInvocationARB + * gl_SubGroupLtMaskARB bit index < gl_SubGroupInvocationARB + */ + SYSTEM_VALUE_SUBGROUP_EQ_MASK, + SYSTEM_VALUE_SUBGROUP_GE_MASK, + SYSTEM_VALUE_SUBGROUP_GT_MASK, + SYSTEM_VALUE_SUBGROUP_LE_MASK, + SYSTEM_VALUE_SUBGROUP_LT_MASK, + /*@}*/ + + /*@}*/ + /** * \name Vertex shader system values */ -- 2.30.2