vk/0.210.0: Get rid of VkImageAspect
[mesa.git] / src / vulkan / anv_image.c
index 8eb5a603c2b074bb84643d732e18b847d7c4e35a..6c39b355958a4464ff149a4a1c8dfdc2e2cad71d 100644 (file)
 
 #include "anv_private.h"
 
+/* FIXME: We shouldn't be using the actual hardware enum values here.  They
+ * change across gens.  Once we get that fixed, this include needs to go.
+ */
+#include "gen8_pack.h"
+
 static const uint8_t anv_halign[] = {
     [4] = HALIGN4,
     [8] = HALIGN8,
@@ -45,7 +50,6 @@ static const uint8_t anv_surf_type_from_image_type[] = {
    [VK_IMAGE_TYPE_1D] = SURFTYPE_1D,
    [VK_IMAGE_TYPE_2D] = SURFTYPE_2D,
    [VK_IMAGE_TYPE_3D] = SURFTYPE_3D,
-
 };
 
 static const struct anv_image_view_info
@@ -81,9 +85,6 @@ static const struct anv_surf_type_limits {
 };
 
 static const struct anv_tile_info {
-   uint32_t width;
-   uint32_t height;
-
    /**
     * Alignment for RENDER_SURFACE_STATE.SurfaceBaseAddress.
     *
@@ -97,20 +98,19 @@ static const struct anv_tile_info {
     */
    uint32_t surface_alignment;
 } anv_tile_info_table[] = {
-   [LINEAR] = {   1,  1,   64 },
-   [XMAJOR] = { 512,  8, 4096 },
-   [YMAJOR] = { 128, 32, 4096 },
-   [WMAJOR] = { 128, 32, 4096 },
+   [ISL_TILING_LINEAR]  = {   64 },
+   [ISL_TILING_X]       = { 4096 },
+   [ISL_TILING_Y]       = { 4096 },
+   [ISL_TILING_Yf]      = { 4096 },
+   [ISL_TILING_Ys]      = { 4096 },
+   [ISL_TILING_W]       = { 4096 },
 };
 
-/**
- * Return -1 on failure.
- */
-static int8_t
-anv_image_choose_tile_mode(const struct anv_image_create_info *anv_info)
+static enum isl_tiling
+anv_image_choose_tiling(const struct anv_image_create_info *anv_info)
 {
-   if (anv_info->force_tile_mode)
-      return anv_info->tile_mode;
+   if (anv_info->force_tiling)
+      return anv_info->tiling;
 
    /* The Sandybridge PRM says that the stencil buffer "is supported
     * only in Tile W memory".
@@ -118,20 +118,17 @@ anv_image_choose_tile_mode(const struct anv_image_create_info *anv_info)
 
    switch (anv_info->vk_info->tiling) {
    case VK_IMAGE_TILING_LINEAR:
-      if (unlikely(anv_info->vk_info->format == VK_FORMAT_S8_UINT)) {
-         return -1;
-      } else {
-         return LINEAR;
-      }
+      assert(anv_info->vk_info->format != VK_FORMAT_S8_UINT);
+      return ISL_TILING_LINEAR;
    case VK_IMAGE_TILING_OPTIMAL:
       if (unlikely(anv_info->vk_info->format == VK_FORMAT_S8_UINT)) {
-         return WMAJOR;
+         return ISL_TILING_W;
       } else {
-         return YMAJOR;
+         return ISL_TILING_Y;
       }
    default:
       assert(!"bad VKImageTiling");
-      return LINEAR;
+      return ISL_TILING_LINEAR;
    }
 }
 
@@ -141,7 +138,8 @@ anv_image_choose_tile_mode(const struct anv_image_create_info *anv_info)
  * struct anv_image_create_info.
  */
 static VkResult
-anv_image_make_surface(const struct anv_image_create_info *create_info,
+anv_image_make_surface(const struct anv_device *dev,
+                       const struct anv_image_create_info *create_info,
                        const struct anv_format *format,
                        uint64_t *inout_image_size,
                        uint32_t *inout_image_alignment,
@@ -154,16 +152,22 @@ anv_image_make_surface(const struct anv_image_create_info *create_info,
    const VkExtent3D *restrict extent = &create_info->vk_info->extent;
    const uint32_t levels = create_info->vk_info->mipLevels;
    const uint32_t array_size = create_info->vk_info->arraySize;
-
-   const int8_t tile_mode = anv_image_choose_tile_mode(create_info);
-   if (tile_mode == -1)
-      return vk_error(VK_ERROR_INVALID_IMAGE);
+   const enum isl_tiling tiling = anv_image_choose_tiling(create_info);
 
    const struct anv_tile_info *tile_info =
-       &anv_tile_info_table[tile_mode];
+       &anv_tile_info_table[tiling];
+
+   const uint32_t bs = format->isl_layout->bs;
+   const uint32_t bw = format->isl_layout->bw;
+   const uint32_t bh = format->isl_layout->bh;
+
+   struct isl_extent2d tile_extent;
+   isl_tiling_get_extent(&dev->isl_dev, tiling, bs, &tile_extent);
 
-   const uint32_t i = 4; /* FINISHME: Stop hardcoding subimage alignment */
-   const uint32_t j = 4; /* FINISHME: Stop hardcoding subimage alignment */
+   const uint32_t i = MAX(4, bw); /* FINISHME: Stop hardcoding subimage alignment */
+   const uint32_t j = MAX(4, bh); /* FINISHME: Stop hardcoding subimage alignment */
+   assert(i == 4 || i == 8 || i == 16);
+   assert(j == 4 || j == 8 || j == 16);
 
    uint16_t qpitch = min_qpitch;
    uint32_t mt_width = 0;
@@ -195,7 +199,8 @@ anv_image_make_surface(const struct anv_image_create_info *create_info,
           * Views >> Common Surface Formats >> Surface Layout >> 2D Surfaces >>
           * Surface Arrays >> For All Surface Other Than Separate Stencil Buffer:
           */
-         qpitch = h0 + h1 + 11 * j;
+         assert(bh ==1 || bh == 4);
+         qpitch = (h0 + h1 + 11 * j) / bh;
          mt_width = MAX(w0, w1 + w2);
          mt_height = array_size * qpitch;
       }
@@ -235,11 +240,16 @@ anv_image_make_surface(const struct anv_image_create_info *create_info,
     */
    assert(anv_is_aligned(qpitch, j));
 
-   uint32_t stride = align_u32(mt_width * format->cpp, tile_info->width);
+   uint32_t stride = align_u32(mt_width * bs / bw, tile_extent.width);
    if (create_info->stride > 0)
       stride = create_info->stride;
 
-   const uint32_t size = stride * align_u32(mt_height, tile_info->height);
+  /* The padding requirement is found in the Broadwell PRM >> Volume 5: Memory
+   * Views >> Common Surface Formats >> Surface Padding Requirements >>
+   * Sampling Engine Surfaces >> Buffer Padding Requirements:
+   */
+   const uint32_t mem_rows = align_u32(mt_height / bh, 2 * bh);
+   const uint32_t size = stride * align_u32(mem_rows, tile_extent.height);
    const uint32_t offset = align_u32(*inout_image_size,
                                      tile_info->surface_alignment);
 
@@ -250,7 +260,7 @@ anv_image_make_surface(const struct anv_image_create_info *create_info,
    *out_surface = (struct anv_surface) {
       .offset = offset,
       .stride = stride,
-      .tile_mode = tile_mode,
+      .tiling = tiling,
       .qpitch = qpitch,
       .h_align = i,
       .v_align = j,
@@ -259,6 +269,26 @@ anv_image_make_surface(const struct anv_image_create_info *create_info,
    return VK_SUCCESS;
 }
 
+static VkImageUsageFlags
+anv_image_get_full_usage(const VkImageCreateInfo *info)
+{
+   VkImageUsageFlags usage = info->usage;
+
+   if (usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
+      /* Meta will transfer from the image by binding it as a texture. */
+      usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
+   }
+
+   if (usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
+      /* Meta will transfer to the image by binding it as a color attachment,
+       * even if the image format is not a color format.
+       */
+      usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+   }
+
+   return usage;
+}
+
 VkResult
 anv_image_create(VkDevice _device,
                  const struct anv_image_create_info *create_info,
@@ -286,12 +316,10 @@ anv_image_create(VkDevice _device,
    const struct anv_surf_type_limits *limits =
       &anv_surf_type_limits[surf_type];
 
-   if (extent->width > limits->width ||
-       extent->height > limits->height ||
-       extent->depth > limits->depth) {
-      /* TODO(chadv): What is the correct error? */
-      return vk_errorf(VK_ERROR_INVALID_MEMORY_SIZE, "image extent is too large");
-   }
+   /* Errors should be caught by VkImageFormatProperties. */
+   assert(extent->width <= limits->width);
+   assert(extent->height <= limits->height);
+   assert(extent->depth <= limits->depth);
 
    image = anv_device_alloc(device, sizeof(*image), 8,
                             VK_SYSTEM_ALLOC_TYPE_API_OBJECT);
@@ -304,17 +332,27 @@ anv_image_create(VkDevice _device,
    image->format = anv_format_for_vk_format(pCreateInfo->format);
    image->levels = pCreateInfo->mipLevels;
    image->array_size = pCreateInfo->arraySize;
-   image->surf_type = surf_type;
+   image->usage = anv_image_get_full_usage(pCreateInfo);
+   image->surface_type = surf_type;
+
+   if (image->usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
+                       VK_IMAGE_USAGE_STORAGE_BIT)) {
+      image->needs_nonrt_surface_state = true;
+   }
+
+   if (image->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
+      image->needs_color_rt_surface_state = true;
+   }
 
    if (likely(anv_format_is_color(image->format))) {
-      r = anv_image_make_surface(create_info, image->format,
+      r = anv_image_make_surface(device, create_info, image->format,
                                  &image->size, &image->alignment,
                                  &image->color_surface);
       if (r != VK_SUCCESS)
          goto fail;
    } else {
       if (image->format->depth_format) {
-         r = anv_image_make_surface(create_info, image->format,
+         r = anv_image_make_surface(device, create_info, image->format,
                                     &image->size, &image->alignment,
                                     &image->depth_surface);
          if (r != VK_SUCCESS)
@@ -322,7 +360,7 @@ anv_image_create(VkDevice _device,
       }
 
       if (image->format->has_stencil) {
-         r = anv_image_make_surface(create_info, anv_format_s8_uint,
+         r = anv_image_make_surface(device, create_info, anv_format_s8_uint,
                                     &image->size, &image->alignment,
                                     &image->stencil_surface);
          if (r != VK_SUCCESS)
@@ -361,13 +399,55 @@ anv_DestroyImage(VkDevice _device, VkImage _image)
    anv_device_free(device, anv_image_from_handle(_image));
 }
 
-VkResult anv_GetImageSubresourceLayout(
+static void
+anv_surface_get_subresource_layout(struct anv_image *image,
+                                   struct anv_surface *surface,
+                                   const VkImageSubresource *subresource,
+                                   VkSubresourceLayout *layout)
+{
+   /* If we are on a non-zero mip level or array slice, we need to
+    * calculate a real offset.
+    */
+   anv_assert(subresource->mipLevel == 0);
+   anv_assert(subresource->arrayLayer == 0);
+
+   layout->offset = surface->offset;
+   layout->rowPitch = surface->stride;
+   layout->depthPitch = surface->qpitch;
+
+   /* FINISHME: We really shouldn't be doing this calculation here */
+   if (image->array_size > 1)
+      layout->size = surface->qpitch * image->array_size;
+   else
+      layout->size = surface->stride * image->extent.height;
+}
+
+void anv_GetImageSubresourceLayout(
     VkDevice                                    device,
-    VkImage                                     image,
+    VkImage                                     _image,
     const VkImageSubresource*                   pSubresource,
     VkSubresourceLayout*                        pLayout)
 {
-   stub_return(VK_UNSUPPORTED);
+   ANV_FROM_HANDLE(anv_image, image, _image);
+
+   assert(__builtin_popcount(pSubresource->aspectMask) == 1);
+
+   switch (pSubresource->aspectMask) {
+   case VK_IMAGE_ASPECT_COLOR_BIT:
+      anv_surface_get_subresource_layout(image, &image->color_surface,
+                                         pSubresource, pLayout);
+      break;
+   case VK_IMAGE_ASPECT_DEPTH_BIT:
+      anv_surface_get_subresource_layout(image, &image->depth_surface,
+                                         pSubresource, pLayout);
+      break;
+   case VK_IMAGE_ASPECT_STENCIL_BIT:
+      anv_surface_get_subresource_layout(image, &image->stencil_surface,
+                                         pSubresource, pLayout);
+      break;
+   default:
+      assert(!"Invalid image aspect");
+   }
 }
 
 VkResult
@@ -396,14 +476,14 @@ anv_validate_CreateImageView(VkDevice _device,
    view_format_info = anv_format_for_vk_format(pCreateInfo->format);
 
    /* Validate channel swizzles. */
-   assert(pCreateInfo->channels.r >= VK_CHANNEL_SWIZZLE_BEGIN_RANGE);
-   assert(pCreateInfo->channels.r <= VK_CHANNEL_SWIZZLE_END_RANGE);
-   assert(pCreateInfo->channels.g >= VK_CHANNEL_SWIZZLE_BEGIN_RANGE);
-   assert(pCreateInfo->channels.g <= VK_CHANNEL_SWIZZLE_END_RANGE);
-   assert(pCreateInfo->channels.b >= VK_CHANNEL_SWIZZLE_BEGIN_RANGE);
-   assert(pCreateInfo->channels.b <= VK_CHANNEL_SWIZZLE_END_RANGE);
-   assert(pCreateInfo->channels.a >= VK_CHANNEL_SWIZZLE_BEGIN_RANGE);
-   assert(pCreateInfo->channels.a <= VK_CHANNEL_SWIZZLE_END_RANGE);
+   assert(pCreateInfo->components.r >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE);
+   assert(pCreateInfo->components.r <= VK_COMPONENT_SWIZZLE_END_RANGE);
+   assert(pCreateInfo->components.g >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE);
+   assert(pCreateInfo->components.g <= VK_COMPONENT_SWIZZLE_END_RANGE);
+   assert(pCreateInfo->components.b >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE);
+   assert(pCreateInfo->components.b <= VK_COMPONENT_SWIZZLE_END_RANGE);
+   assert(pCreateInfo->components.a >= VK_COMPONENT_SWIZZLE_BEGIN_RANGE);
+   assert(pCreateInfo->components.a <= VK_COMPONENT_SWIZZLE_END_RANGE);
 
    /* Validate subresource. */
    assert(subresource->aspectMask != 0);
@@ -411,12 +491,12 @@ anv_validate_CreateImageView(VkDevice _device,
    assert(subresource->arraySize > 0);
    assert(subresource->baseMipLevel < image->levels);
    assert(subresource->baseMipLevel + subresource->mipLevels <= image->levels);
-   assert(subresource->baseArraySlice < image->array_size);
-   assert(subresource->baseArraySlice + subresource->arraySize <= image->array_size);
+   assert(subresource->baseArrayLayer < image->array_size);
+   assert(subresource->baseArrayLayer + subresource->arraySize <= image->array_size);
    assert(pView);
 
    if (view_info->is_cube) {
-      assert(subresource->baseArraySlice % 6 == 0);
+      assert(subresource->baseArrayLayer % 6 == 0);
       assert(subresource->arraySize % 6 == 0);
    }
 
@@ -430,17 +510,19 @@ anv_validate_CreateImageView(VkDevice _device,
       assert(!image->format->has_stencil);
       assert(!view_format_info->depth_format);
       assert(!view_format_info->has_stencil);
-      assert(view_format_info->cpp == image->format->cpp);
+      assert(view_format_info->isl_layout->bs ==
+             image->format->isl_layout->bs);
    } else if (subresource->aspectMask & ds_flags) {
       assert((subresource->aspectMask & ~ds_flags) == 0);
 
       if (subresource->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
          assert(image->format->depth_format);
          assert(view_format_info->depth_format);
-         assert(view_format_info->cpp == image->format->cpp);
+         assert(view_format_info->isl_layout->bs ==
+                image->format->isl_layout->bs);
       }
 
-      if (subresource->aspectMask & VK_IMAGE_ASPECT_STENCIL) {
+      if (subresource->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
          /* FINISHME: Is it legal to have an R8 view of S8? */
          assert(image->format->has_stencil);
          assert(view_format_info->has_stencil);
@@ -458,13 +540,42 @@ anv_image_view_init(struct anv_image_view *iview,
                     const VkImageViewCreateInfo* pCreateInfo,
                     struct anv_cmd_buffer *cmd_buffer)
 {
+   ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image);
+   const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange;
+
+   assert(range->arraySize > 0);
+   assert(range->baseMipLevel < image->levels);
+   assert(image->usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
+                          VK_IMAGE_USAGE_STORAGE_BIT |
+                          VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                          VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
+
+   switch (image->type) {
+   default:
+      unreachable("bad VkImageType");
+   case VK_IMAGE_TYPE_1D:
+   case VK_IMAGE_TYPE_2D:
+      assert(range->baseArrayLayer + range->arraySize - 1 <= image->array_size);
+      break;
+   case VK_IMAGE_TYPE_3D:
+      assert(range->baseArrayLayer + range->arraySize - 1
+             <= anv_minify(image->extent.depth, range->baseMipLevel));
+      break;
+   }
+
    switch (device->info.gen) {
    case 7:
-      gen7_image_view_init(iview, device, pCreateInfo, cmd_buffer);
+      if (device->info.is_haswell)
+         gen75_image_view_init(iview, device, pCreateInfo, cmd_buffer);
+      else
+         gen7_image_view_init(iview, device, pCreateInfo, cmd_buffer);
       break;
    case 8:
       gen8_image_view_init(iview, device, pCreateInfo, cmd_buffer);
       break;
+   case 9:
+      gen9_image_view_init(iview, device, pCreateInfo, cmd_buffer);
+      break;
    default:
       unreachable("unsupported gen\n");
    }
@@ -490,32 +601,30 @@ anv_CreateImageView(VkDevice _device,
    return VK_SUCCESS;
 }
 
-void
-anv_DestroyImageView(VkDevice _device, VkImageView _iview)
+static void
+anv_image_view_destroy(struct anv_device *device,
+                       struct anv_image_view *iview)
 {
-   ANV_FROM_HANDLE(anv_device, device, _device);
-   ANV_FROM_HANDLE(anv_image_view, iview, _iview);
+   if (iview->image->needs_color_rt_surface_state) {
+      anv_state_pool_free(&device->surface_state_pool,
+                          iview->color_rt_surface_state);
+   }
+
+   if (iview->image->needs_nonrt_surface_state) {
+      anv_state_pool_free(&device->surface_state_pool,
+                          iview->nonrt_surface_state);
+   }
 
-   anv_state_pool_free(&device->surface_state_pool, iview->surface_state);
    anv_device_free(device, iview);
 }
 
-static void
-anv_depth_stencil_view_init(struct anv_image_view *iview,
-                            const VkAttachmentViewCreateInfo *pCreateInfo)
+void
+anv_DestroyImageView(VkDevice _device, VkImageView _iview)
 {
-   ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image);
-
-   /* XXX: We don't handle any of these */
-   anv_assert(pCreateInfo->mipLevel == 0);
-   anv_assert(pCreateInfo->baseArraySlice == 0);
-   anv_assert(pCreateInfo->arraySize == 1);
-
-   iview->image = image;
-   iview->format = anv_format_for_vk_format(pCreateInfo->format);
+   ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_image_view, iview, _iview);
 
-   assert(anv_format_is_depth_or_stencil(image->format));
-   assert(anv_format_is_depth_or_stencil(iview->format));
+   anv_image_view_destroy(device, iview);
 }
 
 struct anv_surface *
@@ -523,107 +632,78 @@ anv_image_get_surface_for_aspect_mask(struct anv_image *image, VkImageAspectFlag
 {
    switch (aspect_mask) {
    case VK_IMAGE_ASPECT_COLOR_BIT:
-      assert(anv_format_is_color(image->format));
-      return &image->color_surface;
+      /* Dragons will eat you.
+       *
+       * Meta attaches all destination surfaces as color render targets. Guess
+       * what surface the Meta Dragons really want.
+       */
+      if (image->format->depth_format && image->format->has_stencil) {
+         anv_finishme("combined depth stencil formats");
+         return &image->depth_surface;
+      } else if (image->format->depth_format) {
+         return &image->depth_surface;
+      } else if (image->format->has_stencil) {
+         return &image->stencil_surface;
+      } else {
+         return &image->color_surface;
+      }
+      break;
    case VK_IMAGE_ASPECT_DEPTH_BIT:
       assert(image->format->depth_format);
       return &image->depth_surface;
    case VK_IMAGE_ASPECT_STENCIL_BIT:
       assert(image->format->has_stencil);
-      anv_finishme("stencil image views");
       return &image->stencil_surface;
    case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
-      /* FINISHME: The Vulkan spec (git a511ba2) requires support for combined
-       * depth stencil formats. Specifically, it states:
-       *
-       *    At least one of ename:VK_FORMAT_D24_UNORM_S8_UINT or
-       *    ename:VK_FORMAT_D32_SFLOAT_S8_UINT must be supported.
-       */
-      anv_finishme("combined depthstencil aspect");
-      assert(image->format->depth_format);
-      return &image->depth_surface;
+      if (image->format->depth_format && image->format->has_stencil) {
+         /* FINISHME: The Vulkan spec (git a511ba2) requires support for combined
+          * depth stencil formats. Specifically, it states:
+          *
+          *    At least one of ename:VK_FORMAT_D24_UNORM_S8_UINT or
+          *    ename:VK_FORMAT_D32_SFLOAT_S8_UINT must be supported.
+          */
+         anv_finishme("combined depthstencil aspect");
+         return &image->depth_surface;
+      } else if (image->format->depth_format) {
+         return &image->depth_surface;
+      } else if (image->format->has_stencil) {
+         return &image->stencil_surface;
+      }
+      /* fallthrough */
     default:
        unreachable("image does not have aspect");
        return NULL;
    }
 }
 
-/** The attachment may be a color view into a non-color image.  */
-struct anv_surface *
-anv_image_get_surface_for_color_attachment(struct anv_image *image)
-{
-   if (anv_format_is_color(image->format)) {
-      return &image->color_surface;
-   } else if (image->format->depth_format) {
-      return &image->depth_surface;
-   } else if (image->format->has_stencil) {
-      return &image->stencil_surface;
-   } else {
-      unreachable("image has bad format");
-      return NULL;
-   }
-}
-
-void
-anv_color_attachment_view_init(struct anv_image_view *iview,
-                               struct anv_device *device,
-                               const VkAttachmentViewCreateInfo* pCreateInfo,
-                               struct anv_cmd_buffer *cmd_buffer)
-{
-   switch (device->info.gen) {
-   case 7:
-      gen7_color_attachment_view_init(iview, device, pCreateInfo, cmd_buffer);
-      break;
-   case 8:
-      gen8_color_attachment_view_init(iview, device, pCreateInfo, cmd_buffer);
-      break;
-   default:
-      unreachable("unsupported gen\n");
-   }
-}
-
-VkResult
-anv_CreateAttachmentView(VkDevice _device,
-                         const VkAttachmentViewCreateInfo *pCreateInfo,
-                         VkAttachmentView *pView)
-{
-   ANV_FROM_HANDLE(anv_device, device, _device);
-   struct anv_image_view *iview;
-
-   assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO);
-
-   iview = anv_device_alloc(device, sizeof(*iview), 8,
-                            VK_SYSTEM_ALLOC_TYPE_API_OBJECT);
-   if (iview == NULL)
-      return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
-
-   const struct anv_format *format =
-      anv_format_for_vk_format(pCreateInfo->format);
-
-   if (anv_format_is_depth_or_stencil(format)) {
-      anv_depth_stencil_view_init(iview, pCreateInfo);
-   } else {
-      anv_color_attachment_view_init(iview, device, pCreateInfo, NULL);
-   }
-
-   pView->handle = anv_image_view_to_handle(iview).handle;
-
-   return VK_SUCCESS;
-}
-
-void
-anv_DestroyAttachmentView(VkDevice _device, VkAttachmentView _aview)
-{
-   ANV_FROM_HANDLE(anv_device, device, _device);
-   VkImageView _iview = { .handle = _aview.handle };
-   ANV_FROM_HANDLE(anv_image_view, iview, _iview);
-
-   /* Depth and stencil render targets have no RENDER_SURFACE_STATE.  Instead,
-    * they use 3DSTATE_DEPTH_BUFFER and 3DSTATE_STENCIL_BUFFER.
-    */
-   if (!anv_format_is_depth_or_stencil(iview->format)) {
-      anv_state_pool_free(&device->surface_state_pool, iview->surface_state);
-   }
-
-   anv_device_free(device, iview);
-}
+#if 0
+   VkImageAspectFlags aspect_mask = 0;
+   if (format->depth_format)
+      aspect_mask |= VK_IMAGE_ASPECT_DEPTH_BIT;
+   if (format->has_stencil)
+      aspect_mask |= VK_IMAGE_ASPECT_STENCIL_BIT;
+   if (!aspect_mask)
+      aspect_mask |= VK_IMAGE_ASPECT_COLOR_BIT;
+
+   anv_image_view_init(iview, device,
+      &(VkImageViewCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+         .image = info->image,
+         .viewType = VK_IMAGE_VIEW_TYPE_2D,
+         .format = info->format,
+         .channels = {
+            .r = VK_CHANNEL_SWIZZLE_R,
+            .g = VK_CHANNEL_SWIZZLE_G,
+            .b = VK_CHANNEL_SWIZZLE_B,
+            .a = VK_CHANNEL_SWIZZLE_A,
+         },
+         .subresourceRange = {
+            .aspectMask = aspect_mask,
+            .baseMipLevel = info->mipLevel,
+            .mipLevels = 1,
+            .baseArrayLayer = info->baseArraySlice,
+            .arraySize = info->arraySize,
+         },
+      },
+      NULL);
+#endif