util: Handle conversion between depth stencil formats.
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 16 Aug 2010 10:26:13 +0000 (11:26 +0100)
committerBrian Paul <brianp@vmware.com>
Thu, 22 Sep 2011 14:26:35 +0000 (08:26 -0600)
src/gallium/auxiliary/util/u_format.c

index 700382a0f5e505eb8c30e24d54a24ab624f9f690..9bf42583eecde01b6b849d67cc733be2d81ec445 100644 (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;