diff -ur Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_context.c Mesatest/src/mesa/drivers/dri/unichrome/via_context.c
--- Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_context.c	2007-02-04 11:30:29.000000000 +0100
+++ Mesatest/src/mesa/drivers/dri/unichrome/via_context.c	2007-02-23 19:47:52.000000000 +0100
@@ -788,17 +788,11 @@
       read_buffer->drawH = readable->h;
    }
 
-   vmesa->front.orig = (vmesa->front.offset + 
-			draw_buffer->drawY * vmesa->front.pitch + 
-			draw_buffer->drawX * bytePerPixel);
-
-   vmesa->front.origMap = (vmesa->front.map + 
-			   draw_buffer->drawY * vmesa->front.pitch + 
-			   draw_buffer->drawX * bytePerPixel);
-
+   vmesa->front.orig = vmesa->front.offset;
+   vmesa->front.origMap = vmesa->front.map;
    vmesa->back.orig = vmesa->back.offset;
-   vmesa->depth.orig = vmesa->depth.offset;   
    vmesa->back.origMap = vmesa->back.map;
+   vmesa->depth.orig = vmesa->depth.offset;   
    vmesa->depth.origMap = vmesa->depth.map;
 
    viaCalcViewport(vmesa->glCtx);
diff -ur Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_ioctl.c Mesatest/src/mesa/drivers/dri/unichrome/via_ioctl.c
--- Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_ioctl.c	2006-12-13 23:41:13.000000000 +0100
+++ Mesatest/src/mesa/drivers/dri/unichrome/via_ioctl.c	2007-02-23 19:47:52.000000000 +0100
@@ -891,10 +891,10 @@
       for (i = 0; i < vmesa->numClipRects; i++) {
 	 drm_clip_rect_t b;
 
-	 b.x1 = pbox[i].x1 - (vrb->drawX + vrb->drawXoff);
-	 b.x2 = pbox[i].x2 - (vrb->drawX + vrb->drawXoff);
-	 b.y1 = pbox[i].y1 - vrb->drawY;
-	 b.y2 = pbox[i].y2 - vrb->drawY;
+	 b.x1 = pbox[i].x1 - vrb->drawXoff;
+	 b.x2 = pbox[i].x2 - vrb->drawXoff;
+	 b.y1 = pbox[i].y1;
+	 b.y2 = pbox[i].y2;
 
 	 if (vmesa->scissor &&
 	     !intersect_rect(&b, &b, &vmesa->scissorRect)) 
diff -ur Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_state.c Mesatest/src/mesa/drivers/dri/unichrome/via_state.c
--- Mesa-6.5.x/src/mesa/drivers/dri/unichrome/via_state.c	2007-02-04 11:30:29.000000000 +0100
+++ Mesatest/src/mesa/drivers/dri/unichrome/via_state.c	2007-02-23 19:51:14.000000000 +0100
@@ -712,12 +712,8 @@
 }
 
 
-/* =============================================================
- */
-
 
-/* Using drawXoff like this is incorrect outside of locked regions.
- * This hardware just isn't capable of private back buffers without
+/* This hardware just isn't capable of private back buffers without
  * glitches and/or a hefty locking scheme.
  */
 void viaCalcViewport(GLcontext *ctx)
@@ -729,12 +725,10 @@
     const GLfloat *v = ctx->Viewport._WindowMap.m;
     GLfloat *m = vmesa->ViewportMatrix.m;
     
-    /* See also via_translate_vertex.
-     */
     m[MAT_SX] =   v[MAT_SX];
-    m[MAT_TX] =   v[MAT_TX] + SUBPIXEL_X + vrb->drawXoff;
+    m[MAT_TX] =   v[MAT_TX] + SUBPIXEL_X + dPriv->x;
     m[MAT_SY] = - v[MAT_SY];
-    m[MAT_TY] = - v[MAT_TY] + dPriv->h + SUBPIXEL_Y;
+    m[MAT_TY] = - v[MAT_TY] + SUBPIXEL_Y + dPriv->y + dPriv->h;
     m[MAT_SZ] =   v[MAT_SZ] * (1.0 / vmesa->depth_max);
     m[MAT_TZ] =   v[MAT_TZ] * (1.0 / vmesa->depth_max);
 }
