anv: Enable "permanent" compression for immutable format images
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 25 Oct 2016 17:59:03 +0000 (10:59 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 17 Nov 2016 20:03:24 +0000 (12:03 -0800)
This commit extends our support of color compression to surfaces without
the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT set.  These images will never have
an image view created with a different format then the one set at image
creation time so it's safe to always use compression.  We still bail if the
image is used as a storage image because that sometimes ends up using a
different format.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/intel/vulkan/anv_blorp.c
src/intel/vulkan/anv_image.c

index 08e43cf1a5423ef1de51f669249c2116ae2ecd83..90ee5ed43e29fe6f8fded4b7cdd1f1723fd0385f 100644 (file)
@@ -1253,6 +1253,9 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
    const struct anv_image *image = iview->image;
    assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
 
+   if (image->aux_usage == ISL_AUX_USAGE_CCS_E)
+      return;
+
    struct blorp_surf surf;
    get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT,
                                 att_state->aux_usage, &surf);
index 1ba4c51f2f8f108e1f16112d64e516822f9ad79a..ed221a7730e00293c17dcd39d3b410323535eb45 100644 (file)
@@ -199,8 +199,30 @@ make_surface(const struct anv_device *dev,
          assert(image->aux_surface.isl.size == 0);
          ok = isl_surf_get_ccs_surf(&dev->isl_dev, &anv_surf->isl,
                                     &image->aux_surface.isl);
-         if (ok)
+         if (ok) {
             add_surface(image, &image->aux_surface);
+
+            /* For images created without MUTABLE_FORMAT_BIT set, we know that
+             * they will always be used with the original format.  In
+             * particular, they will always be used with a format that
+             * supports color compression.  This means that it's safe to just
+             * leave compression on at all times for these formats.
+             */
+            if (!(vk_info->flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) &&
+                isl_format_supports_lossless_compression(&dev->info, format)) {
+               if (vk_info->usage & VK_IMAGE_USAGE_STORAGE_BIT) {
+                  /*
+                   * For now, we leave compression off for anything that may
+                   * be used as a storage image.  This is because accessing
+                   * storage images may involve ccs-incompatible views or even
+                   * untyped messages which don't support compression at all.
+                   */
+                  anv_finishme("Enable CCS for storage images");
+               } else {
+                  image->aux_usage = ISL_AUX_USAGE_CCS_E;
+               }
+            }
+         }
       }
    }