isl: Add func isl_surf_get_depth_format()
authorChad Versace <chad.versace@intel.com>
Tue, 9 Feb 2016 02:48:41 +0000 (18:48 -0800)
committerChad Versace <chad.versace@intel.com>
Tue, 9 Feb 2016 18:02:50 +0000 (10:02 -0800)
For depth surfaces, it gets the value for
3DSTATE_DEPTH_BUFFER.SurfaceFormat.

src/isl/isl.c
src/isl/isl.h

index ec6323741e875725c6a6caeda4b10679afef475d..f5b2cd5b2506112d95e57dd615935dc674a93d84 100644 (file)
@@ -1382,3 +1382,43 @@ isl_surf_get_image_intratile_offset_el(const struct isl_device *dev,
    *x_offset_el = small_x_offset_el;
    *y_offset_el = small_y_offset_el;
 }
+
+uint32_t
+isl_surf_get_depth_format(const struct isl_device *dev,
+                          const struct isl_surf *surf)
+{
+   /* Support for separate stencil buffers began in gen5. Support for
+    * interleaved depthstencil buffers ceased in gen7. The intermediate gens,
+    * those that supported separate and interleaved stencil, were gen5 and
+    * gen6.
+    *
+    * For a list of all available formats, see the Sandybridge PRM >> Volume
+    * 2 Part 1: 3D/Media - 3D Pipeline >> 3DSTATE_DEPTH_BUFFER >> Surface
+    * Format (p321).
+    */
+
+   assert(surf->usage & ISL_SURF_USAGE_DEPTH_BIT);
+
+   if (surf->usage & ISL_SURF_USAGE_STENCIL_BIT)
+      assert(ISL_DEV_GEN(dev) < 7);
+
+   switch (surf->format) {
+   default:
+      unreachable("bad isl depth format");
+   case ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS:
+      assert(ISL_DEV_GEN(dev) < 7);
+      return 0; /* D32_FLOAT_S8X24_UINT */
+   case ISL_FORMAT_R32_FLOAT:
+      return 1; /* D32_FLOAT */
+   case ISL_FORMAT_R24_UNORM_X8_TYPELESS:
+      if (surf->usage & ISL_SURF_USAGE_STENCIL_BIT) {
+         assert(ISL_DEV_GEN(dev) < 7);
+         return 2; /* D24_UNORM_S8_UINT */
+      } else {
+         assert(ISL_DEV_GEN(dev) >= 5);
+         return 3; /* D24_UNORM_X8_UINT */
+      }
+   case ISL_FORMAT_R16_UNORM:
+      return 5; /* D16_UNORM */
+   }
+}
index bc7a315e8aec9b0063ffb35676a3ce2a7c56efde..3e0ff935948359362d2001b992de1cbefe3c8699 100644 (file)
@@ -1010,6 +1010,16 @@ isl_surf_get_image_intratile_offset_el(const struct isl_device *dev,
                                        uint32_t *x_offset_el,
                                        uint32_t *y_offset_el);
 
+/**
+ * @brief Get value of 3DSTATE_DEPTH_BUFFER.SurfaceFormat
+ *
+ * @pre surf->usage has ISL_SURF_USAGE_DEPTH_BIT
+ * @pre surf->format must be a valid format for depth surfaces
+ */
+uint32_t
+isl_surf_get_depth_format(const struct isl_device *dev,
+                          const struct isl_surf *surf);
+
 #ifdef __cplusplus
 }
 #endif