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 Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> --- Notes: git://people.freedesktop.org/~jljusten/mesa cs-shader-barrier-funcs-v1 http://patchwork.freedesktop.org/bundle/jljusten/cs-shader-barrier-funcs-v1 Tested with the OpenGLES 3.1 CTS test suite on my cs branch. With these patches reverted, these tests fail: * ES31-CTS.compute_shader.work-group-size * ES31-CTS.compute_shader.shared-simple * ES31-CTS.compute_shader.shared-struct * ES31-CTS.compute_shader.atomic-case1 * ES31-CTS.compute_shader.shared-indexing src/glsl/builtin_functions.cpp | 134 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp index 509a57b..2bb7bcb 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; } @@ -715,6 +721,11 @@ private: ir_function_signature *_EndStreamPrimitive(builtin_available_predicate avail, const glsl_type *stream_type); B0(barrier) + B0(groupMemoryBarrier) + B0(memoryBarrierAtomicCounter) + B0(memoryBarrierBuffer) + B0(memoryBarrierImage) + B0(memoryBarrierShared) BA2(textureQueryLod); B1(textureQueryLevels); @@ -787,6 +798,26 @@ private: builtin_available_predicate avail); ir_function_signature *_memory_barrier( builtin_available_predicate avail); + ir_function_signature *_group_memory_barrier_intrinsic( + builtin_available_predicate avail); + ir_function_signature *_group_memory_barrier( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_atomic_counter_intrinsic( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_atomic_counter( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_buffer_intrinsic( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_buffer( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_image_intrinsic( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_image( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_shared_intrinsic( + builtin_available_predicate avail); + ir_function_signature *_memory_barrier_shared( + builtin_available_predicate avail); ir_function_signature *_shader_clock_intrinsic(builtin_available_predicate avail, const glsl_type *type); @@ -968,6 +999,22 @@ builtin_builder::create_intrinsics() _shader_clock_intrinsic(shader_clock, glsl_type::uvec2_type), NULL); + + add_function("__intrinsic_group_memory_barrier", + _group_memory_barrier_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_atomic_counter", + _memory_barrier_atomic_counter_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_buffer", + _memory_barrier_buffer_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_image", + _memory_barrier_image_intrinsic(compute_shader), + NULL); + add_function("__intrinsic_memory_barrier_shared", + _memory_barrier_shared_intrinsic(compute_shader), + NULL); } /** @@ -2081,6 +2128,11 @@ builtin_builder::create_builtins() _EndStreamPrimitive(gs_streams, glsl_type::int_type), NULL); add_function("barrier", _barrier(), NULL); + add_function("groupMemoryBarrier", _group_memory_barrier(compute_shader), NULL); + add_function("memoryBarrierAtomicCounter", _memory_barrier_atomic_counter(compute_shader), NULL); + add_function("memoryBarrierBuffer", _memory_barrier_buffer(compute_shader), NULL); + add_function("memoryBarrierImage", _memory_barrier_image(compute_shader), NULL); + add_function("memoryBarrierShared", _memory_barrier_shared(compute_shader), NULL); add_function("textureQueryLOD", _textureQueryLod(texture_query_lod, glsl_type::sampler1D_type, glsl_type::float_type), @@ -5294,6 +5346,86 @@ builtin_builder::_shader_clock(builtin_available_predicate avail, return sig; } +ir_function_signature * +builtin_builder::_group_memory_barrier_intrinsic(builtin_available_predicate avail) +{ + MAKE_INTRINSIC(glsl_type::void_type, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_group_memory_barrier(builtin_available_predicate avail) +{ + MAKE_SIG(glsl_type::void_type, avail, 0); + body.emit(call(shader->symbols->get_function("__intrinsic_group_memory_barrier"), + NULL, sig->parameters)); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_atomic_counter_intrinsic(builtin_available_predicate avail) +{ + MAKE_INTRINSIC(glsl_type::void_type, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_atomic_counter(builtin_available_predicate avail) +{ + MAKE_SIG(glsl_type::void_type, avail, 0); + body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier_atomic_counter"), + NULL, sig->parameters)); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_buffer_intrinsic(builtin_available_predicate avail) +{ + MAKE_INTRINSIC(glsl_type::void_type, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_buffer(builtin_available_predicate avail) +{ + MAKE_SIG(glsl_type::void_type, avail, 0); + body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier_buffer"), + NULL, sig->parameters)); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_image_intrinsic(builtin_available_predicate avail) +{ + MAKE_INTRINSIC(glsl_type::void_type, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_image(builtin_available_predicate avail) +{ + MAKE_SIG(glsl_type::void_type, avail, 0); + body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier_image"), + NULL, sig->parameters)); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_shared_intrinsic(builtin_available_predicate avail) +{ + MAKE_INTRINSIC(glsl_type::void_type, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_memory_barrier_shared(builtin_available_predicate avail) +{ + MAKE_SIG(glsl_type::void_type, avail, 0); + body.emit(call(shader->symbols->get_function("__intrinsic_memory_barrier_shared"), + NULL, sig->parameters)); + return sig; +} + /** @} */ /******************************************************************************/ -- 2.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev