summaryrefslogtreecommitdiff
path: root/lib/mesa/src/gallium/auxiliary/util/u_tile.c
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2021-07-22 10:17:30 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2021-07-22 10:17:30 +0000
commitca11beabae33eb59fb981b8adf50b1d47a2a98f0 (patch)
tree3e4691a396e6e54cd54224a190663d5cf976625b /lib/mesa/src/gallium/auxiliary/util/u_tile.c
parent27c8a50e8bbde7d28b1fc46d715a4c469e24f2c4 (diff)
Import Mesa 21.1.5
Diffstat (limited to 'lib/mesa/src/gallium/auxiliary/util/u_tile.c')
-rw-r--r--lib/mesa/src/gallium/auxiliary/util/u_tile.c526
1 files changed, 38 insertions, 488 deletions
diff --git a/lib/mesa/src/gallium/auxiliary/util/u_tile.c b/lib/mesa/src/gallium/auxiliary/util/u_tile.c
index 5a486af41..567707490 100644
--- a/lib/mesa/src/gallium/auxiliary/util/u_tile.c
+++ b/lib/mesa/src/gallium/auxiliary/util/u_tile.c
@@ -27,7 +27,7 @@
/**
* RGBA/float tile get/put functions.
- * Usable both by drivers and state trackers.
+ * Usable both by drivers and gallium frontends.
*/
@@ -355,92 +355,34 @@ x32_s8_get_tile_rgba(const unsigned *src,
}
void
-pipe_tile_raw_to_rgba(enum pipe_format format,
- const void *src,
- uint w, uint h,
- float *dst, unsigned dst_stride)
+pipe_put_tile_rgba(struct pipe_transfer *pt,
+ void *dst,
+ uint x, uint y, uint w, uint h,
+ enum pipe_format format, const void *p)
{
- switch (format) {
- case PIPE_FORMAT_Z16_UNORM:
- z16_get_tile_rgba((ushort *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_Z32_UNORM:
- z32_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_Z24_UNORM_S8_UINT:
- case PIPE_FORMAT_Z24X8_UNORM:
- s8z24_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_S8_UINT:
- s8_get_tile_rgba((unsigned char *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_X24S8_UINT:
- s8x24_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_S8_UINT_Z24_UNORM:
- case PIPE_FORMAT_X8Z24_UNORM:
- z24s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_S8X24_UINT:
- x24s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_Z32_FLOAT:
- z32f_get_tile_rgba((float *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
- z32f_x24s8_get_tile_rgba((float *) src, w, h, dst, dst_stride);
- break;
- case PIPE_FORMAT_X32_S8X24_UINT:
- x32_s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
- break;
- default:
- util_format_read_4f(format,
- dst, dst_stride * sizeof(float),
- src, util_format_get_stride(format, w),
- 0, 0, w, h);
- }
-}
+ unsigned src_stride = w * 4;
-void
-pipe_tile_raw_to_unsigned(enum pipe_format format,
- const void *src,
- uint w, uint h,
- unsigned *dst, unsigned dst_stride)
-{
- util_format_read_4ui(format,
- dst, dst_stride * sizeof(float),
- src, util_format_get_stride(format, w),
- 0, 0, w, h);
-}
+ if (u_clip_tile(x, y, &w, &h, &pt->box))
+ return;
-void
-pipe_tile_raw_to_signed(enum pipe_format format,
- void *src,
- uint w, uint h,
- int *dst, unsigned dst_stride)
-{
- util_format_read_4i(format,
- dst, dst_stride * sizeof(float),
- src, util_format_get_stride(format, w),
- 0, 0, w, h);
+ /* While we do generate RGBA tiles for z/s for softpipe's texture fetch
+ * path, we never have to store from "RGBA" to Z/S.
+ */
+ if (util_format_is_depth_or_stencil(format))
+ return;
+
+ util_format_write_4(format,
+ p, src_stride * sizeof(float),
+ dst, pt->stride,
+ x, y, w, h);
}
void
pipe_get_tile_rgba(struct pipe_transfer *pt,
const void *src,
uint x, uint y, uint w, uint h,
- float *p)
-{
- pipe_get_tile_rgba_format(pt, src, x, y, w, h, pt->resource->format, p);
-}
-
-
-void
-pipe_get_tile_rgba_format(struct pipe_transfer *pt,
- const void *src,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- float *p)
+ enum pipe_format format,
+ void *dst)
{
unsigned dst_stride = w * 4;
void *packed;
@@ -460,437 +402,45 @@ pipe_get_tile_rgba_format(struct pipe_transfer *pt,
pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
- pipe_tile_raw_to_rgba(format, packed, w, h, p, dst_stride);
-
- FREE(packed);
-}
-
-
-void
-pipe_put_tile_rgba(struct pipe_transfer *pt,
- void *dst,
- uint x, uint y, uint w, uint h,
- const float *p)
-{
- pipe_put_tile_rgba_format(pt, dst, x, y, w, h, pt->resource->format, p);
-}
-
-
-void
-pipe_put_tile_rgba_format(struct pipe_transfer *pt,
- void *dst,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- const float *p)
-{
- unsigned src_stride = w * 4;
- void *packed;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box))
- return;
-
- packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format));
-
- if (!packed)
- return;
-
switch (format) {
case PIPE_FORMAT_Z16_UNORM:
- /*z16_put_tile_rgba((ushort *) packed, w, h, p, src_stride);*/
+ z16_get_tile_rgba((ushort *) packed, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_Z32_UNORM:
- /*z32_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/
+ z32_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
case PIPE_FORMAT_Z24X8_UNORM:
- /*s8z24_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/
+ s8z24_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
- case PIPE_FORMAT_S8_UINT_Z24_UNORM:
- case PIPE_FORMAT_X8Z24_UNORM:
- /*z24s8_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/
- break;
- case PIPE_FORMAT_Z32_FLOAT:
- /*z32f_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/
- break;
- case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
- /*z32f_s8x24_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/
- break;
- default:
- util_format_write_4f(format,
- p, src_stride * sizeof(float),
- packed, util_format_get_stride(format, w),
- 0, 0, w, h);
- }
-
- pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
-
- FREE(packed);
-}
-
-void
-pipe_put_tile_i_format(struct pipe_transfer *pt,
- void *dst,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- const int *p)
-{
- unsigned src_stride = w * 4;
- void *packed;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box))
- return;
-
- packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format));
-
- if (!packed)
- return;
-
- util_format_write_4i(format,
- p, src_stride * sizeof(float),
- packed, util_format_get_stride(format, w),
- 0, 0, w, h);
-
- pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
-
- FREE(packed);
-}
-
-void
-pipe_put_tile_ui_format(struct pipe_transfer *pt,
- void *dst,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- const unsigned int *p)
-{
- unsigned src_stride = w * 4;
- void *packed;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box))
- return;
-
- packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format));
-
- if (!packed)
- return;
-
- util_format_write_4ui(format,
- p, src_stride * sizeof(float),
- packed, util_format_get_stride(format, w),
- 0, 0, w, h);
-
- pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
-
- FREE(packed);
-}
-
-/**
- * Get a block of Z values, converted to 32-bit range.
- */
-void
-pipe_get_tile_z(struct pipe_transfer *pt,
- const void *src,
- uint x, uint y, uint w, uint h,
- uint *z)
-{
- const uint dstStride = w;
- const ubyte *map = src;
- uint *pDest = z;
- uint i, j;
- enum pipe_format format = pt->resource->format;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box))
- return;
-
- switch (format) {
- case PIPE_FORMAT_Z32_UNORM:
- {
- const uint *ptrc
- = (const uint *)(map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- memcpy(pDest, ptrc, 4 * w);
- pDest += dstStride;
- ptrc += pt->stride/4;
- }
- }
+ case PIPE_FORMAT_S8_UINT:
+ s8_get_tile_rgba((unsigned char *) packed, w, h, dst, dst_stride);
break;
- case PIPE_FORMAT_Z24_UNORM_S8_UINT:
- case PIPE_FORMAT_Z24X8_UNORM:
- {
- const uint *ptrc
- = (const uint *)(map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 24-bit Z to 32-bit Z */
- pDest[j] = (ptrc[j] << 8) | ((ptrc[j] >> 16) & 0xff);
- }
- pDest += dstStride;
- ptrc += pt->stride/4;
- }
- }
+ case PIPE_FORMAT_X24S8_UINT:
+ s8x24_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
case PIPE_FORMAT_X8Z24_UNORM:
- {
- const uint *ptrc
- = (const uint *)(map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 24-bit Z to 32-bit Z */
- pDest[j] = (ptrc[j] & 0xffffff00) | ((ptrc[j] >> 24) & 0xff);
- }
- pDest += dstStride;
- ptrc += pt->stride/4;
- }
- }
+ z24s8_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
- case PIPE_FORMAT_Z16_UNORM:
- {
- const ushort *ptrc
- = (const ushort *)(map + y * pt->stride + x*2);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 16-bit Z to 32-bit Z */
- pDest[j] = (ptrc[j] << 16) | ptrc[j];
- }
- pDest += dstStride;
- ptrc += pt->stride/2;
- }
- }
+ case PIPE_FORMAT_S8X24_UINT:
+ x24s8_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_Z32_FLOAT:
- {
- const float *ptrc = (const float *)(map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert float Z to 32-bit Z */
- if (ptrc[j] <= 0.0) {
- pDest[j] = 0;
- }
- else if (ptrc[j] >= 1.0) {
- pDest[j] = 0xffffffff;
- }
- else {
- double z = ptrc[j] * 0xffffffff;
- pDest[j] = (uint) z;
- }
- }
- pDest += dstStride;
- ptrc += pt->stride/4;
- }
- }
+ z32f_get_tile_rgba((float *) packed, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
- {
- const float *ptrc = (const float *)(map + y * pt->stride + x*8);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert float Z to 32-bit Z */
- if (ptrc[j] <= 0.0) {
- pDest[j*2] = 0;
- }
- else if (ptrc[j] >= 1.0) {
- pDest[j*2] = 0xffffffff;
- }
- else {
- double z = ptrc[j] * 0xffffffff;
- pDest[j*2] = (uint) z;
- }
- }
- pDest += dstStride;
- ptrc += pt->stride/4;
- }
- }
- break;
- default:
- assert(0);
- }
-}
-
-
-void
-pipe_put_tile_z(struct pipe_transfer *pt,
- void *dst,
- uint x, uint y, uint w, uint h,
- const uint *zSrc)
-{
- const uint srcStride = w;
- const uint *ptrc = zSrc;
- ubyte *map = dst;
- uint i, j;
- enum pipe_format format = pt->resource->format;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box))
- return;
-
- switch (format) {
- case PIPE_FORMAT_Z32_UNORM:
- {
- uint *pDest = (uint *) (map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- memcpy(pDest, ptrc, 4 * w);
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_Z24_UNORM_S8_UINT:
- {
- uint *pDest = (uint *) (map + y * pt->stride + x*4);
- /*assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == PIPE_TRANSFER_READ_WRITE);*/
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit Z to 24-bit Z, preserve stencil */
- pDest[j] = (pDest[j] & 0xff000000) | ptrc[j] >> 8;
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_Z24X8_UNORM:
- {
- uint *pDest = (uint *) (map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit Z to 24-bit Z (0 stencil) */
- pDest[j] = ptrc[j] >> 8;
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_S8_UINT_Z24_UNORM:
- {
- uint *pDest = (uint *) (map + y * pt->stride + x*4);
- /*assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == PIPE_TRANSFER_READ_WRITE);*/
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit Z to 24-bit Z, preserve stencil */
- pDest[j] = (pDest[j] & 0xff) | (ptrc[j] & 0xffffff00);
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_X8Z24_UNORM:
- {
- uint *pDest = (uint *) (map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit Z to 24-bit Z (0 stencil) */
- pDest[j] = ptrc[j] & 0xffffff00;
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_Z16_UNORM:
- {
- ushort *pDest = (ushort *) (map + y * pt->stride + x*2);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit Z to 16-bit Z */
- pDest[j] = ptrc[j] >> 16;
- }
- pDest += pt->stride/2;
- ptrc += srcStride;
- }
- }
- break;
- case PIPE_FORMAT_Z32_FLOAT:
- {
- float *pDest = (float *) (map + y * pt->stride + x*4);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit integer Z to float Z */
- const double scale = 1.0 / 0xffffffffU;
- pDest[j] = (float) (ptrc[j] * scale);
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
+ z32f_x24s8_get_tile_rgba((float *) packed, w, h, dst, dst_stride);
break;
- case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
- {
- float *pDest = (float *) (map + y * pt->stride + x*8);
- for (i = 0; i < h; i++) {
- for (j = 0; j < w; j++) {
- /* convert 32-bit integer Z to float Z */
- const double scale = 1.0 / 0xffffffffU;
- pDest[j*2] = (float) (ptrc[j] * scale);
- }
- pDest += pt->stride/4;
- ptrc += srcStride;
- }
- }
+ case PIPE_FORMAT_X32_S8X24_UINT:
+ x32_s8_get_tile_rgba((unsigned *) packed, w, h, dst, dst_stride);
break;
default:
- assert(0);
- }
-}
-
-
-void
-pipe_get_tile_ui_format(struct pipe_transfer *pt,
- const void *src,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- unsigned int *p)
-{
- unsigned dst_stride = w * 4;
- void *packed;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box)) {
- return;
- }
-
- packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format));
- if (!packed) {
- return;
- }
-
- if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) {
- assert((x & 1) == 0);
- }
-
- pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
-
- pipe_tile_raw_to_unsigned(format, packed, w, h, p, dst_stride);
-
- FREE(packed);
-}
-
-
-void
-pipe_get_tile_i_format(struct pipe_transfer *pt,
- const void *src,
- uint x, uint y, uint w, uint h,
- enum pipe_format format,
- int *p)
-{
- unsigned dst_stride = w * 4;
- void *packed;
-
- if (u_clip_tile(x, y, &w, &h, &pt->box)) {
- return;
- }
-
- packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format));
- if (!packed) {
- return;
- }
-
- if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) {
- assert((x & 1) == 0);
+ util_format_read_4(format,
+ dst, dst_stride * sizeof(float),
+ packed, util_format_get_stride(format, w),
+ 0, 0, w, h);
}
- pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
-
- pipe_tile_raw_to_signed(format, packed, w, h, p, dst_stride);
-
FREE(packed);
}