Mesa (openchrome-branch): Make translated cliprects driver local.

Thomas Hellstrom thomash at kemper.freedesktop.org
Sun Jan 25 21:50:12 UTC 2009


Module: Mesa
Branch: openchrome-branch
Commit: c2a90198605559af5adeec406e57d11bc3d4fb8e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c2a90198605559af5adeec406e57d11bc3d4fb8e

Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Sun Jan 25 22:31:13 2009 +0100

Make translated cliprects driver local.

---

 src/mesa/drivers/dri/openchrome/via_context.c      |   29 ++++++++++---
 src/mesa/drivers/dri/openchrome/via_context.h      |    4 +-
 src/mesa/drivers/dri/openchrome/via_fbo.c          |   17 +++++++-
 src/mesa/drivers/dri/openchrome/via_fbo.h          |    4 +-
 src/mesa/drivers/dri/openchrome/via_ioctl.c        |   44 ++++++++-----------
 src/mesa/drivers/dri/openchrome/via_pixel.c        |   14 +++---
 src/mesa/drivers/dri/openchrome/via_screen.c       |    5 ++
 src/mesa/drivers/dri/openchrome/via_state.c        |    2 +-
 .../drivers/dri/openchrome/via_teximage_accel.c    |    6 +-
 9 files changed, 78 insertions(+), 47 deletions(-)

diff --git a/src/mesa/drivers/dri/openchrome/via_context.c b/src/mesa/drivers/dri/openchrome/via_context.c
index 885e5ff..b5cebd5 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.c
+++ b/src/mesa/drivers/dri/openchrome/via_context.c
@@ -546,14 +546,27 @@ viaUpdateFrameBufferLocked(struct via_context *vmesa,
 	vfb = containerOf(dPriv->driverPrivate, struct via_framebuffer, Base);
 
 	if (vfb->lastStamp != dPriv->lastStamp) {
-	    drm_clip_rect_t *cur_clip;
+	    struct drm_via_clip_rect *cur_clip;
+	    struct drm_clip_rect *cur_d_clip;
 	    struct via_renderbuffer *front =
 		via_get_renderbuffer(&vfb->Base, BUFFER_FRONT_LEFT);
 	    int i;
 
 	    vfb->lastStamp = dPriv->lastStamp;
 	    vfb->numFrontClipRects = dPriv->numClipRects;
-	    vfb->pFrontClipRects = dPriv->pClipRects;
+
+	    if (vfb->pFrontClipRects != NULL &&
+		(vfb->pFrontClipRects != &vfb->allClipRect))
+		free(vfb->pFrontClipRects);
+
+	    vfb->pFrontClipRects = NULL;
+	    if (vfb->numFrontClipRects) {
+		vfb->pFrontClipRects =
+		    malloc(vfb->numFrontClipRects * sizeof(*vfb->pFrontClipRects));
+		if (vfb->pFrontClipRects == NULL)
+		    vfb->numFrontClipRects = 0;
+	    }
+
 	    vfb->xoff = 0;
 	    vfb->drawX = dPriv->x;
 	    vfb->drawY = dPriv->y;
@@ -564,13 +577,17 @@ viaUpdateFrameBufferLocked(struct via_context *vmesa,
 	     * we'll need to add it back.
 	     */
 
+
 	    cur_clip = vfb->pFrontClipRects;
+	    cur_d_clip = dPriv->pClipRects;
+
 	    for (i = 0; i < vfb->numFrontClipRects; ++i) {
-		cur_clip->x1 -= vfb->drawX;
-		cur_clip->x2 -= vfb->drawX;
-		cur_clip->y1 -= vfb->drawY;
-		cur_clip->y2 -= vfb->drawY;
+		cur_clip->x1 = (int) cur_d_clip->x1 - vfb->drawX;
+		cur_clip->x2 = (int) cur_d_clip->x2 - vfb->drawX;
+		cur_clip->y1 = (int) cur_d_clip->y1 - vfb->drawY;
+		cur_clip->y2 = (int) cur_d_clip->y2 - vfb->drawY;
 		cur_clip++;
+		cur_d_clip++;
 	    }
 
 	    if (front->isSharedFrontBuffer) {
diff --git a/src/mesa/drivers/dri/openchrome/via_context.h b/src/mesa/drivers/dri/openchrome/via_context.h
index 2dd9b9b..0638664 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.h
+++ b/src/mesa/drivers/dri/openchrome/via_context.h
@@ -282,7 +282,7 @@ struct via_context
     GLuint drawXoff;
     GLuint drawXoffBytes;
     GLuint numDrawClipRects;
-    drm_clip_rect_t *pDrawClipRects;
+    struct drm_via_clip_rect *pDrawClipRects;
     GLuint drawStamp;
 
     /*
@@ -294,7 +294,7 @@ struct via_context
     GLuint readXoff;
     GLuint readXoffBytes;
     GLuint numReadClipRects;
-    drm_clip_rect_t *pReadClipRects;
+    struct drm_via_clip_rect *pReadClipRects;
     GLuint readStamp;
 
     GLboolean scissor;
diff --git a/src/mesa/drivers/dri/openchrome/via_fbo.c b/src/mesa/drivers/dri/openchrome/via_fbo.c
index 78c2a6a..be31581 100644
--- a/src/mesa/drivers/dri/openchrome/via_fbo.c
+++ b/src/mesa/drivers/dri/openchrome/via_fbo.c
@@ -377,6 +377,21 @@ via_get_renderbuffer(struct gl_framebuffer *fb, GLuint attIndex)
     return via_renderbuffer(fb->Attachment[attIndex].Renderbuffer);
 }
 
+static void
+via_destroy_framebuffer(struct gl_framebuffer *buffer)
+{
+    struct via_framebuffer *viafb = via_framebuffer(buffer);
+
+    if (!viafb)
+	return;
+
+    if (viafb->pFrontClipRects &&
+	(viafb->pFrontClipRects != &viafb->allClipRect))
+	free(viafb->pFrontClipRects);
+
+    _mesa_destroy_framebuffer(buffer);
+}
+
 static struct gl_framebuffer *
 via_new_framebuffer(GLcontext * ctx, GLuint name)
 {
@@ -393,7 +408,7 @@ via_new_framebuffer(GLcontext * ctx, GLuint name)
 	viafb->Base._ColorDrawBufferIndexes[0] = BUFFER_COLOR0;
 	viafb->Base.ColorReadBuffer = GL_COLOR_ATTACHMENT0_EXT;
 	viafb->Base._ColorReadBufferIndex = BUFFER_COLOR0;
-	viafb->Base.Delete = _mesa_destroy_framebuffer;
+	viafb->Base.Delete = via_destroy_framebuffer;
     }
     return &viafb->Base;
 }
diff --git a/src/mesa/drivers/dri/openchrome/via_fbo.h b/src/mesa/drivers/dri/openchrome/via_fbo.h
index 54cc91b..5affff4 100644
--- a/src/mesa/drivers/dri/openchrome/via_fbo.h
+++ b/src/mesa/drivers/dri/openchrome/via_fbo.h
@@ -87,9 +87,9 @@ struct via_framebuffer
 				        * base address must be a multiple of
 				        * a number of pixels. */
 
-    drm_clip_rect_t allClipRect;
+    struct drm_via_clip_rect allClipRect;
     GLuint numFrontClipRects;	       /* cliprects for front buffer */
-    drm_clip_rect_t *pFrontClipRects;
+    struct drm_via_clip_rect *pFrontClipRects;
     __DRIdrawablePrivate *dPriv;
 
     struct _WsbmFenceObject *swap_fences[VIA_MAX_SWAP_FENCES];
diff --git a/src/mesa/drivers/dri/openchrome/via_ioctl.c b/src/mesa/drivers/dri/openchrome/via_ioctl.c
index a2dd030..6e31419 100644
--- a/src/mesa/drivers/dri/openchrome/via_ioctl.c
+++ b/src/mesa/drivers/dri/openchrome/via_ioctl.c
@@ -115,6 +115,7 @@ dump_dma(struct via_context *vmesa)
     fflush(stderr);
 }
 
+#if 0
 int
 via_intersect_drm_rect(struct drm_via_clip_rect *out,
 		       struct drm_via_clip_rect *a, struct drm_clip_rect *b)
@@ -141,6 +142,7 @@ via_intersect_drm_rect(struct drm_via_clip_rect *out,
 
     return 1;
 }
+#endif
 
 int
 via_intersect_via_rect(struct drm_via_clip_rect *out,
@@ -271,7 +273,7 @@ static void
 viaFillBuffer(struct via_context *vmesa,
 	      struct via_renderbuffer *buffer,
 	      struct drm_via_clip_rect *pbox,
-	      struct drm_clip_rect *pbox2, int nboxes, GLuint pixel,
+	      struct drm_via_clip_rect *pbox2, int nboxes, GLuint pixel,
 	      GLuint mask)
 {
     GLuint bytePerPixel = buffer->bpp >> 3;
@@ -413,7 +415,7 @@ viaClear(GLcontext * ctx, GLbitfield mask)
 
     if (flag) {
 	struct drm_via_clip_rect *boxes = NULL, *tmp_boxes = NULL;
-	struct drm_clip_rect *boxes2 = NULL;
+	struct drm_via_clip_rect *boxes2 = NULL;
 
 	int nr = 0;
 	GLint cx, cy, cw, ch;
@@ -441,7 +443,7 @@ viaClear(GLcontext * ctx, GLbitfield mask)
 
 	    viaCreateSafeClip(&a, cx, cy, cw, ch);
 
-	    drm_clip_rect_t *b = vmesa->pDrawClipRects;
+	    struct drm_via_clip_rect *b = vmesa->pDrawClipRects;
 
 	    boxes = tmp_boxes =
 		(struct drm_via_clip_rect *)malloc(vmesa->numDrawClipRects *
@@ -453,7 +455,7 @@ viaClear(GLcontext * ctx, GLbitfield mask)
 	    }
 
 	    for (i = 0; i < vmesa->numDrawClipRects; i++) {
-		if (via_intersect_drm_rect(&boxes[nr], &a, &b[i]))
+		if (via_intersect_via_rect(&boxes[nr], &a, &b[i]))
 		    nr++;
 	    }
 	} else {
@@ -520,7 +522,8 @@ viaClear(GLcontext * ctx, GLbitfield mask)
 
 static void
 viaDoSwapBuffers(struct via_context *vmesa,
-		 struct via_framebuffer *vfb, drm_clip_rect_t * backClipRect)
+		 struct via_framebuffer *vfb,
+		 struct drm_via_clip_rect * backClipRect)
 {
     GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3;
     struct via_renderbuffer *front = via_get_renderbuffer(&vfb->Base,
@@ -528,8 +531,7 @@ viaDoSwapBuffers(struct via_context *vmesa,
     struct via_renderbuffer *back = via_get_renderbuffer(&vfb->Base,
 							 BUFFER_BACK_LEFT);
     struct drm_via_clip_rect intersectRect;
-    drm_clip_rect_t *b = vfb->pFrontClipRects;
-    struct drm_via_clip_rect back_rect;
+    struct drm_via_clip_rect *b = vfb->pFrontClipRects;
     GLuint i;
     GLint x;
     GLint y;
@@ -540,14 +542,10 @@ viaDoSwapBuffers(struct via_context *vmesa,
     GLuint nbox;
 
     nbox = vfb->numFrontClipRects;
-    back_rect.x1 = backClipRect->x1;
-    back_rect.x2 = backClipRect->x2;
-    back_rect.y1 = backClipRect->y1;
-    back_rect.y2 = backClipRect->y2;
 
     for (i = 0; i < nbox; i++, b++) {
 
-	if (!via_intersect_drm_rect(&intersectRect, &back_rect, b))
+	if (!via_intersect_via_rect(&intersectRect, backClipRect, b))
 	    continue;
 
 	x = intersectRect.x1;
@@ -665,7 +663,7 @@ viaCopyBuffer(__DRIdrawablePrivate * dPriv)
     struct via_context *vmesa;
     struct gl_framebuffer *fb = dPriv->driverPrivate;
     struct via_framebuffer *vfb = via_framebuffer(fb);
-    drm_clip_rect_t backClipRect;
+    struct drm_via_clip_rect backClipRect;
     __DRIscreenPrivate *sPriv = dPriv->driScreenPriv;
     int i;
 
@@ -1466,7 +1464,7 @@ via_setup_clip(struct via_context *vmesa,
 	struct via_framebuffer *vfb = viaDrawFrameBuffer(vmesa);
 	struct drm_via_clip_rect *vclip;
 	struct drm_via_clip_rect *pvclip;
-	struct drm_clip_rect *dclip;
+	struct drm_via_clip_rect *dclip;
 	struct drm_via_clip_rect scissor;
 	unsigned int nclip;
 	unsigned int i;
@@ -1507,21 +1505,17 @@ via_setup_clip(struct via_context *vmesa,
 	    }
 	}
 
-	for (i = 0; i < nclip; ++i) {
-	    pvclip->x1 = dclip->x1;
-	    pvclip->x2 = dclip->x2;
-	    pvclip->y1 = dclip->y1;
-	    pvclip->y2 = dclip->y2;
-
-	    if (vmesa->scissor &&
-		!via_intersect_via_rect(pvclip, pvclip, &scissor))
-		continue;
+	for (i = 0; i < nclip; ++i, ++pvclip, ++dclip) {
+	    if (vmesa->scissor) {
+		if (!via_intersect_via_rect(pvclip, dclip, &scissor))
+		    continue;
+	    } else {
+		*pvclip = *dclip;
+	    }
 
 	    pvclip->x1 += xoff;
 	    pvclip->x2 += xoff;
 
-	    pvclip++;
-	    dclip++;
 	}
 	nclip = pvclip - vclip;
 	*num_clip = nclip;
diff --git a/src/mesa/drivers/dri/openchrome/via_pixel.c b/src/mesa/drivers/dri/openchrome/via_pixel.c
index 23d0be2..7e6161f 100644
--- a/src/mesa/drivers/dri/openchrome/via_pixel.c
+++ b/src/mesa/drivers/dri/openchrome/via_pixel.c
@@ -100,8 +100,8 @@ via_blit_copypixels(GLcontext * ctx,
     struct drm_via_clip_rect src_rect;
     struct drm_via_clip_rect tmp_dst_rect;
     struct drm_via_clip_rect tmp_src_rect;
-    struct drm_clip_rect *src_clip_rects;
-    struct drm_clip_rect *dst_clip_rects;
+    struct drm_via_clip_rect *src_clip_rects;
+    struct drm_via_clip_rect *dst_clip_rects;
     int num_src_clip;
     int num_dst_clip;
     int i;
@@ -213,7 +213,7 @@ via_blit_copypixels(GLcontext * ctx,
     dst_clip_rects = vmesa->pDrawClipRects;
 
     for (i = 0; i < num_src_clip; ++i) {
-	if (!via_intersect_drm_rect
+	if (!via_intersect_via_rect
 	    (&tmp_src_rect, &src_rect, src_clip_rects + i))
 	    continue;
 
@@ -228,7 +228,7 @@ via_blit_copypixels(GLcontext * ctx,
 	    int xdir;
 	    int ydir;
 
-	    if (!via_intersect_drm_rect
+	    if (!via_intersect_via_rect
 		(&tmp_dst_rect, &dst_rect, dst_clip_rects + j))
 		continue;
 
@@ -377,8 +377,8 @@ via_read_pixels(GLcontext * ctx,
     uint32_t bias_rgba;
     struct drm_via_clip_rect clip;
     struct drm_via_clip_rect dst_clip;
-    struct drm_clip_rect tmp_clip;
-    struct drm_clip_rect *cur_clip;
+    struct drm_via_clip_rect tmp_clip;
+    struct drm_via_clip_rect *cur_clip;
     int i;
     struct via_framebuffer *vfb = viaReadFrameBuffer(vmesa);
     struct via_renderbuffer *read_buf = viaReadRenderBuffer(vmesa);
@@ -464,7 +464,7 @@ via_read_pixels(GLcontext * ctx,
 	    tmp_clip.y2 = vfb->Base.Height - cur_clip->y1;
 	}
 
-	if (via_intersect_drm_rect(&dst_clip, &clip, &tmp_clip)) {
+	if (via_intersect_via_rect(&dst_clip, &clip, &tmp_clip)) {
 
 	    dst_clip.x1 -= x;
 	    dst_clip.x2 -= x;
diff --git a/src/mesa/drivers/dri/openchrome/via_screen.c b/src/mesa/drivers/dri/openchrome/via_screen.c
index 4508760..c99bb95 100644
--- a/src/mesa/drivers/dri/openchrome/via_screen.c
+++ b/src/mesa/drivers/dri/openchrome/via_screen.c
@@ -362,6 +362,11 @@ viaDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
 	if (viafb->swap_fences[i] != 0)
 	    wsbmFenceUnreference(&viafb->swap_fences[i]);
     }
+    if (viafb->pFrontClipRects &&
+	(viafb->pFrontClipRects != &viafb->allClipRect)) {
+	free(viafb->pFrontClipRects);
+    }
+
     _mesa_unreference_framebuffer(&fb);
 }
 
diff --git a/src/mesa/drivers/dri/openchrome/via_state.c b/src/mesa/drivers/dri/openchrome/via_state.c
index 624c844..f62bad9 100644
--- a/src/mesa/drivers/dri/openchrome/via_state.c
+++ b/src/mesa/drivers/dri/openchrome/via_state.c
@@ -793,7 +793,7 @@ viaSetDepthBuffer(GLcontext * ctx, struct gl_framebuffer *fb)
 static void
 viaSetDrawBuffer(struct via_context *vmesa, GLuint attIndex,
 		 GLboolean fallback, unsigned int xoff,
-		 int numClipRects, drm_clip_rect_t * pClipRects)
+		 int numClipRects, struct drm_via_clip_rect * pClipRects)
 {
     struct via_renderbuffer *viarb;
 
diff --git a/src/mesa/drivers/dri/openchrome/via_teximage_accel.c b/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
index 0821c14..91e363a 100644
--- a/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
+++ b/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
@@ -286,8 +286,8 @@ via_try_3d_copy(GLcontext * ctx,
     uint32_t bias_rgba;
     struct drm_via_clip_rect clip;
     struct drm_via_clip_rect dst_clip;
-    struct drm_clip_rect tmp_clip;
-    struct drm_clip_rect *cur_clip;
+    struct drm_via_clip_rect tmp_clip;
+    struct drm_via_clip_rect *cur_clip;
     int i;
     struct via_framebuffer *vfb = viaReadFrameBuffer(vmesa);
     struct via_renderbuffer *read_buf = viaReadRenderBuffer(vmesa);
@@ -359,7 +359,7 @@ via_try_3d_copy(GLcontext * ctx,
 	    tmp_clip.y2 = vfb->Base.Height - cur_clip->y1;
 	}
 
-	if (via_intersect_drm_rect(&dst_clip, &clip, &tmp_clip)) {
+	if (via_intersect_via_rect(&dst_clip, &clip, &tmp_clip)) {
 
 	    dst_clip.x1 -= x;
 	    dst_clip.x2 -= x;




More information about the mesa-commit mailing list