[Mesa-dev] [PATCH v3 1/3] glsl: Add new barrier functions for compute shaders

Francisco Jerez currojerez at riseup.net
Fri Nov 6 02:26:35 PST 2015


Jordan Justen <jordan.l.justen at intel.com> writes:

> 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)
>
> v3:
>  * Instead of add_memory_barrier_function, add an intrinsic_name
>    parameter to _memory_barrier (curro)
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Francisco Jerez <currojerez at riseup.net>

Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> ---
>  src/glsl/builtin_functions.cpp | 55 +++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 49 insertions(+), 6 deletions(-)
>
> diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
> index 509a57b..1349444 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,8 +791,8 @@ private:
>  
>     ir_function_signature *_memory_barrier_intrinsic(
>        builtin_available_predicate avail);
> -   ir_function_signature *_memory_barrier(
> -      builtin_available_predicate avail);
> +   ir_function_signature *_memory_barrier(const char *intrinsic_name,
> +                                          builtin_available_predicate avail);
>  
>     ir_function_signature *_shader_clock_intrinsic(builtin_available_predicate avail,
>                                                    const glsl_type *type);
> @@ -963,6 +969,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,
> @@ -2754,7 +2775,28 @@ builtin_builder::create_builtins()
>     add_image_functions(true);
>  
>     add_function("memoryBarrier",
> -                _memory_barrier(shader_image_load_store),
> +                _memory_barrier("__intrinsic_memory_barrier",
> +                                shader_image_load_store),
> +                NULL);
> +   add_function("groupMemoryBarrier",
> +                _memory_barrier("__intrinsic_group_memory_barrier",
> +                                compute_shader),
> +                NULL);
> +   add_function("memoryBarrierAtomicCounter",
> +                _memory_barrier("__intrinsic_memory_barrier_atomic_counter",
> +                                compute_shader),
> +                NULL);
> +   add_function("memoryBarrierBuffer",
> +                _memory_barrier("__intrinsic_memory_barrier_buffer",
> +                                compute_shader),
> +                NULL);
> +   add_function("memoryBarrierImage",
> +                _memory_barrier("__intrinsic_memory_barrier_image",
> +                                compute_shader),
> +                NULL);
> +   add_function("memoryBarrierShared",
> +                _memory_barrier("__intrinsic_memory_barrier_shared",
> +                                compute_shader),
>                  NULL);
>  
>     add_function("clock2x32ARB",
> @@ -5264,10 +5306,11 @@ builtin_builder::_memory_barrier_intrinsic(builtin_available_predicate avail)
>  }
>  
>  ir_function_signature *
> -builtin_builder::_memory_barrier(builtin_available_predicate avail)
> +builtin_builder::_memory_barrier(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;
>  }
> -- 
> 2.6.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151106/1673fcfb/attachment.sig>


More information about the mesa-dev mailing list