anv/blorp: Don't create linear ASTC surfaces for buffers
authorNanley Chery <nanley.g.chery@intel.com>
Wed, 2 Nov 2016 23:18:44 +0000 (16:18 -0700)
committerNanley Chery <nanley.g.chery@intel.com>
Thu, 3 Nov 2016 18:22:58 +0000 (11:22 -0700)
Such a surface is not possible on our hardware. Without this change, ISL
surface creation would fail with the next patch.

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/vulkan/anv_blorp.c

index 87f242c..0feb5d5 100644 (file)
@@ -126,6 +126,22 @@ get_blorp_surf_for_anv_buffer(struct anv_device *device,
                               struct blorp_surf *blorp_surf,
                               struct isl_surf *isl_surf)
 {
+   const struct isl_format_layout *fmtl =
+      isl_format_get_layout(format);
+
+   /* ASTC is the only format which doesn't support linear layouts.
+    * Create an equivalently sized surface with ISL to get around this.
+    */
+   if (fmtl->txc == ISL_TXC_ASTC) {
+      /* Use an equivalently sized format */
+      format = ISL_FORMAT_R32G32B32A32_UINT;
+      assert(fmtl->bpb == isl_format_get_layout(format)->bpb);
+
+      /* Shrink the dimensions for the new format */
+      width = DIV_ROUND_UP(width, fmtl->bw);
+      height = DIV_ROUND_UP(height, fmtl->bh);
+   }
+
    *blorp_surf = (struct blorp_surf) {
       .surf = isl_surf,
       .addr = {