xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkImage.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkImage.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanMutableTextureState.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCaps.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSet.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkGpu.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkImageView.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUniformHandler.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkUtil.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanMemory.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanMutableTextureStatePriv.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanUtilsPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
24*c8dee2aaSAndroid Build Coastguard Worker #include <functional>
25*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
28*c8dee2aaSAndroid Build Coastguard Worker 
MakeStencil(GrVkGpu * gpu,SkISize dimensions,int sampleCnt,VkFormat format)29*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkImage> GrVkImage::MakeStencil(GrVkGpu* gpu,
30*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
31*c8dee2aaSAndroid Build Coastguard Worker                                         int sampleCnt,
32*c8dee2aaSAndroid Build Coastguard Worker                                         VkFormat format) {
33*c8dee2aaSAndroid Build Coastguard Worker     VkImageUsageFlags vkUsageFlags =
34*c8dee2aaSAndroid Build Coastguard Worker             VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
35*c8dee2aaSAndroid Build Coastguard Worker     return GrVkImage::Make(gpu,
36*c8dee2aaSAndroid Build Coastguard Worker                            dimensions,
37*c8dee2aaSAndroid Build Coastguard Worker                            UsageFlags::kStencilAttachment,
38*c8dee2aaSAndroid Build Coastguard Worker                            sampleCnt,
39*c8dee2aaSAndroid Build Coastguard Worker                            format,
40*c8dee2aaSAndroid Build Coastguard Worker                            /*mipLevels=*/1,
41*c8dee2aaSAndroid Build Coastguard Worker                            vkUsageFlags,
42*c8dee2aaSAndroid Build Coastguard Worker                            GrProtected::kNo,
43*c8dee2aaSAndroid Build Coastguard Worker                            GrMemoryless::kNo,
44*c8dee2aaSAndroid Build Coastguard Worker                            skgpu::Budgeted::kYes);
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker 
MakeMSAA(GrVkGpu * gpu,SkISize dimensions,int numSamples,VkFormat format,GrProtected isProtected,GrMemoryless memoryless)47*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkImage> GrVkImage::MakeMSAA(GrVkGpu* gpu,
48*c8dee2aaSAndroid Build Coastguard Worker                                      SkISize dimensions,
49*c8dee2aaSAndroid Build Coastguard Worker                                      int numSamples,
50*c8dee2aaSAndroid Build Coastguard Worker                                      VkFormat format,
51*c8dee2aaSAndroid Build Coastguard Worker                                      GrProtected isProtected,
52*c8dee2aaSAndroid Build Coastguard Worker                                      GrMemoryless memoryless) {
53*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(numSamples > 1);
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     VkImageUsageFlags vkUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
56*c8dee2aaSAndroid Build Coastguard Worker     if (memoryless == GrMemoryless::kYes) {
57*c8dee2aaSAndroid Build Coastguard Worker         vkUsageFlags |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
58*c8dee2aaSAndroid Build Coastguard Worker     } else {
59*c8dee2aaSAndroid Build Coastguard Worker         vkUsageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
60*c8dee2aaSAndroid Build Coastguard Worker     }
61*c8dee2aaSAndroid Build Coastguard Worker     return GrVkImage::Make(gpu,
62*c8dee2aaSAndroid Build Coastguard Worker                            dimensions,
63*c8dee2aaSAndroid Build Coastguard Worker                            UsageFlags::kColorAttachment,
64*c8dee2aaSAndroid Build Coastguard Worker                            numSamples,
65*c8dee2aaSAndroid Build Coastguard Worker                            format,
66*c8dee2aaSAndroid Build Coastguard Worker                            /*mipLevels=*/1,
67*c8dee2aaSAndroid Build Coastguard Worker                            vkUsageFlags,
68*c8dee2aaSAndroid Build Coastguard Worker                            isProtected,
69*c8dee2aaSAndroid Build Coastguard Worker                            memoryless,
70*c8dee2aaSAndroid Build Coastguard Worker                            skgpu::Budgeted::kYes);
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker 
MakeTexture(GrVkGpu * gpu,SkISize dimensions,VkFormat format,uint32_t mipLevels,GrRenderable renderable,int numSamples,skgpu::Budgeted budgeted,GrProtected isProtected)73*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkImage> GrVkImage::MakeTexture(GrVkGpu* gpu,
74*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
75*c8dee2aaSAndroid Build Coastguard Worker                                         VkFormat format,
76*c8dee2aaSAndroid Build Coastguard Worker                                         uint32_t mipLevels,
77*c8dee2aaSAndroid Build Coastguard Worker                                         GrRenderable renderable,
78*c8dee2aaSAndroid Build Coastguard Worker                                         int numSamples,
79*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Budgeted budgeted,
80*c8dee2aaSAndroid Build Coastguard Worker                                         GrProtected isProtected) {
81*c8dee2aaSAndroid Build Coastguard Worker     UsageFlags usageFlags = UsageFlags::kTexture;
82*c8dee2aaSAndroid Build Coastguard Worker     VkImageUsageFlags vkUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
83*c8dee2aaSAndroid Build Coastguard Worker                                      VK_IMAGE_USAGE_TRANSFER_DST_BIT;
84*c8dee2aaSAndroid Build Coastguard Worker     if (renderable == GrRenderable::kYes) {
85*c8dee2aaSAndroid Build Coastguard Worker         usageFlags |= UsageFlags::kColorAttachment;
86*c8dee2aaSAndroid Build Coastguard Worker         vkUsageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
87*c8dee2aaSAndroid Build Coastguard Worker         // We always make our render targets support being used as input attachments
88*c8dee2aaSAndroid Build Coastguard Worker         vkUsageFlags |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
89*c8dee2aaSAndroid Build Coastguard Worker     }
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     return GrVkImage::Make(gpu,
92*c8dee2aaSAndroid Build Coastguard Worker                            dimensions,
93*c8dee2aaSAndroid Build Coastguard Worker                            usageFlags,
94*c8dee2aaSAndroid Build Coastguard Worker                            numSamples,
95*c8dee2aaSAndroid Build Coastguard Worker                            format,
96*c8dee2aaSAndroid Build Coastguard Worker                            mipLevels,
97*c8dee2aaSAndroid Build Coastguard Worker                            vkUsageFlags,
98*c8dee2aaSAndroid Build Coastguard Worker                            isProtected,
99*c8dee2aaSAndroid Build Coastguard Worker                            GrMemoryless::kNo,
100*c8dee2aaSAndroid Build Coastguard Worker                            budgeted);
101*c8dee2aaSAndroid Build Coastguard Worker }
102*c8dee2aaSAndroid Build Coastguard Worker 
make_views(GrVkGpu * gpu,const GrVkImageInfo & info,GrAttachment::UsageFlags attachmentUsages,sk_sp<const GrVkImageView> * framebufferView,sk_sp<const GrVkImageView> * textureView)103*c8dee2aaSAndroid Build Coastguard Worker static bool make_views(GrVkGpu* gpu,
104*c8dee2aaSAndroid Build Coastguard Worker                        const GrVkImageInfo& info,
105*c8dee2aaSAndroid Build Coastguard Worker                        GrAttachment::UsageFlags attachmentUsages,
106*c8dee2aaSAndroid Build Coastguard Worker                        sk_sp<const GrVkImageView>* framebufferView,
107*c8dee2aaSAndroid Build Coastguard Worker                        sk_sp<const GrVkImageView>* textureView) {
108*c8dee2aaSAndroid Build Coastguard Worker     GrVkImageView::Type viewType;
109*c8dee2aaSAndroid Build Coastguard Worker     if (attachmentUsages & GrAttachment::UsageFlags::kStencilAttachment) {
110*c8dee2aaSAndroid Build Coastguard Worker         // If we have stencil usage then we shouldn't have any other usages
111*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(attachmentUsages == GrAttachment::UsageFlags::kStencilAttachment);
112*c8dee2aaSAndroid Build Coastguard Worker         viewType = GrVkImageView::kStencil_Type;
113*c8dee2aaSAndroid Build Coastguard Worker     } else {
114*c8dee2aaSAndroid Build Coastguard Worker         viewType = GrVkImageView::kColor_Type;
115*c8dee2aaSAndroid Build Coastguard Worker     }
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker     if (SkToBool(attachmentUsages & GrAttachment::UsageFlags::kStencilAttachment) ||
118*c8dee2aaSAndroid Build Coastguard Worker         SkToBool(attachmentUsages & GrAttachment::UsageFlags::kColorAttachment)) {
119*c8dee2aaSAndroid Build Coastguard Worker         // Attachments can only have a mip level of 1
120*c8dee2aaSAndroid Build Coastguard Worker         *framebufferView = GrVkImageView::Make(
121*c8dee2aaSAndroid Build Coastguard Worker                 gpu, info.fImage, info.fFormat, viewType, 1, info.fYcbcrConversionInfo);
122*c8dee2aaSAndroid Build Coastguard Worker         if (!*framebufferView) {
123*c8dee2aaSAndroid Build Coastguard Worker             return false;
124*c8dee2aaSAndroid Build Coastguard Worker         }
125*c8dee2aaSAndroid Build Coastguard Worker     }
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker     if (attachmentUsages & GrAttachment::UsageFlags::kTexture) {
128*c8dee2aaSAndroid Build Coastguard Worker         *textureView = GrVkImageView::Make(gpu,
129*c8dee2aaSAndroid Build Coastguard Worker                                            info.fImage,
130*c8dee2aaSAndroid Build Coastguard Worker                                            info.fFormat,
131*c8dee2aaSAndroid Build Coastguard Worker                                            viewType,
132*c8dee2aaSAndroid Build Coastguard Worker                                            info.fLevelCount,
133*c8dee2aaSAndroid Build Coastguard Worker                                            info.fYcbcrConversionInfo);
134*c8dee2aaSAndroid Build Coastguard Worker         if (!*textureView) {
135*c8dee2aaSAndroid Build Coastguard Worker             return false;
136*c8dee2aaSAndroid Build Coastguard Worker         }
137*c8dee2aaSAndroid Build Coastguard Worker     }
138*c8dee2aaSAndroid Build Coastguard Worker     return true;
139*c8dee2aaSAndroid Build Coastguard Worker }
140*c8dee2aaSAndroid Build Coastguard Worker 
Make(GrVkGpu * gpu,SkISize dimensions,UsageFlags attachmentUsages,int sampleCnt,VkFormat format,uint32_t mipLevels,VkImageUsageFlags vkUsageFlags,GrProtected isProtected,GrMemoryless memoryless,skgpu::Budgeted budgeted)141*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkImage> GrVkImage::Make(GrVkGpu* gpu,
142*c8dee2aaSAndroid Build Coastguard Worker                                  SkISize dimensions,
143*c8dee2aaSAndroid Build Coastguard Worker                                  UsageFlags attachmentUsages,
144*c8dee2aaSAndroid Build Coastguard Worker                                  int sampleCnt,
145*c8dee2aaSAndroid Build Coastguard Worker                                  VkFormat format,
146*c8dee2aaSAndroid Build Coastguard Worker                                  uint32_t mipLevels,
147*c8dee2aaSAndroid Build Coastguard Worker                                  VkImageUsageFlags vkUsageFlags,
148*c8dee2aaSAndroid Build Coastguard Worker                                  GrProtected isProtected,
149*c8dee2aaSAndroid Build Coastguard Worker                                  GrMemoryless memoryless,
150*c8dee2aaSAndroid Build Coastguard Worker                                  skgpu::Budgeted budgeted) {
151*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage::ImageDesc imageDesc;
152*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fImageType = VK_IMAGE_TYPE_2D;
153*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fFormat = format;
154*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fWidth = dimensions.width();
155*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fHeight = dimensions.height();
156*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fLevels = mipLevels;
157*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fSamples = sampleCnt;
158*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
159*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fUsageFlags = vkUsageFlags;
160*c8dee2aaSAndroid Build Coastguard Worker     imageDesc.fIsProtected = isProtected;
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker     GrVkImageInfo info;
163*c8dee2aaSAndroid Build Coastguard Worker     if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
164*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView> framebufferView;
168*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView> textureView;
169*c8dee2aaSAndroid Build Coastguard Worker     if (!make_views(gpu, info, attachmentUsages, &framebufferView, &textureView)) {
170*c8dee2aaSAndroid Build Coastguard Worker         GrVkImage::DestroyImageInfo(gpu, &info);
171*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
172*c8dee2aaSAndroid Build Coastguard Worker     }
173*c8dee2aaSAndroid Build Coastguard Worker 
174*c8dee2aaSAndroid Build Coastguard Worker     auto mutableState = sk_make_sp<skgpu::MutableTextureState>(
175*c8dee2aaSAndroid Build Coastguard Worker             skgpu::MutableTextureStates::MakeVulkan(info.fImageLayout, info.fCurrentQueueFamily));
176*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrVkImage>(new GrVkImage(gpu,
177*c8dee2aaSAndroid Build Coastguard Worker                                           dimensions,
178*c8dee2aaSAndroid Build Coastguard Worker                                           attachmentUsages,
179*c8dee2aaSAndroid Build Coastguard Worker                                           info,
180*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(mutableState),
181*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(framebufferView),
182*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(textureView),
183*c8dee2aaSAndroid Build Coastguard Worker                                           budgeted,
184*c8dee2aaSAndroid Build Coastguard Worker                                           /*label=*/"MakeVkImage"));
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker 
MakeWrapped(GrVkGpu * gpu,SkISize dimensions,const GrVkImageInfo & info,sk_sp<skgpu::MutableTextureState> mutableState,UsageFlags attachmentUsages,GrWrapOwnership ownership,GrWrapCacheable cacheable,std::string_view label,bool forSecondaryCB)187*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrVkImage> GrVkImage::MakeWrapped(GrVkGpu* gpu,
188*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
189*c8dee2aaSAndroid Build Coastguard Worker                                         const GrVkImageInfo& info,
190*c8dee2aaSAndroid Build Coastguard Worker                                         sk_sp<skgpu::MutableTextureState> mutableState,
191*c8dee2aaSAndroid Build Coastguard Worker                                         UsageFlags attachmentUsages,
192*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapOwnership ownership,
193*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapCacheable cacheable,
194*c8dee2aaSAndroid Build Coastguard Worker                                         std::string_view label,
195*c8dee2aaSAndroid Build Coastguard Worker                                         bool forSecondaryCB) {
196*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView> framebufferView;
197*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView> textureView;
198*c8dee2aaSAndroid Build Coastguard Worker     if (!forSecondaryCB) {
199*c8dee2aaSAndroid Build Coastguard Worker         if (!make_views(gpu, info, attachmentUsages, &framebufferView, &textureView)) {
200*c8dee2aaSAndroid Build Coastguard Worker             return nullptr;
201*c8dee2aaSAndroid Build Coastguard Worker         }
202*c8dee2aaSAndroid Build Coastguard Worker     }
203*c8dee2aaSAndroid Build Coastguard Worker 
204*c8dee2aaSAndroid Build Coastguard Worker     GrBackendObjectOwnership backendOwnership = kBorrow_GrWrapOwnership == ownership
205*c8dee2aaSAndroid Build Coastguard Worker                                                         ? GrBackendObjectOwnership::kBorrowed
206*c8dee2aaSAndroid Build Coastguard Worker                                                         : GrBackendObjectOwnership::kOwned;
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker     return sk_sp<GrVkImage>(new GrVkImage(gpu,
209*c8dee2aaSAndroid Build Coastguard Worker                                           dimensions,
210*c8dee2aaSAndroid Build Coastguard Worker                                           attachmentUsages,
211*c8dee2aaSAndroid Build Coastguard Worker                                           info,
212*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(mutableState),
213*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(framebufferView),
214*c8dee2aaSAndroid Build Coastguard Worker                                           std::move(textureView),
215*c8dee2aaSAndroid Build Coastguard Worker                                           backendOwnership,
216*c8dee2aaSAndroid Build Coastguard Worker                                           cacheable,
217*c8dee2aaSAndroid Build Coastguard Worker                                           forSecondaryCB,
218*c8dee2aaSAndroid Build Coastguard Worker                                           label));
219*c8dee2aaSAndroid Build Coastguard Worker }
220*c8dee2aaSAndroid Build Coastguard Worker 
GrVkImage(GrVkGpu * gpu,SkISize dimensions,UsageFlags supportedUsages,const GrVkImageInfo & info,sk_sp<skgpu::MutableTextureState> mutableState,sk_sp<const GrVkImageView> framebufferView,sk_sp<const GrVkImageView> textureView,skgpu::Budgeted budgeted,std::string_view label)221*c8dee2aaSAndroid Build Coastguard Worker GrVkImage::GrVkImage(GrVkGpu* gpu,
222*c8dee2aaSAndroid Build Coastguard Worker                      SkISize dimensions,
223*c8dee2aaSAndroid Build Coastguard Worker                      UsageFlags supportedUsages,
224*c8dee2aaSAndroid Build Coastguard Worker                      const GrVkImageInfo& info,
225*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<skgpu::MutableTextureState> mutableState,
226*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<const GrVkImageView> framebufferView,
227*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<const GrVkImageView> textureView,
228*c8dee2aaSAndroid Build Coastguard Worker                      skgpu::Budgeted budgeted,
229*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label)
230*c8dee2aaSAndroid Build Coastguard Worker         : GrAttachment(gpu,
231*c8dee2aaSAndroid Build Coastguard Worker                        dimensions,
232*c8dee2aaSAndroid Build Coastguard Worker                        supportedUsages,
233*c8dee2aaSAndroid Build Coastguard Worker                        info.fSampleCount,
234*c8dee2aaSAndroid Build Coastguard Worker                        info.fLevelCount > 1 ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo,
235*c8dee2aaSAndroid Build Coastguard Worker                        info.fProtected,
236*c8dee2aaSAndroid Build Coastguard Worker                        label,
237*c8dee2aaSAndroid Build Coastguard Worker                        info.fAlloc.fFlags & skgpu::VulkanAlloc::kLazilyAllocated_Flag
238*c8dee2aaSAndroid Build Coastguard Worker                                ? GrMemoryless::kYes
239*c8dee2aaSAndroid Build Coastguard Worker                                : GrMemoryless::kNo)
240*c8dee2aaSAndroid Build Coastguard Worker         , fInfo(info)
241*c8dee2aaSAndroid Build Coastguard Worker         , fInitialQueueFamily(info.fCurrentQueueFamily)
242*c8dee2aaSAndroid Build Coastguard Worker         , fMutableState(std::move(mutableState))
243*c8dee2aaSAndroid Build Coastguard Worker         , fFramebufferView(std::move(framebufferView))
244*c8dee2aaSAndroid Build Coastguard Worker         , fTextureView(std::move(textureView))
245*c8dee2aaSAndroid Build Coastguard Worker         , fIsBorrowed(false) {
246*c8dee2aaSAndroid Build Coastguard Worker     this->init(gpu, false);
247*c8dee2aaSAndroid Build Coastguard Worker     this->registerWithCache(budgeted);
248*c8dee2aaSAndroid Build Coastguard Worker }
249*c8dee2aaSAndroid Build Coastguard Worker 
GrVkImage(GrVkGpu * gpu,SkISize dimensions,UsageFlags supportedUsages,const GrVkImageInfo & info,sk_sp<skgpu::MutableTextureState> mutableState,sk_sp<const GrVkImageView> framebufferView,sk_sp<const GrVkImageView> textureView,GrBackendObjectOwnership ownership,GrWrapCacheable cacheable,bool forSecondaryCB,std::string_view label)250*c8dee2aaSAndroid Build Coastguard Worker GrVkImage::GrVkImage(GrVkGpu* gpu,
251*c8dee2aaSAndroid Build Coastguard Worker                      SkISize dimensions,
252*c8dee2aaSAndroid Build Coastguard Worker                      UsageFlags supportedUsages,
253*c8dee2aaSAndroid Build Coastguard Worker                      const GrVkImageInfo& info,
254*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<skgpu::MutableTextureState> mutableState,
255*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<const GrVkImageView> framebufferView,
256*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<const GrVkImageView> textureView,
257*c8dee2aaSAndroid Build Coastguard Worker                      GrBackendObjectOwnership ownership,
258*c8dee2aaSAndroid Build Coastguard Worker                      GrWrapCacheable cacheable,
259*c8dee2aaSAndroid Build Coastguard Worker                      bool forSecondaryCB,
260*c8dee2aaSAndroid Build Coastguard Worker                      std::string_view label)
261*c8dee2aaSAndroid Build Coastguard Worker         : GrAttachment(gpu,
262*c8dee2aaSAndroid Build Coastguard Worker                        dimensions,
263*c8dee2aaSAndroid Build Coastguard Worker                        supportedUsages,
264*c8dee2aaSAndroid Build Coastguard Worker                        info.fSampleCount,
265*c8dee2aaSAndroid Build Coastguard Worker                        info.fLevelCount > 1 ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo,
266*c8dee2aaSAndroid Build Coastguard Worker                        info.fProtected,
267*c8dee2aaSAndroid Build Coastguard Worker                        label)
268*c8dee2aaSAndroid Build Coastguard Worker         , fInfo(info)
269*c8dee2aaSAndroid Build Coastguard Worker         , fInitialQueueFamily(info.fCurrentQueueFamily)
270*c8dee2aaSAndroid Build Coastguard Worker         , fMutableState(std::move(mutableState))
271*c8dee2aaSAndroid Build Coastguard Worker         , fFramebufferView(std::move(framebufferView))
272*c8dee2aaSAndroid Build Coastguard Worker         , fTextureView(std::move(textureView))
273*c8dee2aaSAndroid Build Coastguard Worker         , fIsBorrowed(GrBackendObjectOwnership::kBorrowed == ownership) {
274*c8dee2aaSAndroid Build Coastguard Worker     this->init(gpu, forSecondaryCB);
275*c8dee2aaSAndroid Build Coastguard Worker     this->registerWithCacheWrapped(cacheable);
276*c8dee2aaSAndroid Build Coastguard Worker }
277*c8dee2aaSAndroid Build Coastguard Worker 
init(GrVkGpu * gpu,bool forSecondaryCB)278*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::init(GrVkGpu* gpu, bool forSecondaryCB) {
279*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(skgpu::MutableTextureStates::GetVkImageLayout(fMutableState.get()) == fInfo.fImageLayout);
280*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(skgpu::MutableTextureStates::GetVkQueueFamilyIndex(fMutableState.get()) == fInfo.fCurrentQueueFamily);
281*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
282*c8dee2aaSAndroid Build Coastguard Worker     if (fInfo.fImageUsageFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
283*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT));
284*c8dee2aaSAndroid Build Coastguard Worker     } else {
285*c8dee2aaSAndroid Build Coastguard Worker         if (fInfo.fAlloc.fFlags & skgpu::VulkanAlloc::kLazilyAllocated_Flag) {
286*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT);
287*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(!SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) &&
288*c8dee2aaSAndroid Build Coastguard Worker                      !SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT));
289*c8dee2aaSAndroid Build Coastguard Worker         } else {
290*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(!SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT));
291*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) &&
292*c8dee2aaSAndroid Build Coastguard Worker                      SkToBool(fInfo.fImageUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT));
293*c8dee2aaSAndroid Build Coastguard Worker         }
294*c8dee2aaSAndroid Build Coastguard Worker     }
295*c8dee2aaSAndroid Build Coastguard Worker     // We can't transfer from the non graphics queue to the graphics queue since we can't
296*c8dee2aaSAndroid Build Coastguard Worker     // release the image from the original queue without having that queue. This limits us in terms
297*c8dee2aaSAndroid Build Coastguard Worker     // of the types of queue indices we can handle.
298*c8dee2aaSAndroid Build Coastguard Worker     if (fInfo.fCurrentQueueFamily != VK_QUEUE_FAMILY_IGNORED &&
299*c8dee2aaSAndroid Build Coastguard Worker         fInfo.fCurrentQueueFamily != VK_QUEUE_FAMILY_EXTERNAL &&
300*c8dee2aaSAndroid Build Coastguard Worker         fInfo.fCurrentQueueFamily != VK_QUEUE_FAMILY_FOREIGN_EXT) {
301*c8dee2aaSAndroid Build Coastguard Worker         if (fInfo.fSharingMode == VK_SHARING_MODE_EXCLUSIVE) {
302*c8dee2aaSAndroid Build Coastguard Worker             if (fInfo.fCurrentQueueFamily != gpu->queueIndex()) {
303*c8dee2aaSAndroid Build Coastguard Worker                 SkASSERT(false);
304*c8dee2aaSAndroid Build Coastguard Worker             }
305*c8dee2aaSAndroid Build Coastguard Worker         } else {
306*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(false);
307*c8dee2aaSAndroid Build Coastguard Worker         }
308*c8dee2aaSAndroid Build Coastguard Worker     }
309*c8dee2aaSAndroid Build Coastguard Worker #endif
310*c8dee2aaSAndroid Build Coastguard Worker     if (forSecondaryCB) {
311*c8dee2aaSAndroid Build Coastguard Worker         fResource = nullptr;
312*c8dee2aaSAndroid Build Coastguard Worker     } else if (fIsBorrowed) {
313*c8dee2aaSAndroid Build Coastguard Worker         fResource = new BorrowedResource(gpu, fInfo.fImage, fInfo.fAlloc, fInfo.fImageTiling);
314*c8dee2aaSAndroid Build Coastguard Worker     } else {
315*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(VK_NULL_HANDLE != fInfo.fAlloc.fMemory);
316*c8dee2aaSAndroid Build Coastguard Worker         fResource = new Resource(gpu, fInfo.fImage, fInfo.fAlloc, fInfo.fImageTiling);
317*c8dee2aaSAndroid Build Coastguard Worker     }
318*c8dee2aaSAndroid Build Coastguard Worker }
319*c8dee2aaSAndroid Build Coastguard Worker 
LayoutToPipelineSrcStageFlags(const VkImageLayout layout)320*c8dee2aaSAndroid Build Coastguard Worker VkPipelineStageFlags GrVkImage::LayoutToPipelineSrcStageFlags(const VkImageLayout layout) {
321*c8dee2aaSAndroid Build Coastguard Worker     if (VK_IMAGE_LAYOUT_GENERAL == layout) {
322*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
323*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL == layout ||
324*c8dee2aaSAndroid Build Coastguard Worker                VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL == layout) {
325*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_TRANSFER_BIT;
326*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL == layout) {
327*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
328*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL == layout ||
329*c8dee2aaSAndroid Build Coastguard Worker                VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL == layout) {
330*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
331*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL == layout) {
332*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
333*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_PREINITIALIZED == layout) {
334*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_HOST_BIT;
335*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_PRESENT_SRC_KHR == layout) {
336*c8dee2aaSAndroid Build Coastguard Worker         return VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
337*c8dee2aaSAndroid Build Coastguard Worker     }
338*c8dee2aaSAndroid Build Coastguard Worker 
339*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(VK_IMAGE_LAYOUT_UNDEFINED == layout);
340*c8dee2aaSAndroid Build Coastguard Worker     return VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
341*c8dee2aaSAndroid Build Coastguard Worker }
342*c8dee2aaSAndroid Build Coastguard Worker 
LayoutToSrcAccessMask(const VkImageLayout layout)343*c8dee2aaSAndroid Build Coastguard Worker VkAccessFlags GrVkImage::LayoutToSrcAccessMask(const VkImageLayout layout) {
344*c8dee2aaSAndroid Build Coastguard Worker     // Currently we assume we will never being doing any explict shader writes (this doesn't include
345*c8dee2aaSAndroid Build Coastguard Worker     // color attachment or depth/stencil writes). So we will ignore the
346*c8dee2aaSAndroid Build Coastguard Worker     // VK_MEMORY_OUTPUT_SHADER_WRITE_BIT.
347*c8dee2aaSAndroid Build Coastguard Worker 
348*c8dee2aaSAndroid Build Coastguard Worker     // We can only directly access the host memory if we are in preinitialized or general layout,
349*c8dee2aaSAndroid Build Coastguard Worker     // and the image is linear.
350*c8dee2aaSAndroid Build Coastguard Worker     // TODO: Add check for linear here so we are not always adding host to general, and we should
351*c8dee2aaSAndroid Build Coastguard Worker     //       only be in preinitialized if we are linear
352*c8dee2aaSAndroid Build Coastguard Worker     VkAccessFlags flags = 0;
353*c8dee2aaSAndroid Build Coastguard Worker     if (VK_IMAGE_LAYOUT_GENERAL == layout) {
354*c8dee2aaSAndroid Build Coastguard Worker         flags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
355*c8dee2aaSAndroid Build Coastguard Worker                 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
356*c8dee2aaSAndroid Build Coastguard Worker                 VK_ACCESS_TRANSFER_WRITE_BIT |
357*c8dee2aaSAndroid Build Coastguard Worker                 VK_ACCESS_HOST_WRITE_BIT;
358*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_PREINITIALIZED == layout) {
359*c8dee2aaSAndroid Build Coastguard Worker         flags = VK_ACCESS_HOST_WRITE_BIT;
360*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL == layout) {
361*c8dee2aaSAndroid Build Coastguard Worker         flags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
362*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL == layout) {
363*c8dee2aaSAndroid Build Coastguard Worker         flags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
364*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL == layout) {
365*c8dee2aaSAndroid Build Coastguard Worker         flags = VK_ACCESS_TRANSFER_WRITE_BIT;
366*c8dee2aaSAndroid Build Coastguard Worker     } else if (VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL == layout ||
367*c8dee2aaSAndroid Build Coastguard Worker                VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL == layout ||
368*c8dee2aaSAndroid Build Coastguard Worker                VK_IMAGE_LAYOUT_PRESENT_SRC_KHR == layout) {
369*c8dee2aaSAndroid Build Coastguard Worker         // There are no writes that need to be made available
370*c8dee2aaSAndroid Build Coastguard Worker         flags = 0;
371*c8dee2aaSAndroid Build Coastguard Worker     }
372*c8dee2aaSAndroid Build Coastguard Worker     return flags;
373*c8dee2aaSAndroid Build Coastguard Worker }
374*c8dee2aaSAndroid Build Coastguard Worker 
vk_format_to_aspect_flags(VkFormat format)375*c8dee2aaSAndroid Build Coastguard Worker VkImageAspectFlags vk_format_to_aspect_flags(VkFormat format) {
376*c8dee2aaSAndroid Build Coastguard Worker     switch (format) {
377*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_S8_UINT:
378*c8dee2aaSAndroid Build Coastguard Worker             return VK_IMAGE_ASPECT_STENCIL_BIT;
379*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D24_UNORM_S8_UINT: // fallthrough
380*c8dee2aaSAndroid Build Coastguard Worker         case VK_FORMAT_D32_SFLOAT_S8_UINT:
381*c8dee2aaSAndroid Build Coastguard Worker             return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
382*c8dee2aaSAndroid Build Coastguard Worker         default:
383*c8dee2aaSAndroid Build Coastguard Worker             return VK_IMAGE_ASPECT_COLOR_BIT;
384*c8dee2aaSAndroid Build Coastguard Worker     }
385*c8dee2aaSAndroid Build Coastguard Worker }
386*c8dee2aaSAndroid Build Coastguard Worker 
setImageLayoutAndQueueIndex(const GrVkGpu * gpu,VkImageLayout newLayout,VkAccessFlags dstAccessMask,VkPipelineStageFlags dstStageMask,bool byRegion,uint32_t newQueueFamilyIndex)387*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::setImageLayoutAndQueueIndex(const GrVkGpu* gpu,
388*c8dee2aaSAndroid Build Coastguard Worker                                             VkImageLayout newLayout,
389*c8dee2aaSAndroid Build Coastguard Worker                                             VkAccessFlags dstAccessMask,
390*c8dee2aaSAndroid Build Coastguard Worker                                             VkPipelineStageFlags dstStageMask,
391*c8dee2aaSAndroid Build Coastguard Worker                                             bool byRegion,
392*c8dee2aaSAndroid Build Coastguard Worker                                             uint32_t newQueueFamilyIndex) {
393*c8dee2aaSAndroid Build Coastguard Worker // Enable the following block to test new devices to confirm their lazy images stay at 0 memory use.
394*c8dee2aaSAndroid Build Coastguard Worker #if 0
395*c8dee2aaSAndroid Build Coastguard Worker     if (fInfo.fAlloc.fFlags & skgpu::VulkanAlloc::kLazilyAllocated_Flag) {
396*c8dee2aaSAndroid Build Coastguard Worker         VkDeviceSize size;
397*c8dee2aaSAndroid Build Coastguard Worker         VK_CALL(gpu, GetDeviceMemoryCommitment(gpu->device(), fInfo.fAlloc.fMemory, &size));
398*c8dee2aaSAndroid Build Coastguard Worker 
399*c8dee2aaSAndroid Build Coastguard Worker         SkDebugf("Lazy Image. This: %p, image: %d, size: %d\n", this, fInfo.fImage, size);
400*c8dee2aaSAndroid Build Coastguard Worker     }
401*c8dee2aaSAndroid Build Coastguard Worker #endif
402*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!gpu->isDeviceLost());
403*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(newLayout == this->currentLayout() ||
404*c8dee2aaSAndroid Build Coastguard Worker              (VK_IMAGE_LAYOUT_UNDEFINED != newLayout &&
405*c8dee2aaSAndroid Build Coastguard Worker               VK_IMAGE_LAYOUT_PREINITIALIZED != newLayout));
406*c8dee2aaSAndroid Build Coastguard Worker     VkImageLayout currentLayout = this->currentLayout();
407*c8dee2aaSAndroid Build Coastguard Worker     uint32_t currentQueueIndex = this->currentQueueFamilyIndex();
408*c8dee2aaSAndroid Build Coastguard Worker 
409*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
410*c8dee2aaSAndroid Build Coastguard Worker     if (fInfo.fSharingMode == VK_SHARING_MODE_CONCURRENT) {
411*c8dee2aaSAndroid Build Coastguard Worker         if (newQueueFamilyIndex == VK_QUEUE_FAMILY_IGNORED) {
412*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(currentQueueIndex == VK_QUEUE_FAMILY_IGNORED ||
413*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == VK_QUEUE_FAMILY_EXTERNAL ||
414*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == VK_QUEUE_FAMILY_FOREIGN_EXT);
415*c8dee2aaSAndroid Build Coastguard Worker         } else {
416*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(newQueueFamilyIndex == VK_QUEUE_FAMILY_EXTERNAL ||
417*c8dee2aaSAndroid Build Coastguard Worker                      newQueueFamilyIndex == VK_QUEUE_FAMILY_FOREIGN_EXT);
418*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(currentQueueIndex == VK_QUEUE_FAMILY_IGNORED);
419*c8dee2aaSAndroid Build Coastguard Worker         }
420*c8dee2aaSAndroid Build Coastguard Worker     } else {
421*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fInfo.fSharingMode == VK_SHARING_MODE_EXCLUSIVE);
422*c8dee2aaSAndroid Build Coastguard Worker         if (newQueueFamilyIndex == VK_QUEUE_FAMILY_IGNORED ||
423*c8dee2aaSAndroid Build Coastguard Worker             currentQueueIndex == gpu->queueIndex()) {
424*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(currentQueueIndex == VK_QUEUE_FAMILY_IGNORED ||
425*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == VK_QUEUE_FAMILY_EXTERNAL ||
426*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == VK_QUEUE_FAMILY_FOREIGN_EXT ||
427*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == gpu->queueIndex());
428*c8dee2aaSAndroid Build Coastguard Worker         } else if (newQueueFamilyIndex == VK_QUEUE_FAMILY_EXTERNAL ||
429*c8dee2aaSAndroid Build Coastguard Worker                    newQueueFamilyIndex == VK_QUEUE_FAMILY_FOREIGN_EXT) {
430*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(currentQueueIndex == VK_QUEUE_FAMILY_IGNORED ||
431*c8dee2aaSAndroid Build Coastguard Worker                      currentQueueIndex == gpu->queueIndex());
432*c8dee2aaSAndroid Build Coastguard Worker         }
433*c8dee2aaSAndroid Build Coastguard Worker     }
434*c8dee2aaSAndroid Build Coastguard Worker #endif
435*c8dee2aaSAndroid Build Coastguard Worker 
436*c8dee2aaSAndroid Build Coastguard Worker     if (fInfo.fSharingMode == VK_SHARING_MODE_EXCLUSIVE) {
437*c8dee2aaSAndroid Build Coastguard Worker         if (newQueueFamilyIndex == VK_QUEUE_FAMILY_IGNORED) {
438*c8dee2aaSAndroid Build Coastguard Worker             newQueueFamilyIndex = gpu->queueIndex();
439*c8dee2aaSAndroid Build Coastguard Worker         }
440*c8dee2aaSAndroid Build Coastguard Worker         if (currentQueueIndex == VK_QUEUE_FAMILY_IGNORED) {
441*c8dee2aaSAndroid Build Coastguard Worker             currentQueueIndex = gpu->queueIndex();
442*c8dee2aaSAndroid Build Coastguard Worker         }
443*c8dee2aaSAndroid Build Coastguard Worker     }
444*c8dee2aaSAndroid Build Coastguard Worker 
445*c8dee2aaSAndroid Build Coastguard Worker     // If the old and new layout are the same and the layout is a read only layout, there is no need
446*c8dee2aaSAndroid Build Coastguard Worker     // to put in a barrier unless we also need to switch queues.
447*c8dee2aaSAndroid Build Coastguard Worker     if (newLayout == currentLayout && currentQueueIndex == newQueueFamilyIndex &&
448*c8dee2aaSAndroid Build Coastguard Worker         (VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL == currentLayout ||
449*c8dee2aaSAndroid Build Coastguard Worker          VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL == currentLayout ||
450*c8dee2aaSAndroid Build Coastguard Worker          VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL == currentLayout)) {
451*c8dee2aaSAndroid Build Coastguard Worker         return;
452*c8dee2aaSAndroid Build Coastguard Worker     }
453*c8dee2aaSAndroid Build Coastguard Worker 
454*c8dee2aaSAndroid Build Coastguard Worker     VkAccessFlags srcAccessMask = GrVkImage::LayoutToSrcAccessMask(currentLayout);
455*c8dee2aaSAndroid Build Coastguard Worker     VkPipelineStageFlags srcStageMask = GrVkImage::LayoutToPipelineSrcStageFlags(currentLayout);
456*c8dee2aaSAndroid Build Coastguard Worker 
457*c8dee2aaSAndroid Build Coastguard Worker     VkImageAspectFlags aspectFlags = vk_format_to_aspect_flags(fInfo.fFormat);
458*c8dee2aaSAndroid Build Coastguard Worker 
459*c8dee2aaSAndroid Build Coastguard Worker     VkImageMemoryBarrier imageMemoryBarrier = {
460*c8dee2aaSAndroid Build Coastguard Worker         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,          // sType
461*c8dee2aaSAndroid Build Coastguard Worker         nullptr,                                         // pNext
462*c8dee2aaSAndroid Build Coastguard Worker         srcAccessMask,                                   // srcAccessMask
463*c8dee2aaSAndroid Build Coastguard Worker         dstAccessMask,                                   // dstAccessMask
464*c8dee2aaSAndroid Build Coastguard Worker         currentLayout,                                   // oldLayout
465*c8dee2aaSAndroid Build Coastguard Worker         newLayout,                                       // newLayout
466*c8dee2aaSAndroid Build Coastguard Worker         currentQueueIndex,                               // srcQueueFamilyIndex
467*c8dee2aaSAndroid Build Coastguard Worker         newQueueFamilyIndex,                             // dstQueueFamilyIndex
468*c8dee2aaSAndroid Build Coastguard Worker         fInfo.fImage,                                    // image
469*c8dee2aaSAndroid Build Coastguard Worker         { aspectFlags, 0, fInfo.fLevelCount, 0, 1 }      // subresourceRange
470*c8dee2aaSAndroid Build Coastguard Worker     };
471*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(srcAccessMask == imageMemoryBarrier.srcAccessMask);
472*c8dee2aaSAndroid Build Coastguard Worker     gpu->addImageMemoryBarrier(this->resource(), srcStageMask, dstStageMask, byRegion,
473*c8dee2aaSAndroid Build Coastguard Worker                                &imageMemoryBarrier);
474*c8dee2aaSAndroid Build Coastguard Worker 
475*c8dee2aaSAndroid Build Coastguard Worker     this->updateImageLayout(newLayout);
476*c8dee2aaSAndroid Build Coastguard Worker     this->setQueueFamilyIndex(newQueueFamilyIndex);
477*c8dee2aaSAndroid Build Coastguard Worker }
478*c8dee2aaSAndroid Build Coastguard Worker 
InitImageInfo(GrVkGpu * gpu,const ImageDesc & imageDesc,GrVkImageInfo * info)479*c8dee2aaSAndroid Build Coastguard Worker bool GrVkImage::InitImageInfo(GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImageInfo* info) {
480*c8dee2aaSAndroid Build Coastguard Worker     if (0 == imageDesc.fWidth || 0 == imageDesc.fHeight) {
481*c8dee2aaSAndroid Build Coastguard Worker         return false;
482*c8dee2aaSAndroid Build Coastguard Worker     }
483*c8dee2aaSAndroid Build Coastguard Worker     if ((imageDesc.fIsProtected == GrProtected::kYes) &&
484*c8dee2aaSAndroid Build Coastguard Worker         !gpu->vkCaps().supportsProtectedContent()) {
485*c8dee2aaSAndroid Build Coastguard Worker         return false;
486*c8dee2aaSAndroid Build Coastguard Worker     }
487*c8dee2aaSAndroid Build Coastguard Worker 
488*c8dee2aaSAndroid Build Coastguard Worker     bool isLinear = VK_IMAGE_TILING_LINEAR == imageDesc.fImageTiling;
489*c8dee2aaSAndroid Build Coastguard Worker     VkImageLayout initialLayout = isLinear ? VK_IMAGE_LAYOUT_PREINITIALIZED
490*c8dee2aaSAndroid Build Coastguard Worker                                            : VK_IMAGE_LAYOUT_UNDEFINED;
491*c8dee2aaSAndroid Build Coastguard Worker 
492*c8dee2aaSAndroid Build Coastguard Worker     // Create Image
493*c8dee2aaSAndroid Build Coastguard Worker     VkSampleCountFlagBits vkSamples;
494*c8dee2aaSAndroid Build Coastguard Worker     if (!skgpu::SampleCountToVkSampleCount(imageDesc.fSamples, &vkSamples)) {
495*c8dee2aaSAndroid Build Coastguard Worker         return false;
496*c8dee2aaSAndroid Build Coastguard Worker     }
497*c8dee2aaSAndroid Build Coastguard Worker 
498*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(VK_IMAGE_TILING_OPTIMAL == imageDesc.fImageTiling ||
499*c8dee2aaSAndroid Build Coastguard Worker              VK_SAMPLE_COUNT_1_BIT == vkSamples);
500*c8dee2aaSAndroid Build Coastguard Worker 
501*c8dee2aaSAndroid Build Coastguard Worker     VkImageCreateFlags createflags = 0;
502*c8dee2aaSAndroid Build Coastguard Worker     if (imageDesc.fIsProtected == GrProtected::kYes || gpu->protectedContext()) {
503*c8dee2aaSAndroid Build Coastguard Worker         createflags |= VK_IMAGE_CREATE_PROTECTED_BIT;
504*c8dee2aaSAndroid Build Coastguard Worker     }
505*c8dee2aaSAndroid Build Coastguard Worker     const VkImageCreateInfo imageCreateInfo = {
506*c8dee2aaSAndroid Build Coastguard Worker         VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,         // sType
507*c8dee2aaSAndroid Build Coastguard Worker         nullptr,                                     // pNext
508*c8dee2aaSAndroid Build Coastguard Worker         createflags,                                 // VkImageCreateFlags
509*c8dee2aaSAndroid Build Coastguard Worker         imageDesc.fImageType,                        // VkImageType
510*c8dee2aaSAndroid Build Coastguard Worker         imageDesc.fFormat,                           // VkFormat
511*c8dee2aaSAndroid Build Coastguard Worker         { imageDesc.fWidth, imageDesc.fHeight, 1 },  // VkExtent3D
512*c8dee2aaSAndroid Build Coastguard Worker         imageDesc.fLevels,                           // mipLevels
513*c8dee2aaSAndroid Build Coastguard Worker         1,                                           // arrayLayers
514*c8dee2aaSAndroid Build Coastguard Worker         vkSamples,                                   // samples
515*c8dee2aaSAndroid Build Coastguard Worker         imageDesc.fImageTiling,                      // VkImageTiling
516*c8dee2aaSAndroid Build Coastguard Worker         imageDesc.fUsageFlags,                       // VkImageUsageFlags
517*c8dee2aaSAndroid Build Coastguard Worker         VK_SHARING_MODE_EXCLUSIVE,                   // VkSharingMode
518*c8dee2aaSAndroid Build Coastguard Worker         0,                                           // queueFamilyCount
519*c8dee2aaSAndroid Build Coastguard Worker         nullptr,                                     // pQueueFamilyIndices
520*c8dee2aaSAndroid Build Coastguard Worker         initialLayout                                // initialLayout
521*c8dee2aaSAndroid Build Coastguard Worker     };
522*c8dee2aaSAndroid Build Coastguard Worker 
523*c8dee2aaSAndroid Build Coastguard Worker     VkImage image = VK_NULL_HANDLE;
524*c8dee2aaSAndroid Build Coastguard Worker     VkResult result;
525*c8dee2aaSAndroid Build Coastguard Worker     GR_VK_CALL_RESULT(gpu, result, CreateImage(gpu->device(), &imageCreateInfo, nullptr, &image));
526*c8dee2aaSAndroid Build Coastguard Worker     if (result != VK_SUCCESS) {
527*c8dee2aaSAndroid Build Coastguard Worker         return false;
528*c8dee2aaSAndroid Build Coastguard Worker     }
529*c8dee2aaSAndroid Build Coastguard Worker 
530*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Protected isProtected = gpu->protectedContext() ? skgpu::Protected::kYes
531*c8dee2aaSAndroid Build Coastguard Worker                                                            : skgpu::Protected::kNo;
532*c8dee2aaSAndroid Build Coastguard Worker     bool forceDedicatedMemory = gpu->vkCaps().shouldAlwaysUseDedicatedImageMemory();
533*c8dee2aaSAndroid Build Coastguard Worker     bool useLazyAllocation =
534*c8dee2aaSAndroid Build Coastguard Worker             SkToBool(imageDesc.fUsageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT);
535*c8dee2aaSAndroid Build Coastguard Worker 
536*c8dee2aaSAndroid Build Coastguard Worker     auto checkResult = [gpu, isProtected, forceDedicatedMemory, useLazyAllocation](
537*c8dee2aaSAndroid Build Coastguard Worker                                VkResult result) {
538*c8dee2aaSAndroid Build Coastguard Worker         GR_VK_LOG_IF_NOT_SUCCESS(gpu, result, "skgpu::VulkanMemory::AllocImageMemory"
539*c8dee2aaSAndroid Build Coastguard Worker                                  " (isProtected:%d, forceDedicatedMemory:%d, useLazyAllocation:%d)",
540*c8dee2aaSAndroid Build Coastguard Worker                                  (int)isProtected, (int)forceDedicatedMemory,
541*c8dee2aaSAndroid Build Coastguard Worker                                  (int)useLazyAllocation);
542*c8dee2aaSAndroid Build Coastguard Worker         return gpu->checkVkResult(result);
543*c8dee2aaSAndroid Build Coastguard Worker     };
544*c8dee2aaSAndroid Build Coastguard Worker     auto allocator = gpu->memoryAllocator();
545*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanAlloc alloc;
546*c8dee2aaSAndroid Build Coastguard Worker     if (!skgpu::VulkanMemory::AllocImageMemory(allocator,
547*c8dee2aaSAndroid Build Coastguard Worker                                                image,
548*c8dee2aaSAndroid Build Coastguard Worker                                                isProtected,
549*c8dee2aaSAndroid Build Coastguard Worker                                                forceDedicatedMemory,
550*c8dee2aaSAndroid Build Coastguard Worker                                                useLazyAllocation,
551*c8dee2aaSAndroid Build Coastguard Worker                                                checkResult,
552*c8dee2aaSAndroid Build Coastguard Worker                                                &alloc) ||
553*c8dee2aaSAndroid Build Coastguard Worker         (useLazyAllocation &&
554*c8dee2aaSAndroid Build Coastguard Worker          !SkToBool(alloc.fFlags & skgpu::VulkanAlloc::kLazilyAllocated_Flag))) {
555*c8dee2aaSAndroid Build Coastguard Worker         VK_CALL(gpu, DestroyImage(gpu->device(), image, nullptr));
556*c8dee2aaSAndroid Build Coastguard Worker         return false;
557*c8dee2aaSAndroid Build Coastguard Worker     }
558*c8dee2aaSAndroid Build Coastguard Worker 
559*c8dee2aaSAndroid Build Coastguard Worker     // Bind buffer
560*c8dee2aaSAndroid Build Coastguard Worker     GR_VK_CALL_RESULT(gpu, result, BindImageMemory(gpu->device(),
561*c8dee2aaSAndroid Build Coastguard Worker                                                    image,
562*c8dee2aaSAndroid Build Coastguard Worker                                                    alloc.fMemory,
563*c8dee2aaSAndroid Build Coastguard Worker                                                    alloc.fOffset));
564*c8dee2aaSAndroid Build Coastguard Worker     if (result) {
565*c8dee2aaSAndroid Build Coastguard Worker         skgpu::VulkanMemory::FreeImageMemory(allocator, alloc);
566*c8dee2aaSAndroid Build Coastguard Worker         VK_CALL(gpu, DestroyImage(gpu->device(), image, nullptr));
567*c8dee2aaSAndroid Build Coastguard Worker         return false;
568*c8dee2aaSAndroid Build Coastguard Worker     }
569*c8dee2aaSAndroid Build Coastguard Worker 
570*c8dee2aaSAndroid Build Coastguard Worker     info->fImage = image;
571*c8dee2aaSAndroid Build Coastguard Worker     info->fAlloc = alloc;
572*c8dee2aaSAndroid Build Coastguard Worker     info->fImageTiling = imageDesc.fImageTiling;
573*c8dee2aaSAndroid Build Coastguard Worker     info->fImageLayout = initialLayout;
574*c8dee2aaSAndroid Build Coastguard Worker     info->fFormat = imageDesc.fFormat;
575*c8dee2aaSAndroid Build Coastguard Worker     info->fImageUsageFlags = imageDesc.fUsageFlags;
576*c8dee2aaSAndroid Build Coastguard Worker     info->fSampleCount = imageDesc.fSamples;
577*c8dee2aaSAndroid Build Coastguard Worker     info->fLevelCount = imageDesc.fLevels;
578*c8dee2aaSAndroid Build Coastguard Worker     info->fCurrentQueueFamily = VK_QUEUE_FAMILY_IGNORED;
579*c8dee2aaSAndroid Build Coastguard Worker     info->fProtected =
580*c8dee2aaSAndroid Build Coastguard Worker             (createflags & VK_IMAGE_CREATE_PROTECTED_BIT) ? GrProtected::kYes : GrProtected::kNo;
581*c8dee2aaSAndroid Build Coastguard Worker     info->fSharingMode = VK_SHARING_MODE_EXCLUSIVE;
582*c8dee2aaSAndroid Build Coastguard Worker     return true;
583*c8dee2aaSAndroid Build Coastguard Worker }
584*c8dee2aaSAndroid Build Coastguard Worker 
DestroyImageInfo(const GrVkGpu * gpu,GrVkImageInfo * info)585*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::DestroyImageInfo(const GrVkGpu* gpu, GrVkImageInfo* info) {
586*c8dee2aaSAndroid Build Coastguard Worker     VK_CALL(gpu, DestroyImage(gpu->device(), info->fImage, nullptr));
587*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanMemory::FreeImageMemory(gpu->memoryAllocator(), info->fAlloc);
588*c8dee2aaSAndroid Build Coastguard Worker }
589*c8dee2aaSAndroid Build Coastguard Worker 
~GrVkImage()590*c8dee2aaSAndroid Build Coastguard Worker GrVkImage::~GrVkImage() {
591*c8dee2aaSAndroid Build Coastguard Worker     // should have been released first
592*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fResource);
593*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fFramebufferView);
594*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!fTextureView);
595*c8dee2aaSAndroid Build Coastguard Worker }
596*c8dee2aaSAndroid Build Coastguard Worker 
prepareForPresent(GrVkGpu * gpu)597*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::prepareForPresent(GrVkGpu* gpu) {
598*c8dee2aaSAndroid Build Coastguard Worker     VkImageLayout layout = this->currentLayout();
599*c8dee2aaSAndroid Build Coastguard Worker     if (fInitialQueueFamily != VK_QUEUE_FAMILY_EXTERNAL &&
600*c8dee2aaSAndroid Build Coastguard Worker         fInitialQueueFamily != VK_QUEUE_FAMILY_FOREIGN_EXT) {
601*c8dee2aaSAndroid Build Coastguard Worker         if (gpu->vkCaps().supportsSwapchain()) {
602*c8dee2aaSAndroid Build Coastguard Worker             layout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
603*c8dee2aaSAndroid Build Coastguard Worker         }
604*c8dee2aaSAndroid Build Coastguard Worker     }
605*c8dee2aaSAndroid Build Coastguard Worker     this->setImageLayoutAndQueueIndex(gpu, layout, 0, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, false,
606*c8dee2aaSAndroid Build Coastguard Worker                                       fInitialQueueFamily);
607*c8dee2aaSAndroid Build Coastguard Worker }
608*c8dee2aaSAndroid Build Coastguard Worker 
prepareForExternal(GrVkGpu * gpu)609*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::prepareForExternal(GrVkGpu* gpu) {
610*c8dee2aaSAndroid Build Coastguard Worker     this->setImageLayoutAndQueueIndex(gpu, this->currentLayout(), 0,
611*c8dee2aaSAndroid Build Coastguard Worker                                       VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, false,
612*c8dee2aaSAndroid Build Coastguard Worker                                      fInitialQueueFamily);
613*c8dee2aaSAndroid Build Coastguard Worker }
614*c8dee2aaSAndroid Build Coastguard Worker 
releaseImage()615*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::releaseImage() {
616*c8dee2aaSAndroid Build Coastguard Worker     if (fResource) {
617*c8dee2aaSAndroid Build Coastguard Worker         fResource->unref();
618*c8dee2aaSAndroid Build Coastguard Worker         fResource = nullptr;
619*c8dee2aaSAndroid Build Coastguard Worker     }
620*c8dee2aaSAndroid Build Coastguard Worker     fFramebufferView.reset();
621*c8dee2aaSAndroid Build Coastguard Worker     fTextureView.reset();
622*c8dee2aaSAndroid Build Coastguard Worker     fCachedBlendingInputDescSet.reset();
623*c8dee2aaSAndroid Build Coastguard Worker     fCachedMSAALoadInputDescSet.reset();
624*c8dee2aaSAndroid Build Coastguard Worker }
625*c8dee2aaSAndroid Build Coastguard Worker 
onRelease()626*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::onRelease() {
627*c8dee2aaSAndroid Build Coastguard Worker     this->releaseImage();
628*c8dee2aaSAndroid Build Coastguard Worker     GrAttachment::onRelease();
629*c8dee2aaSAndroid Build Coastguard Worker }
630*c8dee2aaSAndroid Build Coastguard Worker 
onAbandon()631*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::onAbandon() {
632*c8dee2aaSAndroid Build Coastguard Worker     this->releaseImage();
633*c8dee2aaSAndroid Build Coastguard Worker     GrAttachment::onAbandon();
634*c8dee2aaSAndroid Build Coastguard Worker }
635*c8dee2aaSAndroid Build Coastguard Worker 
setResourceRelease(sk_sp<RefCntedReleaseProc> releaseHelper)636*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::setResourceRelease(sk_sp<RefCntedReleaseProc> releaseHelper) {
637*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fResource);
638*c8dee2aaSAndroid Build Coastguard Worker     // Forward the release proc on to GrVkImage::Resource
639*c8dee2aaSAndroid Build Coastguard Worker     fResource->setRelease(std::move(releaseHelper));
640*c8dee2aaSAndroid Build Coastguard Worker }
641*c8dee2aaSAndroid Build Coastguard Worker 
freeGPUData() const642*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::Resource::freeGPUData() const {
643*c8dee2aaSAndroid Build Coastguard Worker     this->invokeReleaseProc();
644*c8dee2aaSAndroid Build Coastguard Worker     VK_CALL(fGpu, DestroyImage(fGpu->device(), fImage, nullptr));
645*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanMemory::FreeImageMemory(fGpu->memoryAllocator(), fAlloc);
646*c8dee2aaSAndroid Build Coastguard Worker }
647*c8dee2aaSAndroid Build Coastguard Worker 
freeGPUData() const648*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::BorrowedResource::freeGPUData() const {
649*c8dee2aaSAndroid Build Coastguard Worker     this->invokeReleaseProc();
650*c8dee2aaSAndroid Build Coastguard Worker }
651*c8dee2aaSAndroid Build Coastguard Worker 
write_input_desc_set(GrVkGpu * gpu,VkImageView view,VkImageLayout layout,VkDescriptorSet descSet)652*c8dee2aaSAndroid Build Coastguard Worker static void write_input_desc_set(GrVkGpu* gpu,
653*c8dee2aaSAndroid Build Coastguard Worker                                  VkImageView view,
654*c8dee2aaSAndroid Build Coastguard Worker                                  VkImageLayout layout,
655*c8dee2aaSAndroid Build Coastguard Worker                                  VkDescriptorSet descSet) {
656*c8dee2aaSAndroid Build Coastguard Worker     VkDescriptorImageInfo imageInfo;
657*c8dee2aaSAndroid Build Coastguard Worker     memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
658*c8dee2aaSAndroid Build Coastguard Worker     imageInfo.sampler = VK_NULL_HANDLE;
659*c8dee2aaSAndroid Build Coastguard Worker     imageInfo.imageView = view;
660*c8dee2aaSAndroid Build Coastguard Worker     imageInfo.imageLayout = layout;
661*c8dee2aaSAndroid Build Coastguard Worker 
662*c8dee2aaSAndroid Build Coastguard Worker     VkWriteDescriptorSet writeInfo;
663*c8dee2aaSAndroid Build Coastguard Worker     memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
664*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
665*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.pNext = nullptr;
666*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.dstSet = descSet;
667*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.dstBinding = GrVkUniformHandler::kInputBinding;
668*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.dstArrayElement = 0;
669*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.descriptorCount = 1;
670*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
671*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.pImageInfo = &imageInfo;
672*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.pBufferInfo = nullptr;
673*c8dee2aaSAndroid Build Coastguard Worker     writeInfo.pTexelBufferView = nullptr;
674*c8dee2aaSAndroid Build Coastguard Worker 
675*c8dee2aaSAndroid Build Coastguard Worker     GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(), 1, &writeInfo, 0, nullptr));
676*c8dee2aaSAndroid Build Coastguard Worker }
677*c8dee2aaSAndroid Build Coastguard Worker 
inputDescSetForBlending(GrVkGpu * gpu)678*c8dee2aaSAndroid Build Coastguard Worker gr_rp<const GrVkDescriptorSet> GrVkImage::inputDescSetForBlending(GrVkGpu* gpu) {
679*c8dee2aaSAndroid Build Coastguard Worker     if (!this->supportsInputAttachmentUsage()) {
680*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
681*c8dee2aaSAndroid Build Coastguard Worker     }
682*c8dee2aaSAndroid Build Coastguard Worker     if (fCachedBlendingInputDescSet) {
683*c8dee2aaSAndroid Build Coastguard Worker         return fCachedBlendingInputDescSet;
684*c8dee2aaSAndroid Build Coastguard Worker     }
685*c8dee2aaSAndroid Build Coastguard Worker 
686*c8dee2aaSAndroid Build Coastguard Worker     fCachedBlendingInputDescSet.reset(gpu->resourceProvider().getInputDescriptorSet());
687*c8dee2aaSAndroid Build Coastguard Worker     if (!fCachedBlendingInputDescSet) {
688*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
689*c8dee2aaSAndroid Build Coastguard Worker     }
690*c8dee2aaSAndroid Build Coastguard Worker 
691*c8dee2aaSAndroid Build Coastguard Worker     write_input_desc_set(gpu,
692*c8dee2aaSAndroid Build Coastguard Worker                          this->framebufferView()->imageView(),
693*c8dee2aaSAndroid Build Coastguard Worker                          VK_IMAGE_LAYOUT_GENERAL,
694*c8dee2aaSAndroid Build Coastguard Worker                          *fCachedBlendingInputDescSet->descriptorSet());
695*c8dee2aaSAndroid Build Coastguard Worker 
696*c8dee2aaSAndroid Build Coastguard Worker     return fCachedBlendingInputDescSet;
697*c8dee2aaSAndroid Build Coastguard Worker }
698*c8dee2aaSAndroid Build Coastguard Worker 
inputDescSetForMSAALoad(GrVkGpu * gpu)699*c8dee2aaSAndroid Build Coastguard Worker gr_rp<const GrVkDescriptorSet> GrVkImage::inputDescSetForMSAALoad(GrVkGpu* gpu) {
700*c8dee2aaSAndroid Build Coastguard Worker     if (!this->supportsInputAttachmentUsage()) {
701*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
702*c8dee2aaSAndroid Build Coastguard Worker     }
703*c8dee2aaSAndroid Build Coastguard Worker     if (fCachedMSAALoadInputDescSet) {
704*c8dee2aaSAndroid Build Coastguard Worker         return fCachedMSAALoadInputDescSet;
705*c8dee2aaSAndroid Build Coastguard Worker     }
706*c8dee2aaSAndroid Build Coastguard Worker 
707*c8dee2aaSAndroid Build Coastguard Worker     fCachedMSAALoadInputDescSet.reset(gpu->resourceProvider().getInputDescriptorSet());
708*c8dee2aaSAndroid Build Coastguard Worker     if (!fCachedMSAALoadInputDescSet) {
709*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
710*c8dee2aaSAndroid Build Coastguard Worker     }
711*c8dee2aaSAndroid Build Coastguard Worker 
712*c8dee2aaSAndroid Build Coastguard Worker     write_input_desc_set(gpu,
713*c8dee2aaSAndroid Build Coastguard Worker                          this->framebufferView()->imageView(),
714*c8dee2aaSAndroid Build Coastguard Worker                          VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
715*c8dee2aaSAndroid Build Coastguard Worker                          *fCachedMSAALoadInputDescSet->descriptorSet());
716*c8dee2aaSAndroid Build Coastguard Worker 
717*c8dee2aaSAndroid Build Coastguard Worker     return fCachedMSAALoadInputDescSet;
718*c8dee2aaSAndroid Build Coastguard Worker }
719*c8dee2aaSAndroid Build Coastguard Worker 
getVkGpu() const720*c8dee2aaSAndroid Build Coastguard Worker GrVkGpu* GrVkImage::getVkGpu() const {
721*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!this->wasDestroyed());
722*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<GrVkGpu*>(this->getGpu());
723*c8dee2aaSAndroid Build Coastguard Worker }
724*c8dee2aaSAndroid Build Coastguard Worker 
725*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
setCurrentQueueFamilyToGraphicsQueue(GrVkGpu * gpu)726*c8dee2aaSAndroid Build Coastguard Worker void GrVkImage::setCurrentQueueFamilyToGraphicsQueue(GrVkGpu* gpu) {
727*c8dee2aaSAndroid Build Coastguard Worker     skgpu::MutableTextureStates::SetVkQueueFamilyIndex(fMutableState.get(), gpu->queueIndex());
728*c8dee2aaSAndroid Build Coastguard Worker }
729*c8dee2aaSAndroid Build Coastguard Worker #endif
730