xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkImage.h (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 #ifndef GrVkImage_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrVkImage_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/MutableTextureState.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/vk/GrVkBackendSurface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/vk/GrVkTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanMutableTextureState.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/GpuRefCnt.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAttachment.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrManagedResource.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkDescriptorSet.h"  // IWYU pragma: keep
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanMutableTextureStatePriv.h"
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker #include <cinttypes>
32*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
33*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker class GrVkGpu;
36*c8dee2aaSAndroid Build Coastguard Worker class GrVkImageView;
37*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker class GrVkImage : public GrAttachment {
40*c8dee2aaSAndroid Build Coastguard Worker private:
41*c8dee2aaSAndroid Build Coastguard Worker     class Resource;
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker public:
44*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrVkImage> MakeStencil(GrVkGpu* gpu,
45*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
46*c8dee2aaSAndroid Build Coastguard Worker                                         int sampleCnt,
47*c8dee2aaSAndroid Build Coastguard Worker                                         VkFormat format);
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrVkImage> MakeMSAA(GrVkGpu* gpu,
50*c8dee2aaSAndroid Build Coastguard Worker                                      SkISize dimensions,
51*c8dee2aaSAndroid Build Coastguard Worker                                      int numSamples,
52*c8dee2aaSAndroid Build Coastguard Worker                                      VkFormat format,
53*c8dee2aaSAndroid Build Coastguard Worker                                      GrProtected isProtected,
54*c8dee2aaSAndroid Build Coastguard Worker                                      GrMemoryless memoryless);
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrVkImage> MakeTexture(GrVkGpu* gpu,
57*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
58*c8dee2aaSAndroid Build Coastguard Worker                                         VkFormat format,
59*c8dee2aaSAndroid Build Coastguard Worker                                         uint32_t mipLevels,
60*c8dee2aaSAndroid Build Coastguard Worker                                         GrRenderable renderable,
61*c8dee2aaSAndroid Build Coastguard Worker                                         int numSamples,
62*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Budgeted budgeted,
63*c8dee2aaSAndroid Build Coastguard Worker                                         GrProtected isProtected);
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrVkImage> MakeWrapped(GrVkGpu* gpu,
66*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
67*c8dee2aaSAndroid Build Coastguard Worker                                         const GrVkImageInfo&,
68*c8dee2aaSAndroid Build Coastguard Worker                                         sk_sp<skgpu::MutableTextureState>,
69*c8dee2aaSAndroid Build Coastguard Worker                                         UsageFlags attachmentUsages,
70*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapOwnership,
71*c8dee2aaSAndroid Build Coastguard Worker                                         GrWrapCacheable,
72*c8dee2aaSAndroid Build Coastguard Worker                                         std::string_view label,
73*c8dee2aaSAndroid Build Coastguard Worker                                         bool forSecondaryCB = false);
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     ~GrVkImage() override;
76*c8dee2aaSAndroid Build Coastguard Worker 
image()77*c8dee2aaSAndroid Build Coastguard Worker     VkImage image() const {
78*c8dee2aaSAndroid Build Coastguard Worker         // Should only be called when we have a real fResource object, i.e. never when being used as
79*c8dee2aaSAndroid Build Coastguard Worker         // a RT in an external secondary command buffer.
80*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
81*c8dee2aaSAndroid Build Coastguard Worker         return fInfo.fImage;
82*c8dee2aaSAndroid Build Coastguard Worker     }
alloc()83*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::VulkanAlloc& alloc() const {
84*c8dee2aaSAndroid Build Coastguard Worker         // Should only be called when we have a real fResource object, i.e. never when being used as
85*c8dee2aaSAndroid Build Coastguard Worker         // a RT in an external secondary command buffer.
86*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
87*c8dee2aaSAndroid Build Coastguard Worker         return fInfo.fAlloc;
88*c8dee2aaSAndroid Build Coastguard Worker     }
vkImageInfo()89*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImageInfo& vkImageInfo() const { return fInfo; }
imageFormat()90*c8dee2aaSAndroid Build Coastguard Worker     VkFormat imageFormat() const { return fInfo.fFormat; }
backendFormat()91*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat backendFormat() const override {
92*c8dee2aaSAndroid Build Coastguard Worker         bool usesDRMModifier =
93*c8dee2aaSAndroid Build Coastguard Worker                 this->vkImageInfo().fImageTiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
94*c8dee2aaSAndroid Build Coastguard Worker         if (fResource && this->ycbcrConversionInfo().isValid()) {
95*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(this->imageFormat() == this->ycbcrConversionInfo().fFormat);
96*c8dee2aaSAndroid Build Coastguard Worker             return GrBackendFormats::MakeVk(this->ycbcrConversionInfo(), usesDRMModifier);
97*c8dee2aaSAndroid Build Coastguard Worker         }
98*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(this->imageFormat() != VK_FORMAT_UNDEFINED);
99*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendFormats::MakeVk(this->imageFormat(), usesDRMModifier);
100*c8dee2aaSAndroid Build Coastguard Worker     }
mipLevels()101*c8dee2aaSAndroid Build Coastguard Worker     uint32_t mipLevels() const { return fInfo.fLevelCount; }
ycbcrConversionInfo()102*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::VulkanYcbcrConversionInfo& ycbcrConversionInfo() const {
103*c8dee2aaSAndroid Build Coastguard Worker         // Should only be called when we have a real fResource object, i.e. never when being used as
104*c8dee2aaSAndroid Build Coastguard Worker         // a RT in an external secondary command buffer.
105*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
106*c8dee2aaSAndroid Build Coastguard Worker         return fInfo.fYcbcrConversionInfo;
107*c8dee2aaSAndroid Build Coastguard Worker     }
vkUsageFlags()108*c8dee2aaSAndroid Build Coastguard Worker     VkImageUsageFlags vkUsageFlags() { return fInfo.fImageUsageFlags; }
supportsInputAttachmentUsage()109*c8dee2aaSAndroid Build Coastguard Worker     bool supportsInputAttachmentUsage() const {
110*c8dee2aaSAndroid Build Coastguard Worker         return fInfo.fImageUsageFlags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
111*c8dee2aaSAndroid Build Coastguard Worker     }
112*c8dee2aaSAndroid Build Coastguard Worker 
framebufferView()113*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImageView* framebufferView() const { return fFramebufferView.get(); }
textureView()114*c8dee2aaSAndroid Build Coastguard Worker     const GrVkImageView* textureView() const { return fTextureView.get(); }
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker     // So that we don't need to rewrite descriptor sets each time, we keep cached input descriptor
117*c8dee2aaSAndroid Build Coastguard Worker     // sets on the attachment and simply reuse those descriptor sets for this attachment only. These
118*c8dee2aaSAndroid Build Coastguard Worker     // calls will fail if the attachment does not support being used as an input attachment. These
119*c8dee2aaSAndroid Build Coastguard Worker     // calls do not ref the GrVkDescriptorSet so they called will need to manually ref them if they
120*c8dee2aaSAndroid Build Coastguard Worker     // need to be kept alive.
121*c8dee2aaSAndroid Build Coastguard Worker     gr_rp<const GrVkDescriptorSet> inputDescSetForBlending(GrVkGpu* gpu);
122*c8dee2aaSAndroid Build Coastguard Worker     // Input descripotr set used when needing to read a resolve attachment to load data into a
123*c8dee2aaSAndroid Build Coastguard Worker     // discardable msaa attachment.
124*c8dee2aaSAndroid Build Coastguard Worker     gr_rp<const GrVkDescriptorSet> inputDescSetForMSAALoad(GrVkGpu* gpu);
125*c8dee2aaSAndroid Build Coastguard Worker 
resource()126*c8dee2aaSAndroid Build Coastguard Worker     const Resource* resource() const {
127*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
128*c8dee2aaSAndroid Build Coastguard Worker         return fResource;
129*c8dee2aaSAndroid Build Coastguard Worker     }
isLinearTiled()130*c8dee2aaSAndroid Build Coastguard Worker     bool isLinearTiled() const {
131*c8dee2aaSAndroid Build Coastguard Worker         // Should only be called when we have a real fResource object, i.e. never when being used as
132*c8dee2aaSAndroid Build Coastguard Worker         // a RT in an external secondary command buffer.
133*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
134*c8dee2aaSAndroid Build Coastguard Worker         return SkToBool(VK_IMAGE_TILING_LINEAR == fInfo.fImageTiling);
135*c8dee2aaSAndroid Build Coastguard Worker     }
isBorrowed()136*c8dee2aaSAndroid Build Coastguard Worker     bool isBorrowed() const { return fIsBorrowed; }
137*c8dee2aaSAndroid Build Coastguard Worker 
getMutableState()138*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::MutableTextureState> getMutableState() const { return fMutableState; }
139*c8dee2aaSAndroid Build Coastguard Worker 
currentLayout()140*c8dee2aaSAndroid Build Coastguard Worker     VkImageLayout currentLayout() const {
141*c8dee2aaSAndroid Build Coastguard Worker         return skgpu::MutableTextureStates::GetVkImageLayout(fMutableState.get());
142*c8dee2aaSAndroid Build Coastguard Worker     }
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker     void setImageLayoutAndQueueIndex(const GrVkGpu* gpu,
145*c8dee2aaSAndroid Build Coastguard Worker                                      VkImageLayout newLayout,
146*c8dee2aaSAndroid Build Coastguard Worker                                      VkAccessFlags dstAccessMask,
147*c8dee2aaSAndroid Build Coastguard Worker                                      VkPipelineStageFlags dstStageMask,
148*c8dee2aaSAndroid Build Coastguard Worker                                      bool byRegion,
149*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t newQueueFamilyIndex);
150*c8dee2aaSAndroid Build Coastguard Worker 
setImageLayout(const GrVkGpu * gpu,VkImageLayout newLayout,VkAccessFlags dstAccessMask,VkPipelineStageFlags dstStageMask,bool byRegion)151*c8dee2aaSAndroid Build Coastguard Worker     void setImageLayout(const GrVkGpu* gpu,
152*c8dee2aaSAndroid Build Coastguard Worker                         VkImageLayout newLayout,
153*c8dee2aaSAndroid Build Coastguard Worker                         VkAccessFlags dstAccessMask,
154*c8dee2aaSAndroid Build Coastguard Worker                         VkPipelineStageFlags dstStageMask,
155*c8dee2aaSAndroid Build Coastguard Worker                         bool byRegion) {
156*c8dee2aaSAndroid Build Coastguard Worker         this->setImageLayoutAndQueueIndex(gpu, newLayout, dstAccessMask, dstStageMask, byRegion,
157*c8dee2aaSAndroid Build Coastguard Worker                                           VK_QUEUE_FAMILY_IGNORED);
158*c8dee2aaSAndroid Build Coastguard Worker     }
159*c8dee2aaSAndroid Build Coastguard Worker 
currentQueueFamilyIndex()160*c8dee2aaSAndroid Build Coastguard Worker     uint32_t currentQueueFamilyIndex() const {
161*c8dee2aaSAndroid Build Coastguard Worker         return skgpu::MutableTextureStates::GetVkQueueFamilyIndex(fMutableState.get());
162*c8dee2aaSAndroid Build Coastguard Worker     }
163*c8dee2aaSAndroid Build Coastguard Worker 
setQueueFamilyIndex(uint32_t queueFamilyIndex)164*c8dee2aaSAndroid Build Coastguard Worker     void setQueueFamilyIndex(uint32_t queueFamilyIndex) {
165*c8dee2aaSAndroid Build Coastguard Worker         skgpu::MutableTextureStates::SetVkQueueFamilyIndex(fMutableState.get(), queueFamilyIndex);
166*c8dee2aaSAndroid Build Coastguard Worker     }
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker     // Returns the image to its original queue family and changes the layout to present if the queue
169*c8dee2aaSAndroid Build Coastguard Worker     // family is not external or foreign.
170*c8dee2aaSAndroid Build Coastguard Worker     void prepareForPresent(GrVkGpu* gpu);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     // Returns the image to its original queue family
173*c8dee2aaSAndroid Build Coastguard Worker     void prepareForExternal(GrVkGpu* gpu);
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     // This simply updates our tracking of the image layout and does not actually do any gpu work.
176*c8dee2aaSAndroid Build Coastguard Worker     // This is only used for mip map generation where we are manually changing the layouts as we
177*c8dee2aaSAndroid Build Coastguard Worker     // blit each layer, and then at the end need to update our tracking.
updateImageLayout(VkImageLayout newLayout)178*c8dee2aaSAndroid Build Coastguard Worker     void updateImageLayout(VkImageLayout newLayout) {
179*c8dee2aaSAndroid Build Coastguard Worker         // Should only be called when we have a real fResource object, i.e. never when being used as
180*c8dee2aaSAndroid Build Coastguard Worker         // a RT in an external secondary command buffer.
181*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fResource);
182*c8dee2aaSAndroid Build Coastguard Worker         skgpu::MutableTextureStates::SetVkImageLayout(fMutableState.get(), newLayout);
183*c8dee2aaSAndroid Build Coastguard Worker     }
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker     struct ImageDesc {
186*c8dee2aaSAndroid Build Coastguard Worker         VkImageType         fImageType;
187*c8dee2aaSAndroid Build Coastguard Worker         VkFormat            fFormat;
188*c8dee2aaSAndroid Build Coastguard Worker         uint32_t            fWidth;
189*c8dee2aaSAndroid Build Coastguard Worker         uint32_t            fHeight;
190*c8dee2aaSAndroid Build Coastguard Worker         uint32_t            fLevels;
191*c8dee2aaSAndroid Build Coastguard Worker         uint32_t            fSamples;
192*c8dee2aaSAndroid Build Coastguard Worker         VkImageTiling       fImageTiling;
193*c8dee2aaSAndroid Build Coastguard Worker         VkImageUsageFlags   fUsageFlags;
194*c8dee2aaSAndroid Build Coastguard Worker         VkFlags             fMemProps;
195*c8dee2aaSAndroid Build Coastguard Worker         GrProtected         fIsProtected;
196*c8dee2aaSAndroid Build Coastguard Worker 
ImageDescImageDesc197*c8dee2aaSAndroid Build Coastguard Worker         ImageDesc()
198*c8dee2aaSAndroid Build Coastguard Worker                 : fImageType(VK_IMAGE_TYPE_2D)
199*c8dee2aaSAndroid Build Coastguard Worker                 , fFormat(VK_FORMAT_UNDEFINED)
200*c8dee2aaSAndroid Build Coastguard Worker                 , fWidth(0)
201*c8dee2aaSAndroid Build Coastguard Worker                 , fHeight(0)
202*c8dee2aaSAndroid Build Coastguard Worker                 , fLevels(1)
203*c8dee2aaSAndroid Build Coastguard Worker                 , fSamples(1)
204*c8dee2aaSAndroid Build Coastguard Worker                 , fImageTiling(VK_IMAGE_TILING_OPTIMAL)
205*c8dee2aaSAndroid Build Coastguard Worker                 , fUsageFlags(0)
206*c8dee2aaSAndroid Build Coastguard Worker                 , fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
207*c8dee2aaSAndroid Build Coastguard Worker                 , fIsProtected(GrProtected::kNo) {}
208*c8dee2aaSAndroid Build Coastguard Worker     };
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     static bool InitImageInfo(GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImageInfo*);
211*c8dee2aaSAndroid Build Coastguard Worker     // Destroys the internal VkImage and VkDeviceMemory in the GrVkImageInfo
212*c8dee2aaSAndroid Build Coastguard Worker     static void DestroyImageInfo(const GrVkGpu* gpu, GrVkImageInfo*);
213*c8dee2aaSAndroid Build Coastguard Worker 
214*c8dee2aaSAndroid Build Coastguard Worker     // These match the definitions in SkImage, for whence they came
215*c8dee2aaSAndroid Build Coastguard Worker     typedef void* ReleaseCtx;
216*c8dee2aaSAndroid Build Coastguard Worker     typedef void (*ReleaseProc)(ReleaseCtx);
217*c8dee2aaSAndroid Build Coastguard Worker 
218*c8dee2aaSAndroid Build Coastguard Worker     void setResourceRelease(sk_sp<RefCntedReleaseProc> releaseHelper);
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     // Helpers to use for setting the layout of the VkImage
221*c8dee2aaSAndroid Build Coastguard Worker     static VkPipelineStageFlags LayoutToPipelineSrcStageFlags(const VkImageLayout layout);
222*c8dee2aaSAndroid Build Coastguard Worker     static VkAccessFlags LayoutToSrcAccessMask(const VkImageLayout layout);
223*c8dee2aaSAndroid Build Coastguard Worker 
224*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
225*c8dee2aaSAndroid Build Coastguard Worker     void setCurrentQueueFamilyToGraphicsQueue(GrVkGpu* gpu);
226*c8dee2aaSAndroid Build Coastguard Worker #endif
227*c8dee2aaSAndroid Build Coastguard Worker 
228*c8dee2aaSAndroid Build Coastguard Worker private:
229*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<GrVkImage> Make(GrVkGpu* gpu,
230*c8dee2aaSAndroid Build Coastguard Worker                                  SkISize dimensions,
231*c8dee2aaSAndroid Build Coastguard Worker                                  UsageFlags attachmentUsages,
232*c8dee2aaSAndroid Build Coastguard Worker                                  int sampleCnt,
233*c8dee2aaSAndroid Build Coastguard Worker                                  VkFormat format,
234*c8dee2aaSAndroid Build Coastguard Worker                                  uint32_t mipLevels,
235*c8dee2aaSAndroid Build Coastguard Worker                                  VkImageUsageFlags vkUsageFlags,
236*c8dee2aaSAndroid Build Coastguard Worker                                  GrProtected isProtected,
237*c8dee2aaSAndroid Build Coastguard Worker                                  GrMemoryless,
238*c8dee2aaSAndroid Build Coastguard Worker                                  skgpu::Budgeted);
239*c8dee2aaSAndroid Build Coastguard Worker 
240*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage(GrVkGpu* gpu,
241*c8dee2aaSAndroid Build Coastguard Worker               SkISize dimensions,
242*c8dee2aaSAndroid Build Coastguard Worker               UsageFlags supportedUsages,
243*c8dee2aaSAndroid Build Coastguard Worker               const GrVkImageInfo&,
244*c8dee2aaSAndroid Build Coastguard Worker               sk_sp<skgpu::MutableTextureState> mutableState,
245*c8dee2aaSAndroid Build Coastguard Worker               sk_sp<const GrVkImageView> framebufferView,
246*c8dee2aaSAndroid Build Coastguard Worker               sk_sp<const GrVkImageView> textureView,
247*c8dee2aaSAndroid Build Coastguard Worker               skgpu::Budgeted,
248*c8dee2aaSAndroid Build Coastguard Worker               std::string_view label);
249*c8dee2aaSAndroid Build Coastguard Worker 
250*c8dee2aaSAndroid Build Coastguard Worker     GrVkImage(GrVkGpu* gpu,
251*c8dee2aaSAndroid Build Coastguard Worker               SkISize dimensions,
252*c8dee2aaSAndroid Build Coastguard Worker               UsageFlags supportedUsages,
253*c8dee2aaSAndroid Build Coastguard Worker               const GrVkImageInfo&,
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,
258*c8dee2aaSAndroid Build Coastguard Worker               GrWrapCacheable,
259*c8dee2aaSAndroid Build Coastguard Worker               bool forSecondaryCB,
260*c8dee2aaSAndroid Build Coastguard Worker               std::string_view label);
261*c8dee2aaSAndroid Build Coastguard Worker 
262*c8dee2aaSAndroid Build Coastguard Worker     void init(GrVkGpu*, bool forSecondaryCB);
263*c8dee2aaSAndroid Build Coastguard Worker 
264*c8dee2aaSAndroid Build Coastguard Worker     void onRelease() override;
265*c8dee2aaSAndroid Build Coastguard Worker     void onAbandon() override;
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     void releaseImage();
hasResource()268*c8dee2aaSAndroid Build Coastguard Worker     bool hasResource() const { return fResource; }
269*c8dee2aaSAndroid Build Coastguard Worker 
270*c8dee2aaSAndroid Build Coastguard Worker     GrVkGpu* getVkGpu() const;
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker     GrVkImageInfo                        fInfo;
273*c8dee2aaSAndroid Build Coastguard Worker     uint32_t                             fInitialQueueFamily;
274*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::MutableTextureState> fMutableState;
275*c8dee2aaSAndroid Build Coastguard Worker 
276*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView>           fFramebufferView;
277*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrVkImageView>           fTextureView;
278*c8dee2aaSAndroid Build Coastguard Worker 
279*c8dee2aaSAndroid Build Coastguard Worker     bool fIsBorrowed;
280*c8dee2aaSAndroid Build Coastguard Worker 
281*c8dee2aaSAndroid Build Coastguard Worker     // Descriptor set used when this is used as an input attachment for reading the dst in blending.
282*c8dee2aaSAndroid Build Coastguard Worker     gr_rp<const GrVkDescriptorSet> fCachedBlendingInputDescSet;
283*c8dee2aaSAndroid Build Coastguard Worker     // Descriptor set used when this is used as an input attachment for loading an msaa attachment.
284*c8dee2aaSAndroid Build Coastguard Worker     gr_rp<const GrVkDescriptorSet> fCachedMSAALoadInputDescSet;
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     class Resource : public GrTextureResource {
287*c8dee2aaSAndroid Build Coastguard Worker     public:
Resource(const GrVkGpu * gpu)288*c8dee2aaSAndroid Build Coastguard Worker         explicit Resource(const GrVkGpu* gpu)
289*c8dee2aaSAndroid Build Coastguard Worker                 : fGpu(gpu)
290*c8dee2aaSAndroid Build Coastguard Worker                 , fImage(VK_NULL_HANDLE) {
291*c8dee2aaSAndroid Build Coastguard Worker             fAlloc.fMemory = VK_NULL_HANDLE;
292*c8dee2aaSAndroid Build Coastguard Worker             fAlloc.fOffset = 0;
293*c8dee2aaSAndroid Build Coastguard Worker         }
294*c8dee2aaSAndroid Build Coastguard Worker 
Resource(const GrVkGpu * gpu,VkImage image,const skgpu::VulkanAlloc & alloc,VkImageTiling tiling)295*c8dee2aaSAndroid Build Coastguard Worker         Resource(const GrVkGpu* gpu,
296*c8dee2aaSAndroid Build Coastguard Worker                  VkImage image,
297*c8dee2aaSAndroid Build Coastguard Worker                  const skgpu::VulkanAlloc& alloc,
298*c8dee2aaSAndroid Build Coastguard Worker                  VkImageTiling tiling)
299*c8dee2aaSAndroid Build Coastguard Worker             : fGpu(gpu)
300*c8dee2aaSAndroid Build Coastguard Worker             , fImage(image)
301*c8dee2aaSAndroid Build Coastguard Worker             , fAlloc(alloc) {}
302*c8dee2aaSAndroid Build Coastguard Worker 
~Resource()303*c8dee2aaSAndroid Build Coastguard Worker         ~Resource() override {}
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_TRACE_MANAGED_RESOURCES
dumpInfo()306*c8dee2aaSAndroid Build Coastguard Worker         void dumpInfo() const override {
307*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("GrVkImage: %" PRIdPTR " (%d refs)\n", (intptr_t)fImage, this->getRefCnt());
308*c8dee2aaSAndroid Build Coastguard Worker         }
309*c8dee2aaSAndroid Build Coastguard Worker #endif
310*c8dee2aaSAndroid Build Coastguard Worker 
311*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
asVkImageResource()312*c8dee2aaSAndroid Build Coastguard Worker         const GrManagedResource* asVkImageResource() const override { return this; }
313*c8dee2aaSAndroid Build Coastguard Worker #endif
314*c8dee2aaSAndroid Build Coastguard Worker 
315*c8dee2aaSAndroid Build Coastguard Worker     private:
316*c8dee2aaSAndroid Build Coastguard Worker         void freeGPUData() const override;
317*c8dee2aaSAndroid Build Coastguard Worker 
318*c8dee2aaSAndroid Build Coastguard Worker         const GrVkGpu*     fGpu;
319*c8dee2aaSAndroid Build Coastguard Worker         VkImage            fImage;
320*c8dee2aaSAndroid Build Coastguard Worker         skgpu::VulkanAlloc fAlloc;
321*c8dee2aaSAndroid Build Coastguard Worker 
322*c8dee2aaSAndroid Build Coastguard Worker         using INHERITED = GrTextureResource;
323*c8dee2aaSAndroid Build Coastguard Worker     };
324*c8dee2aaSAndroid Build Coastguard Worker 
325*c8dee2aaSAndroid Build Coastguard Worker     // for wrapped textures
326*c8dee2aaSAndroid Build Coastguard Worker     class BorrowedResource : public Resource {
327*c8dee2aaSAndroid Build Coastguard Worker     public:
BorrowedResource(const GrVkGpu * gpu,VkImage image,const skgpu::VulkanAlloc & alloc,VkImageTiling tiling)328*c8dee2aaSAndroid Build Coastguard Worker         BorrowedResource(const GrVkGpu* gpu, VkImage image, const skgpu::VulkanAlloc& alloc,
329*c8dee2aaSAndroid Build Coastguard Worker                          VkImageTiling tiling)
330*c8dee2aaSAndroid Build Coastguard Worker             : Resource(gpu, image, alloc, tiling) {
331*c8dee2aaSAndroid Build Coastguard Worker         }
332*c8dee2aaSAndroid Build Coastguard Worker     private:
333*c8dee2aaSAndroid Build Coastguard Worker         void freeGPUData() const override;
334*c8dee2aaSAndroid Build Coastguard Worker     };
335*c8dee2aaSAndroid Build Coastguard Worker 
336*c8dee2aaSAndroid Build Coastguard Worker     Resource* fResource;
337*c8dee2aaSAndroid Build Coastguard Worker 
338*c8dee2aaSAndroid Build Coastguard Worker     friend class GrVkRenderTarget;
339*c8dee2aaSAndroid Build Coastguard Worker };
340*c8dee2aaSAndroid Build Coastguard Worker 
341*c8dee2aaSAndroid Build Coastguard Worker #endif
342