On Fri, Jul 31, 2015 at 8:15 AM, Marta Lofstedt <marta.lofst...@linux.intel.com> wrote: > From: Marta Lofstedt <marta.lofst...@intel.com> > > Signed-off-by: Marta Lofstedt <marta.lofst...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev