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

Marta Lofstedt marta.lofstedt at linux.intel.com
Fri Jul 31 05:15:53 PDT 2015


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");
+
+   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



More information about the mesa-dev mailing list