Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> On 10/01/2013 07:15 PM, Francisco Jerez wrote: > v2: Represent atomics as GLSL intrinsics. > --- > src/glsl/builtin_functions.cpp | 58 > +++++++++++++++++++++++++++++++++++++++++ > src/glsl/builtin_variables.cpp | 15 +++++++++++ > src/glsl/glcpp/glcpp-parse.y | 3 +++ > src/glsl/glsl_parser_extras.cpp | 6 +++++ > src/glsl/glsl_parser_extras.h | 7 +++++ > 5 files changed, 89 insertions(+) > > diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp > index 03efb6d..d704b84 100644 > --- a/src/glsl/builtin_functions.cpp > +++ b/src/glsl/builtin_functions.cpp > @@ -300,6 +300,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; > +} > + > /** @} */ > > > /******************************************************************************/ > @@ -515,6 +522,11 @@ private: > B1(fma) > B2(ldexp) > B2(frexp) > + > + 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 > @@ -621,6 +633,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); > } > > /** > @@ -1856,6 +1877,20 @@ builtin_builder::create_builtins() > _frexp(glsl_type::vec3_type, glsl_type::ivec3_type), > _frexp(glsl_type::vec4_type, glsl_type::ivec4_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 > @@ -3606,6 +3641,29 @@ builtin_builder::_frexp(const glsl_type *x_type, const > glsl_type *exp_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, 1, > + operand(counter))); > + body.emit(ret(retval)); > + return sig; > +} > + > /** @} */ > > > /******************************************************************************/ > diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp > index 6a808c0..49f0f42 100644 > --- a/src/glsl/builtin_variables.cpp > +++ b/src/glsl/builtin_variables.cpp > @@ -555,6 +555,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); > + } > } > > > diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y > index 6eaa5f9..2b4e988 100644 > --- a/src/glsl/glcpp/glcpp-parse.y > +++ b/src/glsl/glcpp/glcpp-parse.y > @@ -1248,6 +1248,9 @@ glcpp_parser_create (const struct gl_extensions > *extensions, int api) > > if (extensions->EXT_shader_integer_mix) > add_builtin_define(parser, "GL_EXT_shader_integer_mix", 1); > + > + if (extensions->ARB_shader_atomic_counters) > + add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1); > } > } > > diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp > index 6ebffc3..d0271bc 100644 > --- a/src/glsl/glsl_parser_extras.cpp > +++ b/src/glsl/glsl_parser_extras.cpp > @@ -109,6 +109,12 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct > gl_context *_ctx, > > this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers; > > + 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; > diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h > index d3e1a78..155071e 100644 > --- a/src/glsl/glsl_parser_extras.h > +++ b/src/glsl/glsl_parser_extras.h > @@ -221,6 +221,13 @@ struct _mesa_glsl_parse_state { > /* 3.00 ES */ > int MinProgramTexelOffset; > int MaxProgramTexelOffset; > + > + /* ARB_shader_atomic_counters */ > + unsigned MaxVertexAtomicCounters; > + unsigned MaxGeometryAtomicCounters; > + unsigned MaxFragmentAtomicCounters; > + unsigned MaxCombinedAtomicCounters; > + unsigned MaxAtomicBufferBindings; > } Const; > > /** >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev