[Mesa-dev] [PATCH 4/4] i965/es3.1: Implement glMemoryBarrierByRegion

Ilia Mirkin imirkin at alum.mit.edu
Fri Jul 31 10:25:37 PDT 2015


On Fri, Jul 31, 2015 at 8:15 AM, Marta Lofstedt
<marta.lofstedt at linux.intel.com> wrote:
> From: Marta Lofstedt <marta.lofstedt at intel.com>
>
> Signed-off-by: Marta Lofstedt <marta.lofstedt at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_program.c | 34 +++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
> index 85e271d..332d84e 100644
> --- a/src/mesa/drivers/dri/i965/brw_program.c
> +++ b/src/mesa/drivers/dri/i965/brw_program.c
> @@ -226,6 +226,39 @@ brw_memory_barrier(struct gl_context *ctx, GLbitfield barriers)
>     brw_emit_pipe_control_flush(brw, bits);
>  }
>
> +static void
> +brw_memory_barrier_by_region(struct gl_context *ctx, GLbitfield barriers)
> +{
> +   GLbitfield all_allowed_bits = GL_ATOMIC_COUNTER_BARRIER_BIT |
> +      GL_FRAMEBUFFER_BARRIER_BIT |
> +      GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
> +      GL_SHADER_STORAGE_BARRIER_BIT |
> +      GL_TEXTURE_FETCH_BARRIER_BIT |
> +      GL_UNIFORM_BARRIER_BIT;
> +   /*
> +    * According to OpenGL ES 3.1 spec. April 29, 2015, 7.11.2:
> +    * "When barriers are ALL_BARRIERS_BIT, shader memory access
> +    * will be synchronized realtive to all theese barrier bits,
> +    * but not to other barrier bits specific to MemoryBarrier."
> +    * I.e if bariiers is the special value GL_ALL_BARRIER_BITS,
> +    * then all barriers allowed by glMemoryBarrierByRegion
> +    * should be activated.
> +   */
> +   if (barriers == GL_ALL_BARRIER_BITS)
> +      return brw_memory_barrier(ctx, all_allowed_bits);
> +
> +   /*
> +    * If barriers contain a value that is not allowed
> +    * for glMemoryBarrierByRegion an GL_INVALID_VALUE
> +    * should be generated.
> +   */
> +   if ((all_allowed_bits | barriers) ^ all_allowed_bits)
> +       _mesa_error(ctx, GL_INVALID_VALUE,
> +            "glMemoryBarrierByRegion(unsupported barrier bit");

It's fairly unusual to do _mesa_error() in the driver. It's done for
some texture stuff, but in general such checking is left to the common
implementation.

Is the list of allowed bits a per-driver thing? If so, perhaps there
should be a ctx->Const.MemoryBarriers bitfield?

And then you wouldn't even need this separate callback (at least for
now) and just use functions->MemoryBarrier().

Also as Matt pointed out, this is a very unusual (for mesa) way of
checking bits.

> +
> +   return brw_memory_barrier(ctx, barriers);
> +}
> +
>  void
>  brw_add_texrect_params(struct gl_program *prog)
>  {
> @@ -285,6 +318,7 @@ void brwInitFragProgFuncs( struct dd_function_table *functions )
>     functions->LinkShader = brw_link_shader;
>
>     functions->MemoryBarrier = brw_memory_barrier;
> +   functions->MemoryBarrierByRegion = brw_memory_barrier_by_region;
>  }
>
>  struct shader_times {
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list