[Mesa-dev] [PATCH] intel: Set ctx's drawbuffer according to drawables visual

Brian Paul brianp at vmware.com
Thu Aug 4 07:41:01 PDT 2011


On 08/04/2011 07:39 AM, Benjamin Franzke wrote:
> 2011/8/4 Brian Paul<brianp at vmware.com>:
>> On 08/04/2011 06:31 AM, Benjamin Franzke wrote:
>>>
>>> Fixes https://bugs.freedesktop.org/show_bug.cgi?id=39588
>>>
>>> egl_dri2 creates contexts with a doubleBufferConfig when PIXMAP and
>>> WINDOW bit is request, so _mesa_init_color sets DrawBuffer[0] to
>>> GL_BACK.
>>> If a pixmap surface is created egl_dri2 will use a single buffer config,
>>> so MakeCurrent has to adjust DrawBuffer[0] to the current drawable.
>>> ---
>>>   src/mesa/drivers/dri/intel/intel_context.c |    6 ++++++
>>>   1 files changed, 6 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/src/mesa/drivers/dri/intel/intel_context.c
>>> b/src/mesa/drivers/dri/intel/intel_context.c
>>> index fe8be08..0eeffc0 100644
>>> --- a/src/mesa/drivers/dri/intel/intel_context.c
>>> +++ b/src/mesa/drivers/dri/intel/intel_context.c
>>> @@ -970,6 +970,12 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
>>>          readFb = driReadPriv->driverPrivate;
>>>          driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1;
>>>          driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1;
>>> +
>>> +         if (fb->Visual.doubleBufferMode) {
>>> +            intel->ctx.Color.DrawBuffer[0] = GL_BACK;
>>> +         } else {
>>> +            intel->ctx.Color.DrawBuffer[0] = GL_FRONT;
>>> +         }
>>>         }
>>>
>>>         intel_prepare_render(intel);
>>
>> This doesn't seem right to me.  We shouldn't be changing context state like
>> that during a make-current() call.
>>
>> During context initialization we call _mesa_init_color() where we set
>> ctx->Color.DrawBuffer[0] to either GL_BACK or GL_FRONT depending on the
>> visual's double-buffer flag.  You might investigate why that's not doing the
>> job.
>
> Yea, I saw that, but the problem is it sets GL_BACK/GL_FRONT depending
> on the contexts config,
> which may be different from the config used for the drawable (as
> described in the commit message).
>
> So mixing configs could be defined as invalid, but its also allowed in
> src/mesa/main/context.c:1324
>
> Furthermore st/mesa also modifes the state in make_current, see
> st_manager.c:781.
>
> Any ideas where to put it instead?

OK, I see.  How about doing something like this instead:

ctx->Color.DrawBuffer[0] = ctx->DrawBuffer->ColorDrawBuffer[0];

The gl_framebuffer also carries the current drawbuffer state (since 
GL_EXT_framebuffer_object came along).  The framebuffer's state gets 
set upon creation and when glDrawBuffer() is called.

I think this is the behaviour that I'd expect if I were alternately 
rendering to single and double-buffered windows with one context.

What do you think?

BTW, we'd probably want to copy/update all elements of the 
ColorDrawBuffer[] array plus the ColorReadBuffer state.

-Brian


More information about the mesa-dev mailing list