[Mesa-dev] [PATCHv2 3/5] glsl: Implement the required built-in functions when OES_shader_image_atomic is enabled.

Ilia Mirkin imirkin at alum.mit.edu
Tue Feb 23 03:34:58 UTC 2016


On Mon, Feb 22, 2016 at 10:31 PM, Francisco Jerez <currojerez at 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 <imirkin at 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
>


More information about the mesa-dev mailing list