[Mesa-dev] OSMesa multiple context problem?

Brian Paul brianp at vmware.com
Wed Sep 21 15:09:31 UTC 2016


On 09/21/2016 08:14 AM, Randall Frank wrote:
> Hello,
>     I have been working around an issue with the OSMesa interface a bit
> and was curious if others see this as a bug.  An example that triggers
> the issue is:
>
> #include <GL/gl.h>
> #include <GL/osmesa.h>
> #include <stdlib.h>
> #include <malloc.h>
>
> int main(int iargs, const char *argv[])
> {
>      void *pBuf0Ptr, *pBuf1Ptr, *pBuf2Ptr;
>      GLsizei iBuf0Width = 720, iBuf0Height = 480;
>      GLsizei iBuf1Width = 720, iBuf1Height = 480;
>      GLsizei iBuf2Width = 120, iBuf2Height = 120;
>      OSMesaContext ctx0, ctx1;
>      GLboolean bOk;
>
>      pBuf0Ptr = memalign(iBuf0Width*iBuf0Height*4, 4);
>      pBuf1Ptr = memalign(iBuf1Width*iBuf1Height*4, 4);
>      pBuf2Ptr = memalign(iBuf2Width*iBuf2Height*4, 4);
>
>      ctx0 = OSMesaCreateContext(GL_RGBA, NULL);
>      ctx1 = OSMesaCreateContext(GL_RGBA, NULL);
>
>      bOk = OSMesaMakeCurrent(ctx0, pBuf0Ptr, GL_UNSIGNED_BYTE,
> iBuf0Width, iBuf0Height);
>      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
>      glFlush();
>
>      bOk = OSMesaMakeCurrent(ctx1, pBuf1Ptr, GL_UNSIGNED_BYTE,
> iBuf1Width, iBuf1Height);
>      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
>      glFlush();
>
>      bOk = OSMesaMakeCurrent(ctx1, pBuf2Ptr, GL_UNSIGNED_BYTE,
> iBuf2Width, iBuf2Height);
>      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
>      glFlush();
>
>      bOk = OSMesaMakeCurrent(ctx0, pBuf0Ptr, GL_UNSIGNED_BYTE,
> iBuf0Width, iBuf0Height);
>      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
>      glFlush();
>
>      exit(0);
> }
>
> When I link this to an gallium enabled Mesa build I get a crash during
> the flush to the previous context in osmesa_st_framebuffer_flush_front().
>
> I looked into it a bit and I believe there may be an issue with
> osmesa_find_buffer(). Since the two contexts initially use the same size
> buffers, this function returns the same osmesa_buffer for each context.
> This causes a problem when we change the size of one of the contexts
> during an OSMesaMakeCurrent() and it changes the buffer fields that are
> effectively (incorrectly?) shared.  The flush on the change of context
> then crashes...
>
> At least that is my read of the issue. Is this interpretation correct?
> If so is there a patch or should we put one together?

Hi Randy,

I don't know if the gallium version of OSMesa has ever got much 
multi-context exercise so I'm not too surprised to hear of a bug.  I 
think you're on the right track.  If you can work it out that'd be 
great.  I don't have much free time right now.

-Brian




More information about the mesa-dev mailing list