dri/nouveau: Fix swrast fallbacks when the read and draw buffers aren't the same.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 22 Mar 2010 17:25:30 +0000 (18:25 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 22 Mar 2010 17:41:23 +0000 (18:41 +0100)
src/mesa/drivers/dri/nouveau/nouveau_span.c

index f1a56dd..1bfdecc 100644 (file)
@@ -32,7 +32,6 @@
 #include "swrast/swrast.h"
 
 #define LOCAL_VARS                                                     \
-       struct gl_framebuffer *fb = ctx->DrawBuffer;                    \
        struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; \
        GLuint p;                                                       \
        (void)p;
 #define HW_CLIPLOOP() {                                                        \
        int minx = 0;                                                   \
        int miny = 0;                                                   \
-       int maxx = fb->Width;                                           \
-       int maxy = fb->Height;
+       int maxx = rb->Width;                                           \
+       int maxy = rb->Height;
 
 #define HW_ENDCLIPLOOP() }
 
-#define Y_FLIP(y) (fb->Name ? (y) : rb->Height - 1 - (y))
+#define Y_FLIP(y) (rb->Name ? (y) : rb->Height - 1 - (y))
 
 /* RGB565 span functions */
 #define SPANTMP_PIXEL_FMT GL_RGB
@@ -144,17 +143,28 @@ texture_unit_map_unmap(GLcontext *ctx, struct gl_texture_unit *u, GLboolean map)
 }
 
 static void
-span_map_unmap(GLcontext *ctx, GLboolean map)
+framebuffer_map_unmap(struct gl_framebuffer *fb, GLboolean map)
 {
        int i;
 
-       for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++)
-               renderbuffer_map_unmap(ctx->DrawBuffer->_ColorDrawBuffers[i], map);
+       for (i = 0; i < fb->_NumColorDrawBuffers; i++)
+               renderbuffer_map_unmap(fb->_ColorDrawBuffers[i], map);
+
+       renderbuffer_map_unmap(fb->_ColorReadBuffer, map);
+
+       if (fb->_DepthBuffer)
+               renderbuffer_map_unmap(fb->_DepthBuffer->Wrapped, map);
+}
+
+static void
+span_map_unmap(GLcontext *ctx, GLboolean map)
+{
+       int i;
 
-       renderbuffer_map_unmap(ctx->DrawBuffer->_ColorReadBuffer, map);
+       framebuffer_map_unmap(ctx->DrawBuffer, map);
 
-       if (ctx->DrawBuffer->_DepthBuffer)
-               renderbuffer_map_unmap(ctx->DrawBuffer->_DepthBuffer->Wrapped, map);
+       if (ctx->ReadBuffer != ctx->DrawBuffer)
+               framebuffer_map_unmap(ctx->ReadBuffer, map);
 
        for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
                texture_unit_map_unmap(ctx, &ctx->Texture.Unit[i], map);