From: José Fonseca Date: Mon, 16 Aug 2010 10:26:13 +0000 (+0100) Subject: util: Handle conversion between depth stencil formats. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f2a2ba9c6cdef99e1dc12209ac06d4e817368bfd;p=mesa.git util: Handle conversion between depth stencil formats. --- 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;