Merge commit 'origin/gallium-0.1'
[mesa.git] / src / mesa / drivers / dri / r300 / radeon_state.c
index 0cacbb5ebf5e4d16a0c0016b93b0bf46f36b1005..c401da6c544d108afeef7c9fdf6f9a897b573f5c 100644 (file)
@@ -33,23 +33,22 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *   Keith Whitwell <keith@tungstengraphics.com>
  */
 
-#include "glheader.h"
-#include "imports.h"
-#include "api_arrayelt.h"
-#include "enums.h"
-#include "colormac.h"
-#include "light.h"
+#include "main/glheader.h"
+#include "main/imports.h"
+#include "main/api_arrayelt.h"
+#include "main/enums.h"
+#include "main/framebuffer.h"
+#include "main/colormac.h"
+#include "main/light.h"
 
 #include "swrast/swrast.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 #include "tnl/tnl.h"
 #include "tnl/t_pipeline.h"
 #include "swrast_setup/swrast_setup.h"
 
-#include "r200_context.h"
 #include "radeon_ioctl.h"
 #include "radeon_state.h"
-#include "r200_state.h"
 #include "r300_ioctl.h"
 
 
@@ -120,8 +119,6 @@ void radeonUpdateScissor(GLcontext* ctx)
 {
        radeonContextPtr radeon = RADEON_CONTEXT(ctx);
 
-       assert(radeon->state.scissor.enabled == ctx->Scissor.Enabled);
-
        if (radeon->dri.drawable) {
                __DRIdrawablePrivate *dPriv = radeon->dri.drawable;
                int x1 = dPriv->x + ctx->Scissor.X;
@@ -129,8 +126,8 @@ void radeonUpdateScissor(GLcontext* ctx)
 
                radeon->state.scissor.rect.x1 = x1;
                radeon->state.scissor.rect.y1 = y1;
-               radeon->state.scissor.rect.x2 = x1 + ctx->Scissor.Width - 1;
-               radeon->state.scissor.rect.y2 = y1 + ctx->Scissor.Height - 1;
+               radeon->state.scissor.rect.x2 = x1 + ctx->Scissor.Width;
+               radeon->state.scissor.rect.y2 = y1 + ctx->Scissor.Height;
 
                radeonRecalcScissorRects(radeon);
        }
@@ -138,15 +135,9 @@ void radeonUpdateScissor(GLcontext* ctx)
 
 static void radeonScissor(GLcontext* ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
-       radeonContextPtr radeon = RADEON_CONTEXT(ctx);
-
        if (ctx->Scissor.Enabled) {
                /* We don't pipeline cliprect changes */
-               if (IS_FAMILY_R200(radeon))
-                       R200_FIREVERTICES((r200ContextPtr)radeon);
-               else
-                       r300Flush(ctx);
-
+               r300Flush(ctx);
                radeonUpdateScissor(ctx);
        }
 }
@@ -155,35 +146,49 @@ static void radeonScissor(GLcontext* ctx, GLint x, GLint y, GLsizei w, GLsizei h
 /**
  * Update cliprects and scissors.
  */
-void radeonSetCliprects(radeonContextPtr radeon, GLenum mode)
+void radeonSetCliprects(radeonContextPtr radeon)
 {
-       __DRIdrawablePrivate *dPriv = radeon->dri.drawable;
-
-       switch (mode) {
-       case GL_FRONT_LEFT:
-               radeon->numClipRects = dPriv->numClipRects;
-               radeon->pClipRects = dPriv->pClipRects;
-               break;
-       case GL_BACK_LEFT:
-               /* Can't ignore 2d windows if we are page flipping.
-                */
-               if (dPriv->numBackClipRects == 0 || radeon->doPageFlip) {
-                       radeon->numClipRects = dPriv->numClipRects;
-                       radeon->pClipRects = dPriv->pClipRects;
+       __DRIdrawablePrivate *const drawable = radeon->dri.drawable;
+       __DRIdrawablePrivate *const readable = radeon->dri.readable;
+       GLframebuffer *const draw_fb = (GLframebuffer*)drawable->driverPrivate;
+       GLframebuffer *const read_fb = (GLframebuffer*)readable->driverPrivate;
+
+       if (draw_fb->_ColorDrawBufferIndexes[0] == BUFFER_BACK_LEFT) {
+               /* Can't ignore 2d windows if we are page flipping. */
+               if (drawable->numBackClipRects == 0 || radeon->doPageFlip ||
+                   radeon->sarea->pfCurrentPage == 1) {
+                       radeon->numClipRects = drawable->numClipRects;
+                       radeon->pClipRects = drawable->pClipRects;
                } else {
-                       radeon->numClipRects = dPriv->numBackClipRects;
-                       radeon->pClipRects = dPriv->pBackClipRects;
+                       radeon->numClipRects = drawable->numBackClipRects;
+                       radeon->pClipRects = drawable->pBackClipRects;
+               }
+       } else {
+               /* front buffer (or none, or multiple buffers */
+               radeon->numClipRects = drawable->numClipRects;
+               radeon->pClipRects = drawable->pClipRects;
+       }
+
+       if ((draw_fb->Width != drawable->w) ||
+           (draw_fb->Height != drawable->h)) {
+               _mesa_resize_framebuffer(radeon->glCtx, draw_fb,
+                                        drawable->w, drawable->h);
+               draw_fb->Initialized = GL_TRUE;
+       }
+
+       if (drawable != readable) {
+               if ((read_fb->Width != readable->w) ||
+                   (read_fb->Height != readable->h)) {
+                       _mesa_resize_framebuffer(radeon->glCtx, read_fb,
+                                                readable->w, readable->h);
+                       read_fb->Initialized = GL_TRUE;
                }
-               break;
-       default:
-               fprintf(stderr, "bad mode in radeonSetCliprects\n");
-               radeon->numClipRects = 0;
-               radeon->pClipRects = 0;
-               return;
        }
 
        if (radeon->state.scissor.enabled)
                radeonRecalcScissorRects(radeon);
+
+       radeon->lastStamp = drawable->lastStamp;
 }
 
 
@@ -198,10 +203,7 @@ void radeonEnable(GLcontext* ctx, GLenum cap, GLboolean state)
        switch(cap) {
        case GL_SCISSOR_TEST:
                /* We don't pipeline cliprect & scissor changes */
-               if (IS_FAMILY_R200(radeon))
-                       R200_FIREVERTICES((r200ContextPtr)radeon);
-               else
-                       r300Flush(ctx);
+               r300Flush(ctx);
 
                radeon->state.scissor.enabled = state;
                radeonUpdateScissor(ctx);
@@ -229,9 +231,6 @@ void radeonInitState(radeonContextPtr radeon)
                radeon->state.color.drawOffset = radeon->radeonScreen->frontOffset;
                radeon->state.color.drawPitch = radeon->radeonScreen->frontPitch;
        }
-
-       radeon->state.pixel.readOffset = radeon->state.color.drawOffset;
-       radeon->state.pixel.readPitch = radeon->state.color.drawPitch;
 }