summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoland Scheidegger <sroland@tungstengraphics.com>2007-07-15 22:47:42 +0200
committerRoland Scheidegger <sroland@tungstengraphics.com>2007-07-15 22:47:42 +0200
commita1ec23a30f3ff9583b32428c2c357b9ef66f3a50 (patch)
treec213baa8482e4b38153ccf613d3fabc1ad259d5e /src
parent8172f50419b370c4608d1bbc6cac4d77e3e45804 (diff)
fix bogus fb/drawable information (fixes xdemos/wincopy)
the framebuffer objects attached to drawables can have invalidate state associated with them, since for the window framebuffer this is per-context state and not per-fbo state. Since drivers may rely on that information (otherwise would need to check if currently the window-framebuffer is bound in a lot of places) fix it up in _mesa_make_current (ugly).
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i915tex/intel_context.c5
-rw-r--r--src/mesa/main/context.c11
2 files changed, 14 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i915tex/intel_context.c b/src/mesa/drivers/dri/i915tex/intel_context.c
index 146426fd37..cb3ec4ccfa 100644
--- a/src/mesa/drivers/dri/i915tex/intel_context.c
+++ b/src/mesa/drivers/dri/i915tex/intel_context.c
@@ -289,8 +289,9 @@ static void
intelCheckFrontUpdate(GLcontext * ctx)
{
struct intel_context *intel = intel_context(ctx);
- if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] ==
- BUFFER_BIT_FRONT_LEFT) {
+ /* can't use _ColorDrawBufferMask as its value
+ might change if a different drawable is bound! */
+ if (ctx->Color.DrawBuffer[0] == GL_FRONT_LEFT) {
intelScreenPrivate *screen = intel->intelScreen;
__DRIdrawablePrivate *dPriv = intel->driDrawable;
if (screen->current_rotation != 0) {
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 255023c0fa..183a552d40 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1495,9 +1495,20 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
*/
if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
_mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
+ /* fix up the fb fields - these will end up wrong otherwise
+ if the DRIdrawable changes, and someone may rely on them.
+ */
+ /* What a mess!?! */
+ int i;
+ GLenum buffers[MAX_DRAW_BUFFERS];
+ for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
+ buffers[i] = newCtx->Color.DrawBuffer[i];
+ }
+ _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
}
if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
_mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
+ _mesa_ReadBuffer(newCtx->Pixel.ReadBuffer);
}
newCtx->NewState |= _NEW_BUFFERS;