[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