summaryrefslogtreecommitdiffstats
path: root/src/mesa/pipe/xlib/xm_surface.c
diff options
context:
space:
mode:
authorBrian <[email protected]>2007-11-01 12:24:36 -0600
committerBrian <[email protected]>2007-11-01 12:24:36 -0600
commitd0dde6e26c142c27408a0b52c153b571b8737d29 (patch)
tree7b11b66e55188678bd76ac4a9509436a86bac1ee /src/mesa/pipe/xlib/xm_surface.c
parentba0b1bdc332295743874c2e1fa3a2fc0528c70ac (diff)
rewrite xmesa_get_tile_rgba() to not use span funcs
Diffstat (limited to 'src/mesa/pipe/xlib/xm_surface.c')
-rw-r--r--src/mesa/pipe/xlib/xm_surface.c97
1 files changed, 73 insertions, 24 deletions
diff --git a/src/mesa/pipe/xlib/xm_surface.c b/src/mesa/pipe/xlib/xm_surface.c
index 9ca67574892..782a1f29bc3 100644
--- a/src/mesa/pipe/xlib/xm_surface.c
+++ b/src/mesa/pipe/xlib/xm_surface.c
@@ -88,6 +88,8 @@ xmesa_get_tile(struct pipe_context *pipe, struct pipe_surface *ps,
return;
}
+ CLIP_TILE;
+
if (!xms->ximage) {
/* XImage = pixmap data */
assert(xms->drawable);
@@ -145,6 +147,8 @@ xmesa_put_tile(struct pipe_context *pipe, struct pipe_surface *ps,
return;
}
+ CLIP_TILE;
+
if (xms->ximage) {
/* put to ximage */
ximage = xms->ximage;
@@ -205,45 +209,90 @@ xmesa_put_tile(struct pipe_context *pipe, struct pipe_surface *ps,
}
-
-/**
- * XXX rewrite to stop using renderbuffer->GetRow()
- */
void
xmesa_get_tile_rgba(struct pipe_context *pipe, struct pipe_surface *ps,
uint x, uint y, uint w, uint h, float *p)
{
struct xmesa_surface *xms = xmesa_surface(ps);
- struct xmesa_renderbuffer *xrb = xms->xrb;
+ XMesaImage *ximage = NULL;
+ float *pRow = p;
+ uint i, j;
- if (xrb) {
- /* this is a front/back color buffer */
- GLubyte tmp[MAX_WIDTH * 4];
- GLuint i, j;
- uint w0 = w;
- GET_CURRENT_CONTEXT(ctx);
+ if (!xms->drawable && !xms->ximage) {
+ /* not an X surface */
+ softpipe_get_tile_rgba(pipe, ps, x, y, w, h, p);
+ return;
+ }
- CLIP_TILE;
+ CLIP_TILE;
- FLIP(y);
- for (i = 0; i < h; i++) {
- xrb->St.Base.GetRow(ctx, &xrb->St.Base, w, x, y - i, tmp);
- for (j = 0; j < w * 4; j++) {
- p[j] = UBYTE_TO_FLOAT(tmp[j]);
+ if (!xms->ximage) {
+ /* XImage = pixmap data */
+ assert(xms->drawable);
+ ximage = XGetImage(xms->display, xms->drawable, x, y, w, h,
+ AllPlanes, ZPixmap);
+ x = y = 0;
+ }
+ else {
+ ximage = xms->ximage;
+ }
+
+ switch (ps->format) {
+ case PIPE_FORMAT_U_A8_R8_G8_B8:
+ {
+ const uint *src
+ = (uint *) (ximage->data + y * ximage->bytes_per_line + x * 4);
+ for (i = 0; i < h; i++) {
+ float *p = pRow;
+ for (j = 0; j < w; j++) {
+ uint pix = src[j];
+ ubyte r = ((pix >> 16) & 0xff);
+ ubyte g = ((pix >> 8) & 0xff);
+ ubyte b = ( pix & 0xff);
+ ubyte a = ((pix >> 24) & 0xff);
+ p[0] = UBYTE_TO_FLOAT(r);
+ p[1] = UBYTE_TO_FLOAT(g);
+ p[2] = UBYTE_TO_FLOAT(b);
+ p[3] = UBYTE_TO_FLOAT(a);
+ p += 4;
+ }
+ src += ximage->width;
+ pRow += 4 * w;
}
- p += w0 * 4;
}
+ break;
+ case PIPE_FORMAT_U_R5_G6_B5:
+ {
+ ushort *src
+ = (ushort *) (ximage->data + y * ximage->bytes_per_line + x * 2);
+ for (i = 0; i < h; i++) {
+ float *p = pRow;
+ for (j = 0; j < w; j++) {
+ uint pix = src[j];
+ ubyte r = (pix >> 8) | ((pix >> 13) & 0x7);
+ ubyte g = (pix >> 3) | ((pix >> 9) & 0x3);
+ ubyte b = ((pix & 0x1f) << 3) | ((pix >> 2) & 0x3);
+ p[0] = UBYTE_TO_FLOAT(r);
+ p[1] = UBYTE_TO_FLOAT(g);
+ p[2] = UBYTE_TO_FLOAT(b);
+ p[3] = 1.0;
+ p += 4;
+ }
+ src += ximage->width;
+ pRow += 4 * w;
+ }
+ }
+ break;
+ default:
+ assert(0);
}
- else {
- /* other softpipe surface */
- softpipe_get_tile_rgba(pipe, ps, x, y, w, h, p);
+
+ if (!xms->ximage) {
+ XMesaDestroyImage(ximage);
}
}
-/**
- * XXX rewrite to stop using renderbuffer->PutRow()
- */
void
xmesa_put_tile_rgba(struct pipe_context *pipe, struct pipe_surface *ps,
uint x, uint y, uint w, uint h, const float *p)