diff options
author | Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> | 2020-06-19 18:34:51 +0200 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2020-07-22 22:30:03 +0200 |
commit | 8e44e8cf2cedb2ffc6d921133c287a250c343a77 (patch) | |
tree | 706ffd29566d76785e17238aa3f00fb9e3fc0498 /src | |
parent | 0fea7026b49586f139162ace876034d4c5607bc4 (diff) |
glsl: don't expose imageAtomicIncWrap for signed image
The spec says that it's only allowed for unsigned ones.
Same from imageAtomicDecWrap.
Fixes: fc0a2e5d017 ("glsl: add EXT_shader_image_load_store new image functions")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5688>
(cherry picked from commit 233af4a412db87a9b8430104a58c1b6adb704b1c)
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/builtin_functions.cpp | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index 1aead1d9e12..e20cbdbb288 100644 --- a/src/compiler/glsl/builtin_functions.cpp +++ b/src/compiler/glsl/builtin_functions.cpp @@ -1247,6 +1247,7 @@ enum image_function_flags { IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE = (1 << 8), IMAGE_FUNCTION_AVAIL_ATOMIC_ADD = (1 << 9), IMAGE_FUNCTION_EXT_ONLY = (1 << 10), + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE = (1 << 11), }; } /* anonymous namespace */ @@ -4613,14 +4614,15 @@ builtin_builder::add_image_function(const char *name, ir_function *f = new(mem_ctx) ir_function(name); for (unsigned i = 0; i < ARRAY_SIZE(types); ++i) { - if ((types[i]->sampled_type != GLSL_TYPE_FLOAT || - (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) && - (types[i]->sampler_dimensionality == GLSL_SAMPLER_DIM_MS || - !(flags & IMAGE_FUNCTION_MS_ONLY))) - f->add_signature(_image(prototype, types[i], intrinsic_name, - num_arguments, flags, intrinsic_id)); + if (types[i]->sampled_type == GLSL_TYPE_FLOAT && !(flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) + continue; + if (types[i]->sampled_type == GLSL_TYPE_INT && !(flags & IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE)) + continue; + if ((types[i]->sampler_dimensionality != GLSL_SAMPLER_DIM_MS) && (flags & IMAGE_FUNCTION_MS_ONLY)) + continue; + f->add_signature(_image(prototype, types[i], intrinsic_name, + num_arguments, flags, intrinsic_id)); } - shader->symbols->add_function(f); } @@ -4634,6 +4636,7 @@ builtin_builder::add_image_functions(bool glsl) &builtin_builder::_image_prototype, 0, (flags | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE | IMAGE_FUNCTION_READ_ONLY), ir_intrinsic_image_load); @@ -4643,6 +4646,7 @@ builtin_builder::add_image_functions(bool glsl) (flags | IMAGE_FUNCTION_RETURNS_VOID | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE | IMAGE_FUNCTION_WRITE_ONLY), ir_intrinsic_image_store); @@ -4652,32 +4656,38 @@ builtin_builder::add_image_functions(bool glsl) "__intrinsic_image_atomic_add", &builtin_builder::_image_prototype, 1, (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_ADD | - IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE), + IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE), ir_intrinsic_image_atomic_add); add_image_function(glsl ? "imageAtomicMin" : "__intrinsic_image_atomic_min", "__intrinsic_image_atomic_min", - &builtin_builder::_image_prototype, 1, atom_flags, + &builtin_builder::_image_prototype, 1, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_min); add_image_function(glsl ? "imageAtomicMax" : "__intrinsic_image_atomic_max", "__intrinsic_image_atomic_max", - &builtin_builder::_image_prototype, 1, atom_flags, + &builtin_builder::_image_prototype, 1, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_max); add_image_function(glsl ? "imageAtomicAnd" : "__intrinsic_image_atomic_and", "__intrinsic_image_atomic_and", - &builtin_builder::_image_prototype, 1, atom_flags, + &builtin_builder::_image_prototype, 1, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_and); add_image_function(glsl ? "imageAtomicOr" : "__intrinsic_image_atomic_or", "__intrinsic_image_atomic_or", - &builtin_builder::_image_prototype, 1, atom_flags, + &builtin_builder::_image_prototype, 1, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_or); add_image_function(glsl ? "imageAtomicXor" : "__intrinsic_image_atomic_xor", "__intrinsic_image_atomic_xor", - &builtin_builder::_image_prototype, 1, atom_flags, + &builtin_builder::_image_prototype, 1, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_xor); add_image_function((glsl ? "imageAtomicExchange" : @@ -4685,25 +4695,29 @@ builtin_builder::add_image_functions(bool glsl) "__intrinsic_image_atomic_exchange", &builtin_builder::_image_prototype, 1, (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE), ir_intrinsic_image_atomic_exchange); add_image_function((glsl ? "imageAtomicCompSwap" : "__intrinsic_image_atomic_comp_swap"), "__intrinsic_image_atomic_comp_swap", - &builtin_builder::_image_prototype, 2, atom_flags, + &builtin_builder::_image_prototype, 2, + atom_flags | IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_atomic_comp_swap); add_image_function(glsl ? "imageSize" : "__intrinsic_image_size", "__intrinsic_image_size", &builtin_builder::_image_size_prototype, 1, - flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE, + flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE, ir_intrinsic_image_size); add_image_function(glsl ? "imageSamples" : "__intrinsic_image_samples", "__intrinsic_image_samples", &builtin_builder::_image_samples_prototype, 1, flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | + IMAGE_FUNCTION_SUPPORTS_SIGNED_DATA_TYPE | IMAGE_FUNCTION_MS_ONLY, ir_intrinsic_image_samples); |