diff options
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_surface.c | 493 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_surface.h | 39 |
2 files changed, 54 insertions, 478 deletions
diff --git a/src/mesa/pipe/softpipe/sp_surface.c b/src/mesa/pipe/softpipe/sp_surface.c index fb8c8d0826..40f045800f 100644 --- a/src/mesa/pipe/softpipe/sp_surface.c +++ b/src/mesa/pipe/softpipe/sp_surface.c @@ -34,12 +34,6 @@ /** * Softpipe surface functions. - * Basically, create surface of a particular type, then plug in default - * read/write_quad and get/put_tile() functions. - * Note that these quad funcs assume the buffer/region is in a linear - * layout with Y=0=top. - * If we had swizzled/AOS buffers the read/write quad functions could be - * simplified a lot.... */ @@ -76,56 +70,6 @@ /*** PIPE_FORMAT_U_A8_R8_G8_B8 ***/ static void -a8r8g8b8_read_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - const unsigned *src - = ((const unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8_R8_G8_B8); -#if 0 - assert(x < (int) sps->surface.width - 1); - assert(y < (int) sps->surface.height - 1); -#endif - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - const unsigned p = src[j]; - rrrr[0][i * 2 + j] = UBYTE_TO_FLOAT((p >> 16) & 0xff); /*R*/ - rrrr[1][i * 2 + j] = UBYTE_TO_FLOAT((p >> 8) & 0xff); /*G*/ - rrrr[2][i * 2 + j] = UBYTE_TO_FLOAT((p ) & 0xff); /*B*/ - rrrr[3][i * 2 + j] = UBYTE_TO_FLOAT((p >> 24) & 0xff); /*A*/ - } - src += sps->surface.region->pitch; - } -} - -static void -a8r8g8b8_write_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - unsigned *dst - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8_R8_G8_B8); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - ubyte r, g, b, a; - UNCLAMPED_FLOAT_TO_UBYTE(r, rrrr[0][i * 2 + j]); /*R*/ - UNCLAMPED_FLOAT_TO_UBYTE(g, rrrr[1][i * 2 + j]); /*G*/ - UNCLAMPED_FLOAT_TO_UBYTE(b, rrrr[2][i * 2 + j]); /*B*/ - UNCLAMPED_FLOAT_TO_UBYTE(a, rrrr[3][i * 2 + j]); /*A*/ - dst[j] = (a << 24) | (r << 16) | (g << 8) | b; - } - dst += sps->surface.region->pitch; - } -} - -static void a8r8g8b8_get_tile(struct pipe_surface *ps, unsigned x, unsigned y, unsigned w, unsigned h, float *p) { @@ -217,42 +161,6 @@ a1r5g5b5_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_Z16 ***/ -static void -z16_read_quad_z(struct softpipe_surface *sps, - int x, int y, unsigned zzzz[QUAD_SIZE]) -{ - const ushort *src - = ((const ushort *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_Z16); - - /* converting ushort to unsigned: */ - zzzz[0] = src[0]; - zzzz[1] = src[1]; - src += sps->surface.region->pitch; - zzzz[2] = src[0]; - zzzz[3] = src[1]; -} - -static void -z16_write_quad_z(struct softpipe_surface *sps, - int x, int y, const unsigned zzzz[QUAD_SIZE]) -{ - ushort *dst - = ((ushort *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_Z16); - - /* converting unsigned to ushort: */ - dst[0] = zzzz[0]; - dst[1] = zzzz[1]; - dst += sps->surface.region->pitch; - dst[0] = zzzz[2]; - dst[1] = zzzz[3]; -} - /** * Return as floats in [0,1]. */ @@ -287,51 +195,6 @@ z16_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_L8 ***/ static void -l8_read_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - const ubyte *src - = ((const ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_L8); - assert(x < (int) sps->surface.width - 1); - assert(y < (int) sps->surface.height - 1); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - rrrr[0][i * 2 + j] = - rrrr[1][i * 2 + j] = - rrrr[2][i * 2 + j] = UBYTE_TO_FLOAT(src[j]); - rrrr[3][i * 2 + j] = 1.0F; - } - src += sps->surface.region->pitch; - } -} - -static void -l8_write_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - ubyte *dst - = ((ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_L8); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - ubyte r; - UNCLAMPED_FLOAT_TO_UBYTE(r, rrrr[0][i * 2 + j]); /*R*/ - dst[j] = r; - } - dst += sps->surface.region->pitch; - } -} - -static void l8_get_tile(struct pipe_surface *ps, unsigned x, unsigned y, unsigned w, unsigned h, float *p) { @@ -363,51 +226,6 @@ l8_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_A8 ***/ static void -a8_read_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - const ubyte *src - = ((const ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8); - assert(x < (int) sps->surface.width - 1); - assert(y < (int) sps->surface.height - 1); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - rrrr[0][i * 2 + j] = - rrrr[1][i * 2 + j] = - rrrr[2][i * 2 + j] = 0.0F; - rrrr[3][i * 2 + j] = UBYTE_TO_FLOAT(src[j]); - } - src += sps->surface.region->pitch; - } -} - -static void -a8_write_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - ubyte *dst - = ((ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - ubyte r; - UNCLAMPED_FLOAT_TO_UBYTE(r, rrrr[3][i * 2 + j]); /*A*/ - dst[j] = r; - } - dst += sps->surface.region->pitch; - } -} - -static void a8_get_tile(struct pipe_surface *ps, unsigned x, unsigned y, unsigned w, unsigned h, float *p) { @@ -508,51 +326,6 @@ r16g16b16a16_put_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_I8 ***/ static void -i8_read_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - const ubyte *src - = ((const ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_I8); - assert(x < (int) sps->surface.width - 1); - assert(y < (int) sps->surface.height - 1); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - rrrr[0][i * 2 + j] = - rrrr[1][i * 2 + j] = - rrrr[2][i * 2 + j] = - rrrr[3][i * 2 + j] = UBYTE_TO_FLOAT(src[j]); - } - src += sps->surface.region->pitch; - } -} - -static void -i8_write_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - ubyte *dst - = ((ubyte *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_I8); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - ubyte r; - UNCLAMPED_FLOAT_TO_UBYTE(r, rrrr[0][i * 2 + j]); /*R*/ - dst[j] = r; - } - dst += sps->surface.region->pitch; - } -} - -static void i8_get_tile(struct pipe_surface *ps, unsigned x, unsigned y, unsigned w, unsigned h, float *p) { @@ -584,53 +357,6 @@ i8_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_A8_L8 ***/ static void -a8_l8_read_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - const ushort *src - = ((const ushort *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8_L8); - assert(x < (int) sps->surface.width - 1); - assert(y < (int) sps->surface.height - 1); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - const ushort p = src[j]; - rrrr[0][i * 2 + j] = - rrrr[1][i * 2 + j] = - rrrr[2][i * 2 + j] = UBYTE_TO_FLOAT(p >> 8); - rrrr[3][i * 2 + j] = UBYTE_TO_FLOAT(p & 0xff); - } - src += sps->surface.region->pitch; - } -} - -static void -a8_l8_write_quad_f_swz(struct softpipe_surface *sps, int x, int y, - float (*rrrr)[QUAD_SIZE]) -{ - ushort *dst - = ((ushort *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - unsigned i, j; - - assert(sps->surface.format == PIPE_FORMAT_U_A8_L8); - - for (i = 0; i < 2; i++) { /* loop over pixel row */ - for (j = 0; j < 2; j++) { /* loop over pixel column */ - ubyte l, a; - UNCLAMPED_FLOAT_TO_UBYTE(l, rrrr[0][i * 2 + j]); /*R*/ - UNCLAMPED_FLOAT_TO_UBYTE(a, rrrr[3][i * 2 + j]); /*A*/ - dst[j] = (l << 8) | a; - } - dst += sps->surface.region->pitch; - } -} - -static void a8_l8_get_tile(struct pipe_surface *ps, unsigned x, unsigned y, unsigned w, unsigned h, float *p) { @@ -664,40 +390,6 @@ a8_l8_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_U_Z32 ***/ -static void -z32_read_quad_z(struct softpipe_surface *sps, - int x, int y, unsigned zzzz[QUAD_SIZE]) -{ - const unsigned *src - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_Z32); - - zzzz[0] = src[0]; - zzzz[1] = src[1]; - src += sps->surface.region->pitch; - zzzz[2] = src[0]; - zzzz[3] = src[1]; -} - -static void -z32_write_quad_z(struct softpipe_surface *sps, - int x, int y, const unsigned zzzz[QUAD_SIZE]) -{ - unsigned *dst - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_Z32); - - dst[0] = zzzz[0]; - dst[1] = zzzz[1]; - dst += sps->surface.region->pitch; - dst[0] = zzzz[2]; - dst[1] = zzzz[3]; -} - /** * Return as floats in [0,1]. */ @@ -729,80 +421,6 @@ z32_get_tile(struct pipe_surface *ps, /*** PIPE_FORMAT_S8_Z24 ***/ -static void -s8z24_read_quad_z(struct softpipe_surface *sps, - int x, int y, unsigned zzzz[QUAD_SIZE]) -{ - static const unsigned mask = 0x00ffffff; - const unsigned *src - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_S8_Z24); - - /* extract lower three bytes */ - zzzz[0] = src[0] & mask; - zzzz[1] = src[1] & mask; - src += sps->surface.region->pitch; - zzzz[2] = src[0] & mask; - zzzz[3] = src[1] & mask; -} - -static void -s8z24_write_quad_z(struct softpipe_surface *sps, - int x, int y, const unsigned zzzz[QUAD_SIZE]) -{ - static const unsigned mask = 0xff000000; - unsigned *dst - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_S8_Z24); - assert(zzzz[0] <= 0xffffff); - - dst[0] = (dst[0] & mask) | zzzz[0]; - dst[1] = (dst[1] & mask) | zzzz[1]; - dst += sps->surface.region->pitch; - dst[0] = (dst[0] & mask) | zzzz[2]; - dst[1] = (dst[1] & mask) | zzzz[3]; -} - -static void -s8z24_read_quad_stencil(struct softpipe_surface *sps, - int x, int y, ubyte ssss[QUAD_SIZE]) -{ - const unsigned *src - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_S8_Z24); - - ssss[0] = src[0] >> 24; - ssss[1] = src[1] >> 24; - src += sps->surface.region->pitch; - ssss[2] = src[0] >> 24; - ssss[3] = src[1] >> 24; -} - -static void -s8z24_write_quad_stencil(struct softpipe_surface *sps, - int x, int y, const ubyte ssss[QUAD_SIZE]) -{ - static const unsigned mask = 0x00ffffff; - unsigned *dst - = ((unsigned *) (sps->surface.region->map + sps->surface.offset)) - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_S8_Z24); - - dst[0] = (dst[0] & mask) | (ssss[0] << 24); - dst[1] = (dst[1] & mask) | (ssss[1] << 24); - dst += sps->surface.region->pitch; - dst[0] = (dst[0] & mask) | (ssss[2] << 24); - dst[1] = (dst[1] & mask) | (ssss[3] << 24); -} - - /** * Return Z component as float in [0,1]. Stencil part ignored. */ @@ -832,43 +450,6 @@ s8z24_get_tile(struct pipe_surface *ps, } -/*** PIPE_FORMAT_U_S8 ***/ - -static void -s8_read_quad_stencil(struct softpipe_surface *sps, - int x, int y, ubyte ssss[QUAD_SIZE]) -{ - const ubyte *src - = sps->surface.region->map + sps->surface.offset - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_S8); - - ssss[0] = src[0]; - ssss[1] = src[1]; - src += sps->surface.region->pitch; - ssss[2] = src[0]; - ssss[3] = src[1]; -} - -static void -s8_write_quad_stencil(struct softpipe_surface *sps, - int x, int y, const ubyte ssss[QUAD_SIZE]) -{ - ubyte *dst - = sps->surface.region->map + sps->surface.offset - + y * sps->surface.region->pitch + x; - - assert(sps->surface.format == PIPE_FORMAT_U_S8); - - dst[0] = ssss[0]; - dst[1] = ssss[1]; - dst += sps->surface.region->pitch; - dst[0] = ssss[2]; - dst[1] = ssss[3]; -} - - /** * Get raw tile, any 32-bit pixel format. */ @@ -979,6 +560,57 @@ put_tile_raw16(struct pipe_surface *ps, } +/** + * Get raw tile, any 16-bit pixel format. + */ +static void +get_tile_raw8(struct pipe_surface *ps, + uint x, uint y, uint w, uint h, void *p) +{ + const ubyte *src + = ((const ubyte *) (ps->region->map + ps->offset)) + + y * ps->region->pitch + x; + ubyte *pDest = (ubyte *) p; + uint i; + uint w0 = w; + + assert(ps->format == PIPE_FORMAT_U_Z16); + + CLIP_TILE; + + for (i = 0; i < h; i++) { + memcpy(pDest, src, w * sizeof(ubyte)); + src += ps->region->pitch; + pDest += w0; + } +} + +/** + * Put raw tile, any 16-bit pixel format. + */ +static void +put_tile_raw8(struct pipe_surface *ps, + uint x, uint y, uint w, uint h, const void *p) +{ + ubyte *dst + = ((ubyte *) (ps->region->map + ps->offset)) + + y * ps->region->pitch + x; + const ubyte *pSrc = (const ubyte *) p; + unsigned i; + unsigned w0 = w; + + assert(ps->format == PIPE_FORMAT_U_Z16); + + CLIP_TILE; + + for (i = 0; i < h; i++) { + memcpy(dst, pSrc, w * sizeof(ubyte)); + dst += ps->region->pitch; + pSrc += w0; + } +} + + /** @@ -991,8 +623,6 @@ softpipe_init_surface_funcs(struct softpipe_surface *sps) switch (sps->surface.format) { case PIPE_FORMAT_U_A8_R8_G8_B8: - sps->read_quad_f_swz = a8r8g8b8_read_quad_f_swz; - sps->write_quad_f_swz = a8r8g8b8_write_quad_f_swz; sps->surface.get_tile = a8r8g8b8_get_tile; sps->surface.put_tile = a8r8g8b8_put_tile; break; @@ -1000,23 +630,15 @@ softpipe_init_surface_funcs(struct softpipe_surface *sps) sps->surface.get_tile = a1r5g5b5_get_tile; break; case PIPE_FORMAT_U_L8: - sps->read_quad_f_swz = l8_read_quad_f_swz; - sps->write_quad_f_swz = l8_write_quad_f_swz; sps->surface.get_tile = l8_get_tile; break; case PIPE_FORMAT_U_A8: - sps->read_quad_f_swz = a8_read_quad_f_swz; - sps->write_quad_f_swz = a8_write_quad_f_swz; sps->surface.get_tile = a8_get_tile; break; case PIPE_FORMAT_U_I8: - sps->read_quad_f_swz = i8_read_quad_f_swz; - sps->write_quad_f_swz = i8_write_quad_f_swz; sps->surface.get_tile = i8_get_tile; break; case PIPE_FORMAT_U_A8_L8: - sps->read_quad_f_swz = a8_l8_read_quad_f_swz; - sps->write_quad_f_swz = a8_l8_write_quad_f_swz; sps->surface.get_tile = a8_l8_get_tile; break; @@ -1026,32 +648,23 @@ softpipe_init_surface_funcs(struct softpipe_surface *sps) break; case PIPE_FORMAT_U_Z16: - sps->read_quad_z = z16_read_quad_z; - sps->write_quad_z = z16_write_quad_z; sps->surface.get_tile = z16_get_tile; sps->surface.get_tile_raw = get_tile_raw16; sps->surface.put_tile_raw = put_tile_raw16; break; case PIPE_FORMAT_U_Z32: - sps->read_quad_z = z32_read_quad_z; - sps->write_quad_z = z32_write_quad_z; sps->surface.get_tile = z32_get_tile; sps->surface.get_tile_raw = get_tile_raw32; sps->surface.put_tile_raw = put_tile_raw32; break; case PIPE_FORMAT_S8_Z24: - sps->read_quad_z = s8z24_read_quad_z; - sps->write_quad_z = s8z24_write_quad_z; - sps->read_quad_stencil = s8z24_read_quad_stencil; - sps->write_quad_stencil = s8z24_write_quad_stencil; sps->surface.get_tile = s8z24_get_tile; sps->surface.get_tile_raw = get_tile_raw32; sps->surface.put_tile_raw = put_tile_raw32; break; - case PIPE_FORMAT_U_S8: - sps->read_quad_stencil = s8_read_quad_stencil; - sps->write_quad_stencil = s8_write_quad_stencil; + sps->surface.get_tile_raw = get_tile_raw8; + sps->surface.put_tile_raw = put_tile_raw8; break; default: assert(0); diff --git a/src/mesa/pipe/softpipe/sp_surface.h b/src/mesa/pipe/softpipe/sp_surface.h index 522f7612ab..06c0a01aee 100644 --- a/src/mesa/pipe/softpipe/sp_surface.h +++ b/src/mesa/pipe/softpipe/sp_surface.h @@ -46,44 +46,7 @@ struct softpipe_tile_cache; struct softpipe_surface { struct pipe_surface surface; - /** - * Functions for read/writing surface data - */ - void (*read_quad_f)( struct softpipe_surface *, - int x, int y, - float (*rgba)[NUM_CHANNELS] ); - - void (*read_quad_f_swz)( struct softpipe_surface *, - int x, int y, - float (*rrrr)[QUAD_SIZE] ); - - void (*read_quad_ub)( struct softpipe_surface *, - int x, int y, - ubyte (*rgba)[NUM_CHANNELS] ); - - - void (*write_quad_f)( struct softpipe_surface *, - int x, int y, - float (*rgba)[NUM_CHANNELS] ); - - void (*write_quad_f_swz)( struct softpipe_surface *, - int x, int y, - float (*rrrr)[QUAD_SIZE] ); - - - void (*write_quad_ub)( struct softpipe_surface *, - int x, int y, - ubyte (*rgba)[NUM_CHANNELS] ); - - void (*read_quad_z)(struct softpipe_surface *, - int x, int y, unsigned zzzz[QUAD_SIZE]); - void (*write_quad_z)(struct softpipe_surface *, - int x, int y, const unsigned zzzz[QUAD_SIZE]); - - void (*read_quad_stencil)(struct softpipe_surface *, - int x, int y, ubyte ssss[QUAD_SIZE]); - void (*write_quad_stencil)(struct softpipe_surface *, - int x, int y, const ubyte ssss[QUAD_SIZE]); + /* no softpipe-specific extras now */ }; |