From f821a3ec4f8dda55722f326f26855c2b24ca186c Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Sat, 10 Oct 2015 09:36:22 -0700 Subject: [PATCH] glsl: Buffer atomics are supported for compute shaders MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jordan Justen Reviewed-by: Iago Toral Quiroga Reviewed-by: Kristian Høgsberg --- src/glsl/builtin_functions.cpp | 70 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp index 4462bfd2324..9973a763087 100644 --- a/src/glsl/builtin_functions.cpp +++ b/src/glsl/builtin_functions.cpp @@ -478,6 +478,12 @@ compute_shader(const _mesa_glsl_parse_state *state) return state->stage == MESA_SHADER_COMPUTE; } +static bool +buffer_atomics_supported(const _mesa_glsl_parse_state *state) +{ + return compute_shader(state) || shader_storage_buffer_object(state); +} + static bool barrier_supported(const _mesa_glsl_parse_state *state) { @@ -931,51 +937,51 @@ builtin_builder::create_intrinsics() NULL); add_function("__intrinsic_atomic_add", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_min", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_max", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_and", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_or", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_xor", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_exchange", - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic2(shader_storage_buffer_object, + _atomic_intrinsic2(buffer_atomics_supported, glsl_type::int_type), NULL); add_function("__intrinsic_atomic_comp_swap", - _atomic_intrinsic3(shader_storage_buffer_object, + _atomic_intrinsic3(buffer_atomics_supported, glsl_type::uint_type), - _atomic_intrinsic3(shader_storage_buffer_object, + _atomic_intrinsic3(buffer_atomics_supported, glsl_type::int_type), NULL); @@ -2683,66 +2689,66 @@ builtin_builder::create_builtins() add_function("atomicAdd", _atomic_op2("__intrinsic_atomic_add", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_add", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicMin", _atomic_op2("__intrinsic_atomic_min", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_min", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicMax", _atomic_op2("__intrinsic_atomic_max", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_max", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicAnd", _atomic_op2("__intrinsic_atomic_and", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_and", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicOr", _atomic_op2("__intrinsic_atomic_or", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_or", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicXor", _atomic_op2("__intrinsic_atomic_xor", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_xor", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicExchange", _atomic_op2("__intrinsic_atomic_exchange", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op2("__intrinsic_atomic_exchange", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); add_function("atomicCompSwap", _atomic_op3("__intrinsic_atomic_comp_swap", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::uint_type), _atomic_op3("__intrinsic_atomic_comp_swap", - shader_storage_buffer_object, + buffer_atomics_supported, glsl_type::int_type), NULL); -- 2.30.2