When these functions are called in GLSL code, we create an intrinsic function call:
* groupMemoryBarrier => __intrinsic_group_memory_barrier * memoryBarrierAtomicCounter => __intrinsic_memory_barrier_atomic_counter * memoryBarrierBuffer => __intrinsic_memory_barrier_buffer * memoryBarrierImage => __intrinsic_memory_barrier_image * memoryBarrierShared => __intrinsic_memory_barrier_shared v2: * Consolidate with memoryBarrier function/intrinsic creation (curro) Signed-off-by: Jordan Justen <[email protected]> --- src/glsl/builtin_functions.cpp | 58 +++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp index 509a57b..21ae5ce 100644 --- a/src/glsl/builtin_functions.cpp +++ b/src/glsl/builtin_functions.cpp @@ -459,9 +459,15 @@ fp64(const _mesa_glsl_parse_state *state) } static bool +compute_shader(const _mesa_glsl_parse_state *state) +{ + return state->stage == MESA_SHADER_COMPUTE; +} + +static bool barrier_supported(const _mesa_glsl_parse_state *state) { - return state->stage == MESA_SHADER_COMPUTE || + return compute_shader(state) || state->stage == MESA_SHADER_TESS_CTRL; } @@ -785,7 +791,9 @@ private: ir_function_signature *_memory_barrier_intrinsic( builtin_available_predicate avail); - ir_function_signature *_memory_barrier( + void add_memory_barrier_function( + const char *function_name, + const char *intrinsic_name, builtin_available_predicate avail); ir_function_signature *_shader_clock_intrinsic(builtin_available_predicate avail, @@ -963,6 +971,21 @@ builtin_builder::create_intrinsics() add_function("__intrinsic_memory_barrier", _memory_barrier_intrinsic(shader_image_load_store), NULL); + add_function("__intrinsic_group_memory_barrier", + _memory_barrier_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_atomic_counter", + _memory_barrier_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_buffer", + _memory_barrier_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_image", + _memory_barrier_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_shared", + _memory_barrier_intrinsic(compute_shader), + NULL); add_function("__intrinsic_shader_clock", _shader_clock_intrinsic(shader_clock, @@ -2753,9 +2776,24 @@ builtin_builder::create_builtins() add_image_functions(true); - add_function("memoryBarrier", - _memory_barrier(shader_image_load_store), - NULL); + add_memory_barrier_function("memoryBarrier", + "__intrinsic_memory_barrier", + shader_image_load_store); + add_memory_barrier_function("groupMemoryBarrier", + "__intrinsic_group_memory_barrier", + compute_shader); + add_memory_barrier_function("memoryBarrierAtomicCounter", + "__intrinsic_memory_barrier_atomic_counter", + compute_shader); + add_memory_barrier_function("memoryBarrierBuffer", + "__intrinsic_memory_barrier_buffer", + compute_shader); + add_memory_barrier_function("memoryBarrierImage", + "__intrinsic_memory_barrier_image", + compute_shader); + add_memory_barrier_function("memoryBarrierShared", + "__intrinsic_memory_barrier_shared", + compute_shader); add_function("clock2x32ARB", _shader_clock(shader_clock, @@ -5263,13 +5301,15 @@ builtin_builder::_memory_barrier_intrinsic(builtin_available_predicate avail) return sig; } -ir_function_signature * -builtin_builder::_memory_barrier(builtin_available_predicate avail) +void +builtin_builder::add_memory_barrier_function(const char *function_name, + const char *intrinsic_name, + builtin_available_predicate avail) { MAKE_SIG(glsl_type::void_type, avail, 0); - body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier"), + body.emit(call(shader->symbols->get_function(intrinsic_name), NULL, sig->parameters)); - return sig; + add_function(function_name, sig, NULL); } ir_function_signature * -- 2.6.2 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
