anv/image: Add support for the VkImageViewUsageCreateInfoKHR struct
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 11 Jul 2017 16:07:36 +0000 (09:07 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 21 Sep 2017 00:21:06 +0000 (17:21 -0700)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/anv_image.c

index bebc1c0c433d15cb44cca882632592b4a4d9f762..c3057e245507cfd5575e7fe2108c6f3c4912cff2 100644 (file)
@@ -732,11 +732,17 @@ anv_CreateImageView(VkDevice _device,
 
    assert(range->layerCount > 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_INPUT_ATTACHMENT_BIT |
-                          VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
+
+   const VkImageViewUsageCreateInfoKHR *usage_info =
+      vk_find_struct_const(pCreateInfo, IMAGE_VIEW_USAGE_CREATE_INFO_KHR);
+   VkImageUsageFlags view_usage = usage_info ? usage_info->usage : image->usage;
+   /* View usage should be a subset of image usage */
+   assert((view_usage & ~image->usage) == 0);
+   assert(view_usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
+                        VK_IMAGE_USAGE_STORAGE_BIT |
+                        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                        VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
+                        VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT));
 
    switch (image->type) {
    default:
@@ -806,8 +812,8 @@ anv_CreateImageView(VkDevice _device,
     * allow compression so we can just use the texture surface state from the
     * view.
     */
-   if (image->usage & VK_IMAGE_USAGE_SAMPLED_BIT ||
-       (image->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT &&
+   if (view_usage & VK_IMAGE_USAGE_SAMPLED_BIT ||
+       (view_usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT &&
         !(iview->aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT))) {
       iview->optimal_sampler_surface_state = alloc_surface_state(device);
       iview->general_sampler_surface_state = alloc_surface_state(device);
@@ -853,7 +859,7 @@ anv_CreateImageView(VkDevice _device,
    }
 
    /* NOTE: This one needs to go last since it may stomp isl_view.format */
-   if (image->usage & VK_IMAGE_USAGE_STORAGE_BIT) {
+   if (view_usage & VK_IMAGE_USAGE_STORAGE_BIT) {
       iview->storage_surface_state = alloc_surface_state(device);
       iview->writeonly_storage_surface_state = alloc_surface_state(device);