diff options
author | José Fonseca <[email protected]> | 2010-08-16 11:26:13 +0100 |
---|---|---|
committer | Brian Paul <[email protected]> | 2011-09-22 08:26:35 -0600 |
commit | f2a2ba9c6cdef99e1dc12209ac06d4e817368bfd (patch) | |
tree | 796ae05de7be4c6aed27fe552d15570175565427 /src/gallium/auxiliary | |
parent | 51f641291d19d05acf04f08dd51215c2702a1695 (diff) |
util: Handle conversion between depth stencil formats.
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/util/u_format.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c index 700382a0f5e..9bf42583eec 100644 --- a/src/gallium/auxiliary/util/u_format.c +++ b/src/gallium/auxiliary/util/u_format.c @@ -432,6 +432,50 @@ util_format_translate(enum pipe_format dst_format, * TODO: Add a special case for formats that are mere swizzles of each other */ + if (src_format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS || + dst_format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) { + float *tmp_z = NULL; + uint8_t *tmp_s = NULL; + + assert(x_step == 1); + assert(y_step == 1); + + if (src_format_desc->unpack_z_float && + dst_format_desc->pack_z_float) { + tmp_z = MALLOC(width * sizeof *tmp_z); + } + + if (src_format_desc->unpack_s_8uscaled && + dst_format_desc->pack_s_8uscaled) { + tmp_s = MALLOC(width * sizeof *tmp_s); + } + + while (height--) { + if (tmp_z) { + src_format_desc->unpack_z_float(tmp_z, 0, src_row, src_stride, width, 1); + dst_format_desc->pack_z_float(dst_row, dst_stride, tmp_z, 0, width, 1); + } + + if (tmp_s) { + src_format_desc->unpack_s_8uscaled(tmp_s, 0, src_row, src_stride, width, 1); + dst_format_desc->pack_s_8uscaled(dst_row, dst_stride, tmp_s, 0, width, 1); + } + + dst_row += dst_step; + src_row += src_step; + } + + if (tmp_s) { + FREE(tmp_s); + } + + if (tmp_z) { + FREE(tmp_z); + } + + return; + } + if (util_format_fits_8unorm(src_format_desc) || util_format_fits_8unorm(dst_format_desc)) { unsigned tmp_stride; |