diff options
Diffstat (limited to 'src/mesa/pipe/softpipe/sp_surface.c')
-rw-r--r-- | src/mesa/pipe/softpipe/sp_surface.c | 247 |
1 files changed, 62 insertions, 185 deletions
diff --git a/src/mesa/pipe/softpipe/sp_surface.c b/src/mesa/pipe/softpipe/sp_surface.c index b8af1c561f..4accafa384 100644 --- a/src/mesa/pipe/softpipe/sp_surface.c +++ b/src/mesa/pipe/softpipe/sp_surface.c @@ -460,169 +460,6 @@ s8z24_get_tile(struct pipe_surface *ps, /** - * Get raw tile, any 32-bit pixel format. - */ -static void -get_tile_raw32(struct pipe_surface *ps, - uint x, uint y, uint w, uint h, void *p) -{ - const uint *src - = ((const uint *) (ps->region->map + ps->offset)) - + y * ps->region->pitch + x; - uint *pDest = (uint *) p; - unsigned i; - unsigned w0 = w; - - assert(ps->region->map); - assert(ps->format == PIPE_FORMAT_S8_Z24 || - ps->format == PIPE_FORMAT_U_Z32); - - CLIP_TILE; - - for (i = 0; i < h; i++) { - memcpy(pDest, src, w * sizeof(uint)); - src += ps->region->pitch; - pDest += w0; - } -} - - -/** - * put raw tile, any 32-bit pixel format. - */ -static void -put_tile_raw32(struct pipe_surface *ps, - uint x, uint y, uint w, uint h, const void *p) -{ - uint *dst - = ((uint *) (ps->region->map + ps->offset)) - + y * ps->region->pitch + x; - const uint *pSrc = (const uint *) p; - unsigned i; - unsigned w0 = w; - - assert(w < 1000); - assert(ps->region->map); - assert(ps->format == PIPE_FORMAT_S8_Z24 || - ps->format == PIPE_FORMAT_U_Z32); - - assert(w < 1000); - CLIP_TILE; - - for (i = 0; i < h; i++) { - assert(w < 1000); - memcpy(dst, pSrc, w * sizeof(uint)); - dst += ps->region->pitch; - pSrc += w0; - } -} - - -/** - * Get raw tile, any 16-bit pixel format. - */ -static void -get_tile_raw16(struct pipe_surface *ps, - uint x, uint y, uint w, uint h, void *p) -{ - const ushort *src - = ((const ushort *) (ps->region->map + ps->offset)) - + y * ps->region->pitch + x; - ushort *pDest = (ushort *) 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(ushort)); - src += ps->region->pitch; - pDest += w0; - } -} - -/** - * Put raw tile, any 16-bit pixel format. - */ -static void -put_tile_raw16(struct pipe_surface *ps, - uint x, uint y, uint w, uint h, const void *p) -{ - ushort *dst - = ((ushort *) (ps->region->map + ps->offset)) - + y * ps->region->pitch + x; - const ushort *pSrc = (const ushort *) 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(ushort)); - dst += ps->region->pitch; - pSrc += w0; - } -} - - -/** - * 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; - } -} - - - - -/** * Initialize the quad_read/write and get/put_tile() methods. */ void @@ -658,22 +495,14 @@ softpipe_init_surface_funcs(struct softpipe_surface *sps) case PIPE_FORMAT_U_Z16: sps->get_tile = z16_get_tile; - sps->get_tile_raw = get_tile_raw16; - sps->put_tile_raw = put_tile_raw16; break; case PIPE_FORMAT_U_Z32: sps->get_tile = z32_get_tile; - sps->get_tile_raw = get_tile_raw32; - sps->put_tile_raw = put_tile_raw32; break; case PIPE_FORMAT_S8_Z24: sps->get_tile = s8z24_get_tile; - sps->get_tile_raw = get_tile_raw32; - sps->put_tile_raw = put_tile_raw32; break; case PIPE_FORMAT_U_S8: - sps->get_tile_raw = get_tile_raw8; - sps->put_tile_raw = put_tile_raw8; break; default: assert(0); @@ -739,28 +568,75 @@ softpipe_get_tex_surface(struct pipe_context *pipe, } +/** + * Move raw block of pixels from surface to user memory. + */ static void -get_tile_generic(struct pipe_context *pipe, - struct pipe_surface *ps, - uint x, uint y, uint w, uint h, - void *p, int dst_stride) +softpipe_get_tile(struct pipe_context *pipe, + struct pipe_surface *ps, + uint x, uint y, uint w, uint h, + void *p, int dst_stride) { - struct softpipe_surface *sps = softpipe_surface(ps); - sps->get_tile_raw(ps, x, y, w, h, p); + const uint cpp = ps->region->cpp; + const uint w0 = w; + const ubyte *pSrc; + ubyte *pDest; + uint i; + + assert(ps->region->map); + + CLIP_TILE; + + if (dst_stride == 0) { + dst_stride = w0 * cpp; + } + + pSrc = ps->region->map + ps->offset + (y * ps->region->pitch + x) * cpp; + pDest = (ubyte *) p; + + for (i = 0; i < h; i++) { + memcpy(pDest, pSrc, w0 * cpp); + pDest += dst_stride; + pSrc += ps->region->pitch * cpp; + } } +/** + * Move raw block of pixels from user memory to surface. + */ static void -put_tile_generic(struct pipe_context *pipe, - struct pipe_surface *ps, - uint x, uint y, uint w, uint h, - const void *p, int src_stride) +softpipe_put_tile(struct pipe_context *pipe, + struct pipe_surface *ps, + uint x, uint y, uint w, uint h, + const void *p, int src_stride) { - struct softpipe_surface *sps = softpipe_surface(ps); - sps->put_tile_raw(ps, x, y, w, h, p); + const uint cpp = ps->region->cpp; + const uint w0 = w; + const ubyte *pSrc; + ubyte *pDest; + uint i; + + assert(ps->region->map); + + CLIP_TILE; + + if (src_stride == 0) { + src_stride = w0 * cpp; + } + + pSrc = (const ubyte *) p; + pDest = ps->region->map + ps->offset + (y * ps->region->pitch + x) * cpp; + + for (i = 0; i < h; i++) { + memcpy(pDest, pSrc, w0 * cpp); + pDest += ps->region->pitch * cpp; + pSrc += src_stride; + } } +/* XXX TEMPORARY */ static void get_tile_rgba_generic(struct pipe_context *pipe, struct pipe_surface *ps, @@ -772,6 +648,7 @@ get_tile_rgba_generic(struct pipe_context *pipe, } +/* XXX TEMPORARY */ static void put_tile_rgba_generic(struct pipe_context *pipe, struct pipe_surface *ps, @@ -789,8 +666,8 @@ sp_init_surface_functions(struct softpipe_context *sp) { sp->pipe.surface_alloc = softpipe_surface_alloc; - sp->pipe.get_tile = get_tile_generic; - sp->pipe.put_tile = put_tile_generic; + sp->pipe.get_tile = softpipe_get_tile; + sp->pipe.put_tile = softpipe_put_tile; sp->pipe.get_tile_rgba = get_tile_rgba_generic; sp->pipe.put_tile_rgba = put_tile_rgba_generic; |