[Mesa-dev] [PATCH v3] mesa: Implement glMemoryBarrierByRegion

Rob Clark robdclark at gmail.com
Fri Aug 21 14:41:48 PDT 2015


so this one appears to break gles dispatch (on i965, but probably others)..

Somehow glCheckFramebufferStatus() ends up in
_mesa_DeleteFramebuffers(), which doesn't go so well..  not sure I
understand the dispatch code to understand what the issue is.  But
could someone either fix it or revert this patch?

BR,
-R

On Fri, Aug 14, 2015 at 7:30 AM, Marta Lofstedt
<marta.lofstedt at linux.intel.com> wrote:
> From: Marta Lofstedt <marta.lofstedt at intel.com>
>
> The function glMemoryBarrierByRegion is part of
> OpenGL ES 3.1 and OpenGL 4.5 core and compatibility
> profiles.
>
> Signed-off-by: Marta Lofstedt <marta.lofstedt at intel.com>
> ---
>  src/mapi/glapi/gen/GL4x.xml             |  6 +++++
>  src/mesa/main/shaderimage.c             | 40 +++++++++++++++++++++++++++++++++
>  src/mesa/main/shaderimage.h             |  3 +++
>  src/mesa/main/tests/dispatch_sanity.cpp |  9 ++++++--
>  4 files changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/src/mapi/glapi/gen/GL4x.xml b/src/mapi/glapi/gen/GL4x.xml
> index 94ddfb7..dee5027 100644
> --- a/src/mapi/glapi/gen/GL4x.xml
> +++ b/src/mapi/glapi/gen/GL4x.xml
> @@ -44,4 +44,10 @@
>    <enum name="DEPTH_STENCIL_TEXTURE_MODE"              value="0x90EA"/>
>  </category>
>
> +<category name="4.5">
> +  <function name="MemoryBarrierByRegion" es2="3.1">
> +    <param name="barriers" type="GLbitfield"/>
> +  </function>
> +</category>
> +
>  </OpenGLAPI>
> diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
> index a348cdb..7337f22 100644
> --- a/src/mesa/main/shaderimage.c
> +++ b/src/mesa/main/shaderimage.c
> @@ -653,3 +653,43 @@ _mesa_MemoryBarrier(GLbitfield barriers)
>     if (ctx->Driver.MemoryBarrier)
>        ctx->Driver.MemoryBarrier(ctx, barriers);
>  }
> +
> +void GLAPIENTRY
> +_mesa_MemoryBarrierByRegion(GLbitfield barriers)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   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;
> +
> +   if (ctx->Driver.MemoryBarrier) {
> +      /* From section 7.11.2 of the OpenGL ES 3.1 specification:
> +       *
> +       *    "When barriers is ALL_BARRIER_BITS, shader memory accesses will be
> +       *     synchronized relative to all these barrier bits, but not to other
> +       *     barrier bits specific to MemoryBarrier."
> +       *
> +       * That is, if barriers is the special value GL_ALL_BARRIER_BITS, then all
> +       * barriers allowed by glMemoryBarrierByRegion should be activated."
> +       */
> +      if (barriers == GL_ALL_BARRIER_BITS)
> +         return ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
> +
> +      /* From section 7.11.2 of the OpenGL ES 3.1 specification:
> +       *
> +       *    "An INVALID_VALUE error is generated if barriers is not the special
> +       *     value ALL_BARRIER_BITS, and has any bits set other than those
> +       *     described above."
> +       */
> +      if ((barriers & ~all_allowed_bits) != 0) {
> +         _mesa_error(ctx, GL_INVALID_VALUE,
> +                     "glMemoryBarrierByRegion(unsupported barrier bit");
> +      }
> +
> +      ctx->Driver.MemoryBarrier(ctx, barriers);
> +   }
> +}
> diff --git a/src/mesa/main/shaderimage.h b/src/mesa/main/shaderimage.h
> index 33d8a1e..d08ece8 100644
> --- a/src/mesa/main/shaderimage.h
> +++ b/src/mesa/main/shaderimage.h
> @@ -68,6 +68,9 @@ _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
>  void GLAPIENTRY
>  _mesa_MemoryBarrier(GLbitfield barriers);
>
> +void GLAPIENTRY
> +_mesa_MemoryBarrierByRegion(GLbitfield barriers);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
> index af89d2c..59107eb 100644
> --- a/src/mesa/main/tests/dispatch_sanity.cpp
> +++ b/src/mesa/main/tests/dispatch_sanity.cpp
> @@ -851,6 +851,9 @@ const struct function common_desktop_functions_possible[] = {
>  // { "glTextureStorage2DMultisampleEXT", 43, -1 },      // XXX: Add to xml
>  // { "glTextureStorage3DMultisampleEXT", 43, -1 },      // XXX: Add to xml
>
> +/* GL 4.5 */
> +   { "glMemoryBarrierByRegion", 45, -1 },
> +
>     /* GL_ARB_internalformat_query */
>     { "glGetInternalformativ", 30, -1 },
>
> @@ -1739,6 +1742,9 @@ const struct function gl_core_functions_possible[] = {
>  // { "glTextureStorage2DMultisampleEXT", 43, -1 },      // XXX: Add to xml
>  // { "glTextureStorage3DMultisampleEXT", 43, -1 },      // XXX: Add to xml
>
> +/* GL 4.5 */
> +   { "glMemoryBarrierByRegion", 45, -1 },
> +
>     /* GL_ARB_direct_state_access */
>     { "glCreateTransformFeedbacks", 45, -1 },
>     { "glTransformFeedbackBufferBase", 45, -1 },
> @@ -2461,8 +2467,7 @@ const struct function gles31_functions_possible[] = {
>     { "glGetBooleani_v", 31, -1 },
>     { "glMemoryBarrier", 31, -1 },
>
> -   // FINISHME: This function has not been implemented yet.
> -   // { "glMemoryBarrierByRegion", 31, -1 },
> +   { "glMemoryBarrierByRegion", 31, -1 },
>
>     { "glTexStorage2DMultisample", 31, -1 },
>     { "glGetMultisamplefv", 31, -1 },
> --
> 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