[Mesa-dev] [PATCH] glsl: trap atomic operations on illegal image formats in compiler.
Matt Turner
mattst88 at gmail.com
Thu May 5 22:28:24 UTC 2016
On Thu, May 5, 2016 at 3:19 PM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This fixes:
> GL43-CTS.shader_image_load_store.negative-compileErrors
>
> where shader 9 was being compiled with atomic operation on an r16i.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/compiler/glsl/ast_function.cpp | 21 +++++++++++++++++++++
> src/compiler/glsl/builtin_functions.cpp | 6 +++---
> src/compiler/glsl/glsl_parser_extras.h | 7 +++++++
> src/compiler/glsl/ir.h | 2 ++
> 4 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp
> index fe0df15..3ea6e05 100644
> --- a/src/compiler/glsl/ast_function.cpp
> +++ b/src/compiler/glsl/ast_function.cpp
> @@ -139,6 +139,27 @@ verify_image_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state,
> return false;
> }
>
> + if (formal->data.image_atomic) {
> + if (actual->data.image_format != GL_R32UI &&
> + actual->data.image_format != GL_R32I) {
> + _mesa_glsl_error(loc, state,
> + "atomic operations can only happen on r32ui/r32i formats.");
Bunch of tabs in this patch.
> + return false;
> + }
> + }
> +
> + if (formal->data.image_atomic_exchange) {
> + if ((actual->data.image_format != GL_R32UI &&
> + actual->data.image_format != GL_R32I)) {
> + /* check for the r32f special case. */
> + if (!(state->has_shader_image_atomic_exchange_float() &&
> + actual->data.image_format == GL_R32F)) {
> + _mesa_glsl_error(loc, state,
> + "atomic exchange operations can only happen on r32ui/r32i formats (or r32f in GLES).");
Probably would be nice to line wrap this.
> + return false;
> + }
> + }
> + }
> return true;
> }
>
> diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
> index 25d914d..9d029bb 100644
> --- a/src/compiler/glsl/builtin_functions.cpp
> +++ b/src/compiler/glsl/builtin_functions.cpp
> @@ -478,9 +478,7 @@ shader_image_atomic(const _mesa_glsl_parse_state *state)
> static bool
> shader_image_atomic_exchange_float(const _mesa_glsl_parse_state *state)
> {
> - return (state->is_version(450, 320) ||
> - state->ARB_ES3_1_compatibility_enable ||
> - state->OES_shader_image_atomic_enable);
> + return (state->has_shader_image_atomic_exchange_float());
> }
>
> static bool
> @@ -5436,6 +5434,8 @@ builtin_builder::_image_prototype(const glsl_type *image_type,
> image->data.image_coherent = true;
> image->data.image_volatile = true;
> image->data.image_restrict = true;
> + image->data.image_atomic = (flags & IMAGE_FUNCTION_AVAIL_ATOMIC) != 0;
> + image->data.image_atomic_exchange = (flags & IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE) != 0;
>
> return sig;
> }
> diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
> index 7018347..9bf9245 100644
> --- a/src/compiler/glsl/glsl_parser_extras.h
> +++ b/src/compiler/glsl/glsl_parser_extras.h
> @@ -270,6 +270,13 @@ struct _mesa_glsl_parse_state {
> return OES_geometry_shader_enable || is_version(150, 320);
> }
>
> + bool has_shader_image_atomic_exchange_float() const
> + {
> + return (is_version(450, 320) ||
> + ARB_ES3_1_compatibility_enable ||
> + OES_shader_image_atomic_enable);
> + }
> +
> void process_version_directive(YYLTYPE *locp, int version,
> const char *ident);
>
> diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
> index 0c319ea..2bf04e68 100644
> --- a/src/compiler/glsl/ir.h
> +++ b/src/compiler/glsl/ir.h
> @@ -811,6 +811,8 @@ public:
> unsigned image_volatile:1;
> unsigned image_restrict:1;
>
> + unsigned image_atomic:1;
> + unsigned image_atomic_exchange:1;
Leave a newline after these.
> /**
> * ARB_shader_storage_buffer_object
> */
> --
More information about the mesa-dev
mailing list