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

Francisco Jerez currojerez at riseup.net
Wed Nov 4 08:01:07 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
>
> Signed-off-by: Jordan Justen <jordan.l.justen at 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);
>  
Any reason you have separate methods for these?  Couldn't you re-use the
current _memory_barrier/_memory_barrier_intrinsic constructor and just
pass them the correct intrinsic name as argument?

>     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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- 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/20151104/b5f4f7ef/attachment.sig>


More information about the mesa-dev mailing list