anv/image: Add an aspects field
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 13 May 2016 19:50:11 +0000 (12:50 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 17 May 2016 19:17:22 +0000 (12:17 -0700)
This makes several checks easier and allows us to avoid calling
anv_format_for_vk_format in a number of cases.

src/intel/vulkan/anv_image.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/gen7_cmd_buffer.c
src/intel/vulkan/genX_cmd_buffer.c

index fb2838924dd5a43d8f083754367044d9d46d6bb4..6316a2aadc538465285148cb2d0eb42c19886c63 100644 (file)
@@ -233,12 +233,14 @@ anv_image_create(VkDevice _device,
    image->tiling = pCreateInfo->tiling;
 
    if (likely(anv_format_is_color(format))) {
+      image->aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
       r = make_surface(device, image, create_info,
                        VK_IMAGE_ASPECT_COLOR_BIT);
       if (r != VK_SUCCESS)
          goto fail;
    } else {
       if (image->format->has_depth) {
+         image->aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;
          r = make_surface(device, image, create_info,
                           VK_IMAGE_ASPECT_DEPTH_BIT);
          if (r != VK_SUCCESS)
@@ -246,6 +248,7 @@ anv_image_create(VkDevice _device,
       }
 
       if (image->format->has_stencil) {
+         image->aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;
          r = make_surface(device, image, create_info,
                           VK_IMAGE_ASPECT_STENCIL_BIT);
          if (r != VK_SUCCESS)
index a5888d6ff4d1bce83083f2b13be23207ee46744e..c3b31e612f49cb3d39fc3a768ec0efc05344828d 100644 (file)
@@ -1561,6 +1561,7 @@ struct anv_image {
     */
    VkFormat vk_format;
    const struct anv_format *format;
+   VkImageAspectFlags aspects;
    VkExtent3D extent;
    uint32_t levels;
    uint32_t array_size;
@@ -1579,7 +1580,7 @@ struct anv_image {
     * Image subsurfaces
     *
     * For each foo, anv_image::foo_surface is valid if and only if
-    * anv_image::format has a foo aspect.
+    * anv_image::aspects has a foo aspect.
     *
     * The hardware requires that the depth buffer and stencil buffer be
     * separate surfaces.  From Vulkan's perspective, though, depth and stencil
index 03ce889088acb40f9320352bd51d19f7979c8b79..62d9f4644a1e4556e0004805cbab29119ef704c6 100644 (file)
@@ -415,9 +415,8 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
       const struct anv_image_view *iview =
          anv_cmd_buffer_get_depth_stencil_view(cmd_buffer);
       const struct anv_image *image = iview ? iview->image : NULL;
-      const struct anv_format *anv_format =
-         iview ? anv_format_for_vk_format(iview->vk_format) : NULL;
-      const bool has_depth = iview && anv_format->has_depth;
+      const bool has_depth =
+         image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT);
       const uint32_t depth_format = has_depth ?
          isl_surf_get_depth_format(&cmd_buffer->device->isl_dev,
                                    &image->depth_surface.isl) : D16_UNORM;
index 0a5c404f718b82857abcf8a8c718b397304bdc97..a7e20da32cbd241c3787c7535743c942fd23b0bc 100644 (file)
@@ -927,10 +927,9 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
    const struct anv_image_view *iview =
       anv_cmd_buffer_get_depth_stencil_view(cmd_buffer);
    const struct anv_image *image = iview ? iview->image : NULL;
-   const struct anv_format *anv_format =
-      iview ? anv_format_for_vk_format(iview->vk_format) : NULL;
-   const bool has_depth = iview && anv_format->has_depth;
-   const bool has_stencil = iview && anv_format->has_stencil;
+   const bool has_depth = image && (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT);
+   const bool has_stencil =
+      image && (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT);
 
    /* FIXME: Implement the PMA stall W/A */
    /* FIXME: Width and Height are wrong */