- Fixed scissor rectangle not moving with the window (Xorg bug #1731).
authorFelix Kuehling <fxkuehl@gmx.de>
Sat, 5 Feb 2005 21:21:02 +0000 (21:21 +0000)
committerFelix Kuehling <fxkuehl@gmx.de>
Sat, 5 Feb 2005 21:21:02 +0000 (21:21 +0000)
- Flush buffered primitives before changing scissors.
- Require Savage DRM version 2.1.0, so that the broken single-cliprect
  code can finally rest in peace.
- Removed some more dead code.

src/mesa/drivers/dri/savage/savage_init.h
src/mesa/drivers/dri/savage/savage_xmesa.c
src/mesa/drivers/dri/savage/savagecontext.h
src/mesa/drivers/dri/savage/savageioctl.c
src/mesa/drivers/dri/savage/savagestate.c
src/mesa/drivers/dri/savage/savagestate.h

index 74b40d8729e24396fb499f2ce4a018e6e382fb08..9cf8e66b7c2a8b11919291a64847641a70b22adb 100644 (file)
@@ -83,8 +83,6 @@ typedef struct {
 #include "savagecontext.h"
 
 extern void savageGetLock( savageContextPtr imesa, GLuint flags );
-extern void savageEmitScissorValues( savageContextPtr imesa, int box_nr, int emit );
-extern void savageEmitDrawingRectangle( savageContextPtr imesa );
 extern void savageXMesaSetBackClipRects( savageContextPtr imesa );
 extern void savageXMesaSetFrontClipRects( savageContextPtr imesa );
 
index 9abb5584714b01fe657bece0233e45a5730d829c..38f679aee378be34125330d449a2828642f45c79 100644 (file)
@@ -601,11 +601,10 @@ void savageXMesaSetFrontClipRects( savageContextPtr imesa )
 
    imesa->numClipRects = dPriv->numClipRects;
    imesa->pClipRects = dPriv->pClipRects;
-   imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
    imesa->drawX = dPriv->x;
    imesa->drawY = dPriv->y;
 
-   savageEmitDrawingRectangle( imesa );
+   savageCalcViewport( imesa->glCtx );
 }
 
 
@@ -630,10 +629,7 @@ void savageXMesaSetBackClipRects( savageContextPtr imesa )
       imesa->drawY = dPriv->backY;
    }
 
-   savageEmitDrawingRectangle( imesa );
-   imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
-
-
+   savageCalcViewport( imesa->glCtx );
 }
 
 
@@ -769,8 +765,7 @@ void savageGetLock( savageContextPtr imesa, GLuint flags )
                       SAVAGE_UPLOAD_FOGTBL |
                       SAVAGE_UPLOAD_TEX0 |
                       SAVAGE_UPLOAD_TEX1 |
-                      SAVAGE_UPLOAD_TEXGLOBAL |
-                      SAVAGE_UPLOAD_CLIPRECTS);
+                      SAVAGE_UPLOAD_TEXGLOBAL);
       imesa->lostContext = GL_TRUE;
       sarea->ctxOwner = me;
    }
@@ -929,7 +924,7 @@ void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc
    __DRIscreenPrivate *psp;
    static const __DRIversion ddx_expected = { 2, 0, 0 };
    static const __DRIversion dri_expected = { 4, 0, 0 };
-   static const __DRIversion drm_expected = { 2, 0, 0 };
+   static const __DRIversion drm_expected = { 2, 1, 0 };
 
    if ( ! driCheckDriDdxDrmVersions2( "Savage",
                                      dri_version, & dri_expected,
index b2d47a469398201c2935985b241e2b8d444c5e27..2e9671afd91d3600e831534cd2683908f5d8760d 100644 (file)
@@ -79,7 +79,6 @@ typedef struct savage_texture_object_t *savageTextureObjectPtr;
 #define SAVAGE_UPLOAD_FOGTBL   0x8  /* fog table */
 #define SAVAGE_UPLOAD_GLOBAL   0x10 /* most global regs */
 #define SAVAGE_UPLOAD_TEXGLOBAL 0x20 /* TexBlendColor (S4 only) */
-#define SAVAGE_UPLOAD_CLIPRECTS 0x1000 /* FIXME: get rid of this */
 
 /*define the max numer of vertex in vertex buf*/
 #define SAVAGE_MAX_VERTEXS 0x10000
@@ -263,10 +262,14 @@ struct savage_context_t {
     GLuint dirtyAge;
     GLuint any_contend;                /* throttle me harder */
 
-    GLuint scissor;
-    GLboolean scissorChanged;
-    drm_clip_rect_t draw_rect;
-    drm_clip_rect_t scissor_rect;
+    /* Scissor state needs to be mirrored so buffered commands can be
+     * emitted with the old scissor state when scissor state changes.
+     */
+    struct {
+       GLboolean enabled;
+       GLint x, y;
+       GLsizei w, h;
+    } scissor;
 
     drm_context_t hHWContext;
     drm_hw_lock_t *driHwLock;
index 51faea0295c006ebfa6839245e0de965b7443816..cd25b620f0dc53eadad7bf0f8b3cc2ffbab57cbc 100644 (file)
@@ -401,8 +401,6 @@ static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
           cmd[1].clear1.mask = depthMask;
           cmd[1].clear1.value = clearDepth;
        }
-
-       imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
    }
 
    if (mask) 
@@ -562,16 +560,25 @@ void savageFlushCmdBufLocked( savageContextPtr imesa, GLboolean discard )
        cmdbuf.vb_stride = imesa->HwVertexSize;
        cmdbuf.cmd_addr = start;
        cmdbuf.size = (imesa->cmdBuf.write - start);
-       if (!imesa->inSwap && imesa->glCtx->Scissor.Enabled) {
+       if (!imesa->inSwap && imesa->scissor.enabled) {
            drm_clip_rect_t *box = dPriv->pClipRects, *ibox;
+           drm_clip_rect_t scissor;
            GLuint nbox = dPriv->numClipRects, nibox;
+           /* transform and clip scissor to viewport */
+           scissor.x1 = MAX2(imesa->scissor.x, 0) + dPriv->x;
+           scissor.y1 = MAX2(dPriv->h - imesa->scissor.y - imesa->scissor.h,
+                             0) + dPriv->y;
+           scissor.x2 = MIN2(imesa->scissor.x + imesa->scissor.w,
+                             dPriv->w) + dPriv->x;
+           scissor.y2 = MIN2(dPriv->h - imesa->scissor.y,
+                             dPriv->h) + dPriv->y;
+           /* intersect cliprects with scissor */
            ibox = malloc(dPriv->numClipRects*sizeof(drm_clip_rect_t));
            if (!ibox) {
                fprintf(stderr, "Out of memory.\n");
                exit(1);
            }
-           nibox = savageIntersectClipRects(ibox, box, nbox,
-                                            &imesa->scissor_rect);
+           nibox = savageIntersectClipRects(ibox, box, nbox, &scissor);
            cmdbuf.nbox = nibox;
            cmdbuf.box_addr = ibox;
        } else {
index b86586c8b802a9610d633d5595a039f2aa76dbe2..b417d1e2aae9464e7ee0a1d5654dd73edc5ab77d 100644 (file)
@@ -632,19 +632,18 @@ static void savageDDDepthMask_s3d(GLcontext *ctx, GLboolean flag)
 
 static void savageDDScissor( GLcontext *ctx, GLint x, GLint y, 
                              GLsizei w, GLsizei h )
-{ 
+{
     savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
-    imesa->scissor_rect.x1 = MAX2(imesa->drawX+x,imesa->draw_rect.x1);
-    imesa->scissor_rect.y1 = MAX2(imesa->drawY+imesa->driDrawable->h -(y+h),
-                                  imesa->draw_rect.y1);
-    imesa->scissor_rect.x2 = MIN2(imesa->drawX+x+w,imesa->draw_rect.x2);
-    imesa->scissor_rect.y2 = MIN2(imesa->drawY+imesa->driDrawable->h - y,
-                                  imesa->draw_rect.y2);
-    
 
-    imesa->scissorChanged=GL_TRUE;
+    /* Emit buffered commands with old scissor state. */
+    FLUSH_BATCH(imesa);
 
-    imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
+    /* Mirror scissors in private context. */
+    imesa->scissor.enabled = ctx->Scissor.Enabled;
+    imesa->scissor.x = x;
+    imesa->scissor.y = y;
+    imesa->scissor.w = w;
+    imesa->scissor.h = h;
 }
 
 
@@ -706,7 +705,7 @@ static void savageDDSetColor(GLcontext *ctx,
  * Window position and viewport transformation
  */
 
-static void savageCalcViewport( GLcontext *ctx )
+void savageCalcViewport( GLcontext *ctx )
 {
    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
    const GLfloat *v = ctx->Viewport._WindowMap.m;
@@ -1196,8 +1195,6 @@ static void savageDDEnable_s4(GLcontext *ctx, GLenum cap, GLboolean state)
             savageDDDepthFunc_s4(ctx,ctx->Depth.Func);
             break;
         case GL_SCISSOR_TEST:
-            imesa->scissor = state;
-            imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
            savageDDScissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
                            ctx->Scissor.Width, ctx->Scissor.Height);
             break;
@@ -1288,8 +1285,6 @@ static void savageDDEnable_s3d(GLcontext *ctx, GLenum cap, GLboolean state)
             savageDDDepthFunc_s3d(ctx,ctx->Depth.Func);
             break;
         case GL_SCISSOR_TEST:
-            imesa->scissor = state;
-            imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS;
            savageDDScissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
                            ctx->Scissor.Width, ctx->Scissor.Height);
             break;
@@ -1359,64 +1354,9 @@ void savageDDUpdateHwState( GLcontext *ctx )
 }
 
 
-void savageEmitDrawingRectangle( savageContextPtr imesa )
-{
-    __DRIdrawablePrivate *dPriv = imesa->driDrawable;
-    savageScreenPrivate *savageScreen = imesa->savageScreen;
-    drm_clip_rect_t *pbox;
-    int nbox;
-   
-
-    int x0 = imesa->drawX;
-    int y0 = imesa->drawY;
-    int x1 = x0 + dPriv->w;
-    int y1 = y0 + dPriv->h;
-
-    pbox = dPriv->pClipRects;  
-    nbox = dPriv->numClipRects;
-       
-
-   
-    /* Coordinate origin of the window - may be offscreen.
-     */
-    /* imesa->BufferSetup[SAVAGE_DESTREG_DR4] = ((y0<<16) | 
-       (((unsigned)x0)&0xFFFF));*/
-  
-    /* Clip to screen.
-     */
-    if (x0 < 0) x0 = 0;
-    if (y0 < 0) y0 = 0;
-    if (x1 > savageScreen->width) x1 = savageScreen->width;
-    if (y1 > savageScreen->height) y1 = savageScreen->height;
-
-
-    if(nbox ==  1)
-    {
-        imesa->draw_rect.x1 = MAX2(x0,pbox->x1);
-        imesa->draw_rect.y1 = MAX2(y0,pbox->y1);
-        imesa->draw_rect.x2 = MIN2(x1,pbox->x2);
-        imesa->draw_rect.y2 = MIN2(y1,pbox->y2);
-    }
-    else
-    {
-        imesa->draw_rect.x1 = x0;
-        imesa->draw_rect.y1 = y0;
-        imesa->draw_rect.x2 = x1;
-        imesa->draw_rect.y2 = y1;
-    }
-   
-    imesa->scissorChanged = GL_TRUE;
-
-    /*   imesa->regs.ni.changed.ni.fDrawCtrl0Changed=GL_TRUE;
-         imesa->regs.ni.changed.ni.fDrawCtrl1Changed=GL_TRUE;*/
-
-    savageCalcViewport (imesa->glCtx);
-}
-
-
 static void savageDDPrintDirty( const char *msg, GLuint state )
 {
-    fprintf(stderr, "%s (0x%x): %s%s%s%s%s%s%s\n",        
+    fprintf(stderr, "%s (0x%x): %s%s%s%s%s%s\n",          
             msg,
             (unsigned int) state,
             (state & SAVAGE_UPLOAD_LOCAL)      ? "upload-local, " : "",
@@ -1424,8 +1364,7 @@ static void savageDDPrintDirty( const char *msg, GLuint state )
             (state & SAVAGE_UPLOAD_TEX1)       ? "upload-tex1, " : "",
             (state & SAVAGE_UPLOAD_FOGTBL)     ? "upload-fogtbl, " : "",
             (state & SAVAGE_UPLOAD_GLOBAL)     ? "upload-global, " : "",
-            (state & SAVAGE_UPLOAD_TEXGLOBAL)  ? "upload-texglobal, " : "",
-            (state & SAVAGE_UPLOAD_CLIPRECTS)  ? "upload-cliprects, " : ""
+            (state & SAVAGE_UPLOAD_TEXGLOBAL)  ? "upload-texglobal, " : ""
             );
 }
 
@@ -1504,28 +1443,6 @@ static void savageEmitChangedRegChunk (savageContextPtr imesa,
 }
 static void savageUpdateRegister_s4(savageContextPtr imesa)
 {
-    /*
-     * Scissors updates drawctrl0 and drawctrl 1
-     */
-    if (imesa->scissorChanged && imesa->savageScreen->driScrnPriv->drmMinor < 1)
-    {
-        if(imesa->scissor)
-        {
-            imesa->regs.s4.drawCtrl0.ni.scissorXStart = imesa->scissor_rect.x1;
-            imesa->regs.s4.drawCtrl0.ni.scissorYStart = imesa->scissor_rect.y1;
-            imesa->regs.s4.drawCtrl1.ni.scissorXEnd = imesa->scissor_rect.x2-1;
-            imesa->regs.s4.drawCtrl1.ni.scissorYEnd = imesa->scissor_rect.y2-1;
-        }
-        else
-        {
-            imesa->regs.s4.drawCtrl0.ni.scissorXStart = imesa->draw_rect.x1;
-            imesa->regs.s4.drawCtrl0.ni.scissorYStart = imesa->draw_rect.y1;
-            imesa->regs.s4.drawCtrl1.ni.scissorXEnd = imesa->draw_rect.x2-1;
-            imesa->regs.s4.drawCtrl1.ni.scissorYEnd = imesa->draw_rect.y2-1;
-        }
-       imesa->scissorChanged = GL_FALSE;
-    }
-
     /* the savage4 uses the contiguous range of BCI registers 0x1e-0x39
      * 0x1e-0x27 are local, no need to check them for global changes */
     savageEmitChangedRegs (imesa, 0x1e, 0x39);
@@ -1534,33 +1451,6 @@ static void savageUpdateRegister_s4(savageContextPtr imesa)
 }
 static void savageUpdateRegister_s3d(savageContextPtr imesa)
 {
-    if (imesa->scissorChanged && imesa->savageScreen->driScrnPriv->drmMinor < 1)
-    {
-        if(imesa->scissor)
-        {
-            imesa->regs.s3d.scissorsStart.ni.scissorXStart =
-               imesa->scissor_rect.x1;
-            imesa->regs.s3d.scissorsStart.ni.scissorYStart =
-               imesa->scissor_rect.y1;
-            imesa->regs.s3d.scissorsEnd.ni.scissorXEnd =
-               imesa->scissor_rect.x2-1;
-            imesa->regs.s3d.scissorsEnd.ni.scissorYEnd =
-               imesa->scissor_rect.y2-1;
-        }
-        else
-        {
-            imesa->regs.s3d.scissorsStart.ni.scissorXStart =
-               imesa->draw_rect.x1;
-            imesa->regs.s3d.scissorsStart.ni.scissorYStart =
-               imesa->draw_rect.y1;
-            imesa->regs.s3d.scissorsEnd.ni.scissorXEnd =
-               imesa->draw_rect.x2-1;
-            imesa->regs.s3d.scissorsEnd.ni.scissorYEnd =
-               imesa->draw_rect.y2-1;
-        }
-       imesa->scissorChanged = GL_FALSE;
-    }
-
     /* Some temporary hacks to workaround lockups. Not sure if they are
      * still needed. But they work for now. */
     imesa->regs.s3d.drawCtrl.ni.flushPdDestWrites = GL_TRUE;
@@ -1597,22 +1487,17 @@ void savageEmitChangedState( savageContextPtr imesa )
     if (SAVAGE_DEBUG & DEBUG_VERBOSE_API)
         savageDDPrintDirty( "\n\n\nsavageEmitHwStateLocked", imesa->dirty );
 
-    if (imesa->dirty & ~SAVAGE_UPLOAD_CLIPRECTS)
+    if (imesa->dirty)
     {
-        if (imesa->dirty & (SAVAGE_UPLOAD_GLOBAL | SAVAGE_UPLOAD_LOCAL |
-                            SAVAGE_UPLOAD_TEX0   | SAVAGE_UPLOAD_TEX1  |
-                           SAVAGE_UPLOAD_FOGTBL | SAVAGE_UPLOAD_TEXGLOBAL))
-        {
-           if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
-               fprintf (stderr, "... emitting state\n");
-           if (imesa->savageScreen->chipset >= S3_SAVAGE4)
-               savageUpdateRegister_s4(imesa);
-           else
-               savageUpdateRegister_s3d(imesa);
-        }
-
-        imesa->dirty &= SAVAGE_UPLOAD_CLIPRECTS;
-    }
+       if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
+           fprintf (stderr, "... emitting state\n");
+       if (imesa->savageScreen->chipset >= S3_SAVAGE4)
+           savageUpdateRegister_s4(imesa);
+       else
+           savageUpdateRegister_s3d(imesa);
+     }
+
+    imesa->dirty = 0;
 }
 
 
index b1b402a18431274d418506d49d582fb79d8e1bfd..5fe718d7a65431dd410e8d43227380086a4e5bad 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "savagecontext.h"
 
+void savageCalcViewport( GLcontext *ctx );
 void savageEmitOldState( savageContextPtr imesa );
 void savageEmitChangedState( savageContextPtr imesa );