mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 23:20:08 +01:00
glsl: Add built-in functions and constants required for ARB_shader_atomic_counters.
v2: Represent atomics as GLSL intrinsics. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
9562922376
commit
bbded5b5fe
5 changed files with 89 additions and 0 deletions
|
|
@ -326,6 +326,13 @@ tex3d_lod(const _mesa_glsl_parse_state *state)
|
|||
{
|
||||
return tex3d(state) && lod_exists_in_stage(state);
|
||||
}
|
||||
|
||||
static bool
|
||||
shader_atomic_counters(const _mesa_glsl_parse_state *state)
|
||||
{
|
||||
return state->ARB_shader_atomic_counters_enable;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
@ -556,6 +563,11 @@ private:
|
|||
B1(uaddCarry)
|
||||
B1(usubBorrow)
|
||||
B1(mulExtended)
|
||||
|
||||
ir_function_signature *_atomic_intrinsic(builtin_available_predicate avail);
|
||||
ir_function_signature *_atomic_op(const char *intrinsic,
|
||||
builtin_available_predicate avail);
|
||||
|
||||
#undef B0
|
||||
#undef B1
|
||||
#undef B2
|
||||
|
|
@ -662,6 +674,15 @@ builtin_builder::create_shader()
|
|||
void
|
||||
builtin_builder::create_intrinsics()
|
||||
{
|
||||
add_function("__intrinsic_atomic_read",
|
||||
_atomic_intrinsic(shader_atomic_counters),
|
||||
NULL);
|
||||
add_function("__intrinsic_atomic_increment",
|
||||
_atomic_intrinsic(shader_atomic_counters),
|
||||
NULL);
|
||||
add_function("__intrinsic_atomic_predecrement",
|
||||
_atomic_intrinsic(shader_atomic_counters),
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2070,6 +2091,20 @@ builtin_builder::create_builtins()
|
|||
_mulExtended(glsl_type::uvec3_type),
|
||||
_mulExtended(glsl_type::uvec4_type),
|
||||
NULL);
|
||||
|
||||
add_function("atomicCounter",
|
||||
_atomic_op("__intrinsic_atomic_read",
|
||||
shader_atomic_counters),
|
||||
NULL);
|
||||
add_function("atomicCounterIncrement",
|
||||
_atomic_op("__intrinsic_atomic_increment",
|
||||
shader_atomic_counters),
|
||||
NULL);
|
||||
add_function("atomicCounterDecrement",
|
||||
_atomic_op("__intrinsic_atomic_predecrement",
|
||||
shader_atomic_counters),
|
||||
NULL);
|
||||
|
||||
#undef F
|
||||
#undef FI
|
||||
#undef FIU
|
||||
|
|
@ -3932,6 +3967,29 @@ builtin_builder::_mulExtended(const glsl_type *type)
|
|||
|
||||
return sig;
|
||||
}
|
||||
|
||||
ir_function_signature *
|
||||
builtin_builder::_atomic_intrinsic(builtin_available_predicate avail)
|
||||
{
|
||||
ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
|
||||
MAKE_INTRINSIC(glsl_type::uint_type, avail, 1, counter);
|
||||
return sig;
|
||||
}
|
||||
|
||||
ir_function_signature *
|
||||
builtin_builder::_atomic_op(const char *intrinsic,
|
||||
builtin_available_predicate avail)
|
||||
{
|
||||
ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
|
||||
MAKE_SIG(glsl_type::uint_type, avail, 1, counter);
|
||||
|
||||
ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
|
||||
body.emit(call(shader->symbols->get_function(intrinsic), retval,
|
||||
sig->parameters));
|
||||
body.emit(ret(retval));
|
||||
return sig;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
|
|||
|
|
@ -638,6 +638,21 @@ builtin_variable_generator::generate_constants()
|
|||
*/
|
||||
add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
|
||||
}
|
||||
|
||||
if (state->ARB_shader_atomic_counters_enable) {
|
||||
add_const("gl_MaxVertexAtomicCounters",
|
||||
state->Const.MaxVertexAtomicCounters);
|
||||
add_const("gl_MaxGeometryAtomicCounters",
|
||||
state->Const.MaxGeometryAtomicCounters);
|
||||
add_const("gl_MaxFragmentAtomicCounters",
|
||||
state->Const.MaxFragmentAtomicCounters);
|
||||
add_const("gl_MaxCombinedAtomicCounters",
|
||||
state->Const.MaxCombinedAtomicCounters);
|
||||
add_const("gl_MaxAtomicCounterBindings",
|
||||
state->Const.MaxAtomicBufferBindings);
|
||||
add_const("gl_MaxTessControlAtomicCounters", 0);
|
||||
add_const("gl_MaxTessEvaluationAtomicCounters", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1254,6 +1254,9 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
|
|||
|
||||
if (extensions->ARB_texture_gather)
|
||||
add_builtin_define(parser, "GL_ARB_texture_gather", 1);
|
||||
|
||||
if (extensions->ARB_shader_atomic_counters)
|
||||
add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,6 +118,12 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
|
|||
this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents;
|
||||
this->Const.MaxGeometryUniformComponents = ctx->Const.GeometryProgram.MaxUniformComponents;
|
||||
|
||||
this->Const.MaxVertexAtomicCounters = ctx->Const.VertexProgram.MaxAtomicCounters;
|
||||
this->Const.MaxGeometryAtomicCounters = ctx->Const.GeometryProgram.MaxAtomicCounters;
|
||||
this->Const.MaxFragmentAtomicCounters = ctx->Const.FragmentProgram.MaxAtomicCounters;
|
||||
this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
|
||||
this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;
|
||||
|
||||
this->current_function = NULL;
|
||||
this->toplevel_ir = NULL;
|
||||
this->found_return = false;
|
||||
|
|
|
|||
|
|
@ -229,6 +229,13 @@ struct _mesa_glsl_parse_state {
|
|||
unsigned MaxGeometryOutputVertices;
|
||||
unsigned MaxGeometryTotalOutputComponents;
|
||||
unsigned MaxGeometryUniformComponents;
|
||||
|
||||
/* ARB_shader_atomic_counters */
|
||||
unsigned MaxVertexAtomicCounters;
|
||||
unsigned MaxGeometryAtomicCounters;
|
||||
unsigned MaxFragmentAtomicCounters;
|
||||
unsigned MaxCombinedAtomicCounters;
|
||||
unsigned MaxAtomicBufferBindings;
|
||||
} Const;
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue