glsl: add gl_SubGroup*ARB builtins
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -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();
|
||||
|
||||
|
@@ -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),
|
||||
|
@@ -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 <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
|
||||
*/
|
||||
|
Reference in New Issue
Block a user