On Mon, Feb 22, 2016 at 10:31 PM, Francisco Jerez <curroje...@riseup.net> wrote: > This is basically just the same atomic functions exposed by > ARB_shader_image_load_store, with one exception: > > "highp float imageAtomicExchange( > coherent IMAGE_PARAMS, > float data);" > > There's no float atomic exchange overload in the original > ARB_shader_image_load_store or GL 4.2, so this seems like new > functionality that requires specific back-end support and a separate > availability condition in the built-in function generator. > > v2: Move image availability predicate logic into a separate static > function for clarity. Had to pull out the image_function_flags > enum from the builtin_builder class for that to be possible.
Much better, thanks :) Reviewed-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > src/compiler/glsl/builtin_functions.cpp | 61 > +++++++++++++++++++++++---------- > 1 file changed, 43 insertions(+), 18 deletions(-) > > diff --git a/src/compiler/glsl/builtin_functions.cpp > b/src/compiler/glsl/builtin_functions.cpp > index f488434..bbb237a 100644 > --- a/src/compiler/glsl/builtin_functions.cpp > +++ b/src/compiler/glsl/builtin_functions.cpp > @@ -448,8 +448,16 @@ shader_image_load_store(const _mesa_glsl_parse_state > *state) > static bool > shader_image_atomic(const _mesa_glsl_parse_state *state) > { > - return (state->is_version(420, 0) || > - state->ARB_shader_image_load_store_enable); > + return (state->is_version(420, 320) || > + state->ARB_shader_image_load_store_enable || > + state->OES_shader_image_atomic_enable); > +} > + > +static bool > +shader_image_atomic_exchange_float(const _mesa_glsl_parse_state *state) > +{ > + return (state->is_version(450, 320) || > + state->OES_shader_image_atomic_enable); > } > > static bool > @@ -577,17 +585,6 @@ private: > > unsigned num_arguments, > > unsigned flags); > > - enum image_function_flags { > - IMAGE_FUNCTION_EMIT_STUB = (1 << 0), > - IMAGE_FUNCTION_RETURNS_VOID = (1 << 1), > - IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE = (1 << 2), > - IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE = (1 << 3), > - IMAGE_FUNCTION_READ_ONLY = (1 << 4), > - IMAGE_FUNCTION_WRITE_ONLY = (1 << 5), > - IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6), > - IMAGE_FUNCTION_MS_ONLY = (1 << 7), > - }; > - > /** > * Create a new image built-in function for all known image types. > * \p flags is a bitfield of \c image_function_flags flags. > @@ -836,6 +833,18 @@ private: > /** @} */ > }; > > +enum image_function_flags { > + IMAGE_FUNCTION_EMIT_STUB = (1 << 0), > + IMAGE_FUNCTION_RETURNS_VOID = (1 << 1), > + IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE = (1 << 2), > + IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE = (1 << 3), > + IMAGE_FUNCTION_READ_ONLY = (1 << 4), > + IMAGE_FUNCTION_WRITE_ONLY = (1 << 5), > + IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6), > + IMAGE_FUNCTION_MS_ONLY = (1 << 7), > + IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE = (1 << 8) > +}; > + > } /* anonymous namespace */ > > /** > @@ -2981,7 +2990,9 @@ builtin_builder::add_image_functions(bool glsl) > add_image_function((glsl ? "imageAtomicExchange" : > "__intrinsic_image_atomic_exchange"), > "__intrinsic_image_atomic_exchange", > - &builtin_builder::_image_prototype, 1, atom_flags); > + &builtin_builder::_image_prototype, 1, > + (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE | > + IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)); > > add_image_function((glsl ? "imageAtomicCompSwap" : > "__intrinsic_image_atomic_comp_swap"), > @@ -5232,6 +5243,21 @@ builtin_builder::_mid3(const glsl_type *type) > return sig; > } > > +static builtin_available_predicate > +get_image_available_predicate(const glsl_type *type, unsigned flags) > +{ > + if ((flags & IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE) && > + type->sampled_type == GLSL_TYPE_FLOAT) > + return shader_image_atomic_exchange_float; > + > + else if (flags & (IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE | > + IMAGE_FUNCTION_AVAIL_ATOMIC)) > + return shader_image_atomic; > + > + else > + return shader_image_load_store; > +} > + > ir_function_signature * > builtin_builder::_image_prototype(const glsl_type *image_type, > unsigned num_arguments, > @@ -5249,10 +5275,9 @@ builtin_builder::_image_prototype(const glsl_type > *image_type, > ir_variable *coord = in_var( > glsl_type::ivec(image_type->coordinate_components()), "coord"); > > - const builtin_available_predicate avail = > - (flags & IMAGE_FUNCTION_AVAIL_ATOMIC ? shader_image_atomic : > - shader_image_load_store); > - ir_function_signature *sig = new_sig(ret_type, avail, 2, image, coord); > + ir_function_signature *sig = new_sig( > + ret_type, get_image_available_predicate(image_type, flags), > + 2, image, coord); > > /* Sample index for multisample images. */ > if (image_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) > -- > 2.7.0 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev