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

Rob Clark robdclark at gmail.com
Mon Aug 24 08:08:50 PDT 2015


ping?  It would be kinda nice to have gles working again.

Fwiw, issue seems to be an off-by-one in the dispatch table, resulting
in (for example) glCheckFramebufferStatus() ending up in
_mesa_DeleteFramebuffers(), which ends badly..

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6ec77e3 in _mesa_DeleteFramebuffers (n=36160,
framebuffers=0x0) at main/fbobject.c:2581
2581          if (framebuffers[i] > 0) {
(gdb) bt
#0  0x00007ffff6ec77e3 in _mesa_DeleteFramebuffers (n=36160,
framebuffers=0x0) at main/fbobject.c:2581
#1  0x00007ffff659ec80 in glCheckFramebufferStatus (target=36160) at
es2api/glapi_mapi_tmp.h:2629
#2  0x000000000049f04d in retrace_glCheckFramebufferStatus (call=...)
at /home/robclark/src/apitrace/build/retrace/glretrace_gl.cpp:26685
#3  0x000000000040b854 in retrace::retraceCall
(call=call at entry=0xacf900) at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:239
#4  0x000000000040beca in runLeg (call=0xacf900, this=0xa68660) at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:399
#5  runRace (this=0xa68660) at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:370
#6  retrace::RelayRace::run (this=<optimized out>) at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:539
#7  0x00000000004078cb in mainLoop () at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:599
#8  main (argc=4, argv=0x7fffffffdfb8) at
/home/robclark/src/apitrace/retrace/retrace_main.cpp:908



BR,
-R


On Fri, Aug 21, 2015 at 5:41 PM, Rob Clark <robdclark at gmail.com> wrote:
> 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