copybuffer/cliprect fixups
authorRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 10 Jul 2007 17:56:44 +0000 (19:56 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Tue, 10 Jul 2007 17:56:44 +0000 (19:56 +0200)
src/mesa/drivers/dri/i915tex/intel_blit.c
src/mesa/drivers/dri/i915tex/intel_buffers.c
src/mesa/drivers/dri/i915tex/intel_context.h

index 5dcb0ddebbb621deca01698d595aa8c78afcfed4..b4fc1691e6b66b98a9d782917a4819769b4bb388 100644 (file)
@@ -115,6 +115,7 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
 
       for (i = 0; i < nbox; i++, pbox++) {
         drm_clip_rect_t box;
+        drm_clip_rect_t sbox;
 
         if (pbox->x1 > pbox->x2 ||
             pbox->y1 > pbox->y2 ||
@@ -137,6 +138,9 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
               continue;
         }
 
+        sbox.x1 = box.x1 - dPriv->x;
+        sbox.y1 = box.y1 - dPriv->y;
+
         BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
         OUT_BATCH(CMD);
         OUT_BATCH(BR13);
@@ -145,7 +149,7 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
 
         OUT_RELOC(frontRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
                   DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
-        OUT_BATCH((pbox->y1 << 16) | pbox->x1);
+        OUT_BATCH((sbox.y1 << 16) | sbox.x1);
         OUT_BATCH((srcpitch * cpp) & 0xffff);
         OUT_RELOC(backRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
                   DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
index 62ff54b00751c3241967742edd1a6375205bba99..e8dd7cd524048f764efa92c55a0b7de6c8c159e5 100644 (file)
@@ -146,6 +146,27 @@ intelSetRenderbufferClipRects(struct intel_context *intel)
    intel->drawY = 0;
 }
 
+/**
+ * As above, but for rendering private front/back buffer of a window.
+ * \sa intelSetPrivbufClipRects
+ */
+
+static void
+intelSetPrivbufClipRects(struct intel_context *intel)
+{
+   __DRIdrawablePrivate *dPriv = intel->driDrawable;
+   if (!dPriv)
+      return;
+
+   intel->fakeClipRect.x1 = 0;
+   intel->fakeClipRect.y1 = 0;
+   intel->fakeClipRect.x2 = dPriv->w;
+   intel->fakeClipRect.y2 = dPriv->h;
+   intel->pClipRects = &intel->fakeClipRect;
+   intel->numClipRects = 1;
+   intel->drawX = 0;
+   intel->drawY = 0;
+}
 
 /**
  * As above, but for rendering to front buffer of a window.
@@ -212,7 +233,7 @@ intelWindowMoved(struct intel_context *intel)
       /* when would this happen? -BP */
       intelSetFrontClipRects(intel);
    }
-   else if (intel->ctx.DrawBuffer->Name != 0) {
+   else if (1 || intel->ctx.DrawBuffer->Name != 0) {
       /* drawing to user-created FBO - do nothing */
       /* Cliprects would be set from intelDrawBuffer() */
    }
@@ -953,10 +974,17 @@ intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
 
       if (ctx->Visual.doubleBufferMode) {
          drm_clip_rect_t rect;
+#if 1
          rect.x1 = x + dPriv->x;
          rect.y1 = (dPriv->h - y - h) + dPriv->y;
          rect.x2 = rect.x1 + w;
          rect.y2 = rect.y1 + h;
+#else
+         rect.x1 = x;
+         rect.y1 = dPriv->h - y;
+         rect.x2 = rect.x1 + w;
+         rect.y2 = rect.y1 + h;
+#endif
          _mesa_notifySwapBuffers(ctx);  /* flush pending rendering comands */
          intelCopyBuffer(dPriv, &rect);
       }
@@ -991,7 +1019,7 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
       return;
    }
 
-   /* Do this here, note core Mesa, since this function is called from
+   /* Do this here, not core Mesa, since this function is called from
     * many places within the driver.
     */
    if (ctx->NewState & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
@@ -1042,11 +1070,19 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
    if (fb->Name == 0) {
       /* drawing to window system buffer */
       if (front) {
+#if 0
          intelSetFrontClipRects(intel);
+#else
+         intelSetPrivbufClipRects(intel);
+#endif
          colorRegion = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
       }
       else {
+#if 0
          intelSetBackClipRects(intel);
+#else
+         intelSetPrivbufClipRects(intel);
+#endif
          colorRegion = intel_get_rb_region(fb, BUFFER_BACK_LEFT);
       }
    }
index 7a9af1b5fdab9289fa0b30bc0c0941140a0d688a..d05b20abbd41efbfb825afc0d058b64a04497b3b 100644 (file)
@@ -254,6 +254,7 @@ struct intel_context
    GLuint numClipRects;         /**< cliprects for drawing */
    drm_clip_rect_t *pClipRects;
    drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */
+   drm_clip_rect_t fakeClipRect;     /**< cliprect for priv back/fake front buffers rendering */
 
    int perf_boxes;