glsl: add gl_SubGroup*ARB builtins

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Nicolai Hähnle
2017-03-30 12:10:00 +02:00
parent 961b8e9afe
commit b5711d5e1a
3 changed files with 88 additions and 0 deletions

View File

@@ -365,6 +365,7 @@ public:
struct _mesa_glsl_parse_state *state); struct _mesa_glsl_parse_state *state);
void generate_constants(); void generate_constants();
void generate_uniforms(); void generate_uniforms();
void generate_special_vars();
void generate_vs_special_vars(); void generate_vs_special_vars();
void generate_tcs_special_vars(); void generate_tcs_special_vars();
void generate_tes_special_vars(); void generate_tes_special_vars();
@@ -428,6 +429,7 @@ private:
const glsl_type * const bool_t; const glsl_type * const bool_t;
const glsl_type * const int_t; const glsl_type * const int_t;
const glsl_type * const uint_t; const glsl_type * const uint_t;
const glsl_type * const uint64_t;
const glsl_type * const float_t; const glsl_type * const float_t;
const glsl_type * const vec2_t; const glsl_type * const vec2_t;
const glsl_type * const vec3_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)), compatibility(state->compat_shader || !state->is_version(140, 100)),
bool_t(glsl_type::bool_type), int_t(glsl_type::int_type), bool_t(glsl_type::bool_type), int_t(glsl_type::int_type),
uint_t(glsl_type::uint_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), float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type),
vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type), vec3_t(glsl_type::vec3_type), vec4_t(glsl_type::vec4_type),
uvec3_t(glsl_type::uvec3_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. * Generate variables which only exist in vertex shaders.
*/ */
@@ -1416,6 +1437,7 @@ _mesa_glsl_initialize_variables(exec_list *instructions,
gen.generate_constants(); gen.generate_constants();
gen.generate_uniforms(); gen.generate_uniforms();
gen.generate_special_vars();
gen.generate_varyings(); gen.generate_varyings();

View File

@@ -203,6 +203,13 @@ const char *
gl_system_value_name(gl_system_value sysval) gl_system_value_name(gl_system_value sysval)
{ {
static const char *names[] = { 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_VERTEX_ID),
ENUM(SYSTEM_VALUE_INSTANCE_ID), ENUM(SYSTEM_VALUE_INSTANCE_ID),
ENUM(SYSTEM_VALUE_INSTANCE_INDEX), ENUM(SYSTEM_VALUE_INSTANCE_INDEX),

View File

@@ -317,6 +317,65 @@ const char *gl_varying_slot_name(gl_varying_slot slot);
*/ */
typedef enum 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 <gl_SubGroupSizeARB> is the maximum number of
* invocations in a sub-group. The maximum <gl_SubGroupSizeARB>
* 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 <gl_SubGroupInvocationARB> holds the index of the
* invocation within sub-group. This variable is in the range 0 to
* <gl_SubGroupSizeARB>-1, where <gl_SubGroupSizeARB> is the total
* number of invocations in a sub-group."
*/
SYSTEM_VALUE_SUBGROUP_INVOCATION,
/**
* From the GL_ARB_shader_ballot spec:
*
* "The <gl_SubGroup??MaskARB> 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 * \name Vertex shader system values
*/ */