util: Handle conversion between depth stencil formats.

This commit is contained in:
José Fonseca
2010-08-16 11:26:13 +01:00
committed by Brian Paul
parent 51f641291d
commit f2a2ba9c6c
+44
View File
@@ -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;