cell: fix twiddled tile display for XSHM. Fixed blank window problem.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Sep 2008 17:35:22 +0000 (11:35 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Sep 2008 17:35:22 +0000 (11:35 -0600)
src/gallium/winsys/xlib/xm_winsys.c

index 2acbc94fc8d8b5259c63cae5d76b063b1a64ecb3..3334af175bc27935ef093e5a769ee55f6a686714 100644 (file)
@@ -349,19 +349,26 @@ xmesa_display_surface_tiled(XMesaBuffer b, const struct pipe_surface *surf)
          if (x + w > surf->width)
             w = surf->width - x;
 
-         offset *= 4 * TILE_SIZE * TILE_SIZE;
-
-         twiddle_tile((uint *) ((char *) xm_buf->data + offset),
-                      tmpTile);
-         ximage->data = (char*) tmpTile;
+         /* offset in pixels */
+         offset *= TILE_SIZE * TILE_SIZE;
 
          if (XSHM_ENABLED(xm_buf)) {
+            ximage->data = (char *) xm_buf->data + 4 * offset;
+            /* make copy of tile data */
+            memcpy(tmpTile, (uint *) ximage->data, sizeof(tmpTile));
+            /* twiddle from temp to ximage in shared memory */
+            twiddle_tile(tmpTile, (uint *) ximage->data);
+            /* display image in shared memory */
 #if defined(USE_XSHM) && !defined(XFree86Server)
             XShmPutImage(b->xm_visual->display, b->drawable, b->gc,
                          ximage, 0, 0, x, y, w, h, False);
 #endif
          }
          else {
+            /* twiddel from ximage buffer to temp tile */
+            twiddle_tile((uint *) xm_buf->data + offset, tmpTile);
+            /* display temp tile data */
+            ximage->data = (char *) tmpTile;
             XPutImage(b->xm_visual->display, b->drawable, b->gc,
                       ximage, 0, 0, x, y, w, h);
          }