[Mesa-dev] [PATCH v2 1/3] glsl: Add new barrier functions for compute shaders
Jordan Justen
jordan.l.justen at intel.com
Wed Nov 4 12:28:03 PST 2015
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 <jordan.l.justen at intel.com>
---
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
More information about the mesa-dev
mailing list