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