• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2023 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 
8 #include "src/gpu/graphite/vk/VulkanImageView.h"
9 
10 #include "src/gpu/graphite/vk/VulkanGraphiteUtilsPriv.h"
11 #include "src/gpu/graphite/vk/VulkanResourceProvider.h"
12 #include "src/gpu/graphite/vk/VulkanSharedContext.h"
13 #include "src/gpu/graphite/vk/VulkanYcbcrConversion.h"
14 
15 namespace skgpu::graphite {
16 
Make(const VulkanSharedContext * sharedCtx,VkImage image,VkFormat format,Usage usage,uint32_t miplevels,sk_sp<VulkanYcbcrConversion> ycbcrConversion)17 std::unique_ptr<const VulkanImageView> VulkanImageView::Make(
18         const VulkanSharedContext* sharedCtx,
19         VkImage image,
20         VkFormat format,
21         Usage usage,
22         uint32_t miplevels,
23         sk_sp<VulkanYcbcrConversion> ycbcrConversion) {
24 
25     void* pNext = nullptr;
26     VkSamplerYcbcrConversionInfo conversionInfo;
27     if (ycbcrConversion) {
28         conversionInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
29         conversionInfo.pNext = nullptr;
30         conversionInfo.conversion = ycbcrConversion->ycbcrConversion();
31         pNext = &conversionInfo;
32     }
33 
34     VkImageViewASTCDecodeModeEXT astcDecodeMode;
35     if (format == VK_FORMAT_ASTC_4x4_UNORM_BLOCK || format == VK_FORMAT_ASTC_6x6_UNORM_BLOCK ||
36         format == VK_FORMAT_ASTC_8x8_UNORM_BLOCK) {
37         astcDecodeMode.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT;
38         astcDecodeMode.pNext = nullptr;
39         astcDecodeMode.decodeMode = VK_FORMAT_R8G8B8A8_UNORM;
40         pNext = &astcDecodeMode;
41     }
42 
43     VkImageView imageView;
44     // Create the VkImageView
45     VkImageAspectFlags aspectFlags;
46     if (Usage::kAttachment == usage) {
47         switch (format) {
48         case VK_FORMAT_S8_UINT:
49             aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT;
50             break;
51         case VK_FORMAT_D16_UNORM:
52         case VK_FORMAT_D32_SFLOAT:
53             aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
54             break;
55         case VK_FORMAT_D24_UNORM_S8_UINT:
56         case VK_FORMAT_D32_SFLOAT_S8_UINT:
57             aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
58             break;
59         default:
60             aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
61             break;
62         }
63         // Attachments can only expose the top level MIP
64         miplevels = 1;
65     } else {
66         aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
67     }
68     VkImageViewCreateInfo viewInfo = {
69         VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,               // sType
70         pNext,                                                  // pNext
71         0,                                                      // flags
72         image,                                                  // image
73         VK_IMAGE_VIEW_TYPE_2D,                                  // viewType
74         format,                                                 // format
75         { VK_COMPONENT_SWIZZLE_IDENTITY,
76           VK_COMPONENT_SWIZZLE_IDENTITY,
77           VK_COMPONENT_SWIZZLE_IDENTITY,
78           VK_COMPONENT_SWIZZLE_IDENTITY },                      // components
79         { aspectFlags, 0, miplevels, 0, 1 },                    // subresourceRange
80     };
81 
82     VkResult result;
83     VULKAN_CALL_RESULT(sharedCtx,
84                        result,
85                        CreateImageView(sharedCtx->device(), &viewInfo, nullptr, &imageView));
86     if (result != VK_SUCCESS) {
87         return nullptr;
88     }
89 
90     return std::unique_ptr<VulkanImageView>(new VulkanImageView(sharedCtx, imageView, usage,
91                                                                 ycbcrConversion));
92 }
93 
VulkanImageView(const VulkanSharedContext * sharedContext,VkImageView imageView,Usage usage,sk_sp<VulkanYcbcrConversion> ycbcrConversion)94 VulkanImageView::VulkanImageView(const VulkanSharedContext* sharedContext,
95                                  VkImageView imageView,
96                                  Usage usage,
97                                  sk_sp<VulkanYcbcrConversion> ycbcrConversion)
98     : fSharedContext(sharedContext)
99     , fImageView(imageView)
100     , fUsage(usage)
101     , fYcbcrConversion(std::move(ycbcrConversion)) {}
102 
~VulkanImageView()103 VulkanImageView::~VulkanImageView() {
104     VULKAN_CALL(fSharedContext->interface(),
105                 DestroyImageView(fSharedContext->device(), fImageView, nullptr));
106 }
107 
108 }  // namespace skgpu::graphite
109