xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkGpu.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 GrVkGpu_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrVkGpu_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkDrawable.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.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/ganesh/vk/GrVkBackendSurface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkSpan_impl.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/RefCntedCallback.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpsRenderPass.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrStagingBufferManager.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkCaps.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkMSAALoadManager.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkResourceProvider.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkSemaphore.h"
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker #include <array>
35*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
36*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
37*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
38*c8dee2aaSAndroid Build Coastguard Worker #include <optional>
39*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
40*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker class GrAttachment;
43*c8dee2aaSAndroid Build Coastguard Worker class GrBackendSemaphore;
44*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
45*c8dee2aaSAndroid Build Coastguard Worker class GrGpuBuffer;
46*c8dee2aaSAndroid Build Coastguard Worker class GrManagedResource;
47*c8dee2aaSAndroid Build Coastguard Worker class GrProgramDesc;
48*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo;
49*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget;
50*c8dee2aaSAndroid Build Coastguard Worker class GrSemaphore;
51*c8dee2aaSAndroid Build Coastguard Worker class GrSurface;
52*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
53*c8dee2aaSAndroid Build Coastguard Worker class GrTexture;
54*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafePipelineBuilder;
55*c8dee2aaSAndroid Build Coastguard Worker class GrVkBuffer;
56*c8dee2aaSAndroid Build Coastguard Worker class GrVkCommandBuffer;
57*c8dee2aaSAndroid Build Coastguard Worker class GrVkCommandPool;
58*c8dee2aaSAndroid Build Coastguard Worker class GrVkFramebuffer;
59*c8dee2aaSAndroid Build Coastguard Worker class GrVkImage;
60*c8dee2aaSAndroid Build Coastguard Worker class GrVkOpsRenderPass;
61*c8dee2aaSAndroid Build Coastguard Worker class GrVkPrimaryCommandBuffer;
62*c8dee2aaSAndroid Build Coastguard Worker class GrVkRenderPass;
63*c8dee2aaSAndroid Build Coastguard Worker class GrVkRenderTarget;
64*c8dee2aaSAndroid Build Coastguard Worker class GrVkSecondaryCommandBuffer;
65*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType;
66*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
67*c8dee2aaSAndroid Build Coastguard Worker struct GrVkDrawableInfo;
68*c8dee2aaSAndroid Build Coastguard Worker struct GrVkImageInfo;
69*c8dee2aaSAndroid Build Coastguard Worker struct SkIPoint;
70*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
71*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
72*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker namespace SkSurfaces {
75*c8dee2aaSAndroid Build Coastguard Worker enum class BackendSurfaceAccess;
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu {
79*c8dee2aaSAndroid Build Coastguard Worker class MutableTextureState;
80*c8dee2aaSAndroid Build Coastguard Worker class VulkanMemoryAllocator;
81*c8dee2aaSAndroid Build Coastguard Worker struct VulkanBackendContext;
82*c8dee2aaSAndroid Build Coastguard Worker struct VulkanInterface;
83*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker class GrVkGpu : public GrGpu {
86*c8dee2aaSAndroid Build Coastguard Worker public:
87*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<GrGpu> Make(const skgpu::VulkanBackendContext&,
88*c8dee2aaSAndroid Build Coastguard Worker                                        const GrContextOptions&,
89*c8dee2aaSAndroid Build Coastguard Worker                                        GrDirectContext*);
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     ~GrVkGpu() override;
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     void disconnect(DisconnectType) override;
disconnected()94*c8dee2aaSAndroid Build Coastguard Worker     bool disconnected() const { return fDisconnected; }
95*c8dee2aaSAndroid Build Coastguard Worker 
releaseUnlockedBackendObjects()96*c8dee2aaSAndroid Build Coastguard Worker     void releaseUnlockedBackendObjects() override {
97*c8dee2aaSAndroid Build Coastguard Worker         fResourceProvider.releaseUnlockedBackendObjects();
98*c8dee2aaSAndroid Build Coastguard Worker     }
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker     GrThreadSafePipelineBuilder* pipelineBuilder() override;
101*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrThreadSafePipelineBuilder> refPipelineBuilder() override;
102*c8dee2aaSAndroid Build Coastguard Worker 
vkInterface()103*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::VulkanInterface* vkInterface() const { return fInterface.get(); }
vkCaps()104*c8dee2aaSAndroid Build Coastguard Worker     const GrVkCaps& vkCaps() const { return *fVkCaps; }
105*c8dee2aaSAndroid Build Coastguard Worker 
stagingBufferManager()106*c8dee2aaSAndroid Build Coastguard Worker     GrStagingBufferManager* stagingBufferManager() override { return &fStagingBufferManager; }
107*c8dee2aaSAndroid Build Coastguard Worker     void takeOwnershipOfBuffer(sk_sp<GrGpuBuffer>) override;
108*c8dee2aaSAndroid Build Coastguard Worker 
isDeviceLost()109*c8dee2aaSAndroid Build Coastguard Worker     bool isDeviceLost() const override { return fDeviceIsLost; }
110*c8dee2aaSAndroid Build Coastguard Worker 
memoryAllocator()111*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanMemoryAllocator* memoryAllocator() const { return fMemoryAllocator.get(); }
112*c8dee2aaSAndroid Build Coastguard Worker 
physicalDevice()113*c8dee2aaSAndroid Build Coastguard Worker     VkPhysicalDevice physicalDevice() const { return fPhysicalDevice; }
device()114*c8dee2aaSAndroid Build Coastguard Worker     VkDevice device() const { return fDevice; }
queue()115*c8dee2aaSAndroid Build Coastguard Worker     VkQueue  queue() const { return fQueue; }
queueIndex()116*c8dee2aaSAndroid Build Coastguard Worker     uint32_t  queueIndex() const { return fQueueIndex; }
cmdPool()117*c8dee2aaSAndroid Build Coastguard Worker     GrVkCommandPool* cmdPool() const { return fMainCmdPool; }
physicalDeviceProperties()118*c8dee2aaSAndroid Build Coastguard Worker     const VkPhysicalDeviceProperties& physicalDeviceProperties() const {
119*c8dee2aaSAndroid Build Coastguard Worker         return fPhysDevProps;
120*c8dee2aaSAndroid Build Coastguard Worker     }
physicalDeviceMemoryProperties()121*c8dee2aaSAndroid Build Coastguard Worker     const VkPhysicalDeviceMemoryProperties& physicalDeviceMemoryProperties() const {
122*c8dee2aaSAndroid Build Coastguard Worker         return fPhysDevMemProps;
123*c8dee2aaSAndroid Build Coastguard Worker     }
protectedContext()124*c8dee2aaSAndroid Build Coastguard Worker     bool protectedContext() const { return fProtectedContext == skgpu::Protected::kYes; }
125*c8dee2aaSAndroid Build Coastguard Worker 
resourceProvider()126*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider& resourceProvider() { return fResourceProvider; }
127*c8dee2aaSAndroid Build Coastguard Worker 
currentCommandBuffer()128*c8dee2aaSAndroid Build Coastguard Worker     GrVkPrimaryCommandBuffer* currentCommandBuffer() const { return fMainCmdBuffer; }
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override;
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     bool setBackendTextureState(const GrBackendTexture&,
133*c8dee2aaSAndroid Build Coastguard Worker                                 const skgpu::MutableTextureState&,
134*c8dee2aaSAndroid Build Coastguard Worker                                 skgpu::MutableTextureState* previousState,
135*c8dee2aaSAndroid Build Coastguard Worker                                 sk_sp<skgpu::RefCntedCallback> finishedCallback) override;
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker     bool setBackendRenderTargetState(const GrBackendRenderTarget&,
138*c8dee2aaSAndroid Build Coastguard Worker                                      const skgpu::MutableTextureState&,
139*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::MutableTextureState* previousState,
140*c8dee2aaSAndroid Build Coastguard Worker                                      sk_sp<skgpu::RefCntedCallback> finishedCallback) override;
141*c8dee2aaSAndroid Build Coastguard Worker 
142*c8dee2aaSAndroid Build Coastguard Worker     void deleteBackendTexture(const GrBackendTexture&) override;
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker     bool compile(const GrProgramDesc&, const GrProgramInfo&) override;
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
147*c8dee2aaSAndroid Build Coastguard Worker     bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override;
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     GrBackendRenderTarget createTestingOnlyBackendRenderTarget(SkISize dimensions,
150*c8dee2aaSAndroid Build Coastguard Worker                                                                GrColorType,
151*c8dee2aaSAndroid Build Coastguard Worker                                                                int sampleCnt,
152*c8dee2aaSAndroid Build Coastguard Worker                                                                GrProtected) override;
153*c8dee2aaSAndroid Build Coastguard Worker     void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) override;
154*c8dee2aaSAndroid Build Coastguard Worker 
resetShaderCacheForTesting()155*c8dee2aaSAndroid Build Coastguard Worker     void resetShaderCacheForTesting() const override {
156*c8dee2aaSAndroid Build Coastguard Worker         fResourceProvider.resetShaderCacheForTesting();
157*c8dee2aaSAndroid Build Coastguard Worker     }
158*c8dee2aaSAndroid Build Coastguard Worker #endif
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrAttachment> makeStencilAttachment(const GrBackendFormat& /*colorFormat*/,
161*c8dee2aaSAndroid Build Coastguard Worker                                               SkISize dimensions, int numStencilSamples) override;
162*c8dee2aaSAndroid Build Coastguard Worker 
getPreferredStencilFormat(const GrBackendFormat &)163*c8dee2aaSAndroid Build Coastguard Worker     GrBackendFormat getPreferredStencilFormat(const GrBackendFormat&) override {
164*c8dee2aaSAndroid Build Coastguard Worker         return GrBackendFormats::MakeVk(this->vkCaps().preferredStencilFormat());
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker 
167*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrAttachment> makeMSAAAttachment(SkISize dimensions,
168*c8dee2aaSAndroid Build Coastguard Worker                                            const GrBackendFormat& format,
169*c8dee2aaSAndroid Build Coastguard Worker                                            int numSamples,
170*c8dee2aaSAndroid Build Coastguard Worker                                            GrProtected isProtected,
171*c8dee2aaSAndroid Build Coastguard Worker                                            GrMemoryless isMemoryless) override;
172*c8dee2aaSAndroid Build Coastguard Worker 
173*c8dee2aaSAndroid Build Coastguard Worker     void addBufferMemoryBarrier(const GrManagedResource*,
174*c8dee2aaSAndroid Build Coastguard Worker                                 VkPipelineStageFlags srcStageMask,
175*c8dee2aaSAndroid Build Coastguard Worker                                 VkPipelineStageFlags dstStageMask,
176*c8dee2aaSAndroid Build Coastguard Worker                                 bool byRegion,
177*c8dee2aaSAndroid Build Coastguard Worker                                 VkBufferMemoryBarrier* barrier) const;
178*c8dee2aaSAndroid Build Coastguard Worker     void addBufferMemoryBarrier(VkPipelineStageFlags srcStageMask,
179*c8dee2aaSAndroid Build Coastguard Worker                                 VkPipelineStageFlags dstStageMask,
180*c8dee2aaSAndroid Build Coastguard Worker                                 bool byRegion,
181*c8dee2aaSAndroid Build Coastguard Worker                                 VkBufferMemoryBarrier* barrier) const;
182*c8dee2aaSAndroid Build Coastguard Worker     void addImageMemoryBarrier(const GrManagedResource*,
183*c8dee2aaSAndroid Build Coastguard Worker                                VkPipelineStageFlags srcStageMask,
184*c8dee2aaSAndroid Build Coastguard Worker                                VkPipelineStageFlags dstStageMask,
185*c8dee2aaSAndroid Build Coastguard Worker                                bool byRegion,
186*c8dee2aaSAndroid Build Coastguard Worker                                VkImageMemoryBarrier* barrier) const;
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker     bool loadMSAAFromResolve(GrVkCommandBuffer* commandBuffer,
189*c8dee2aaSAndroid Build Coastguard Worker                              const GrVkRenderPass& renderPass,
190*c8dee2aaSAndroid Build Coastguard Worker                              GrAttachment* dst,
191*c8dee2aaSAndroid Build Coastguard Worker                              GrVkImage* src,
192*c8dee2aaSAndroid Build Coastguard Worker                              const SkIRect& srcRect);
193*c8dee2aaSAndroid Build Coastguard Worker 
194*c8dee2aaSAndroid Build Coastguard Worker     bool onRegenerateMipMapLevels(GrTexture* tex) override;
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     void onResolveRenderTarget(GrRenderTarget* target, const SkIRect& resolveRect) override;
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     void submitSecondaryCommandBuffer(std::unique_ptr<GrVkSecondaryCommandBuffer>);
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker     void submit(GrOpsRenderPass*) override;
201*c8dee2aaSAndroid Build Coastguard Worker 
202*c8dee2aaSAndroid Build Coastguard Worker     [[nodiscard]] std::unique_ptr<GrSemaphore> makeSemaphore(bool isOwned) override;
203*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore&,
204*c8dee2aaSAndroid Build Coastguard Worker                                                       GrSemaphoreWrapType,
205*c8dee2aaSAndroid Build Coastguard Worker                                                       GrWrapOwnership) override;
206*c8dee2aaSAndroid Build Coastguard Worker     void insertSemaphore(GrSemaphore* semaphore) override;
207*c8dee2aaSAndroid Build Coastguard Worker     void waitSemaphore(GrSemaphore* semaphore) override;
208*c8dee2aaSAndroid Build Coastguard Worker 
209*c8dee2aaSAndroid Build Coastguard Worker     // These match the definitions in SkDrawable, from whence they came
210*c8dee2aaSAndroid Build Coastguard Worker     typedef void* SubmitContext;
211*c8dee2aaSAndroid Build Coastguard Worker     typedef void (*SubmitProc)(SubmitContext submitContext);
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     // Adds an SkDrawable::GpuDrawHandler that we will delete the next time we submit the primary
214*c8dee2aaSAndroid Build Coastguard Worker     // command buffer to the gpu.
215*c8dee2aaSAndroid Build Coastguard Worker     void addDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler> drawable);
216*c8dee2aaSAndroid Build Coastguard Worker 
checkFinishedCallbacks()217*c8dee2aaSAndroid Build Coastguard Worker     void checkFinishedCallbacks() override { fResourceProvider.checkCommandBuffers(); }
218*c8dee2aaSAndroid Build Coastguard Worker     void finishOutstandingGpuWork() override;
219*c8dee2aaSAndroid Build Coastguard Worker 
220*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override;
221*c8dee2aaSAndroid Build Coastguard Worker 
222*c8dee2aaSAndroid Build Coastguard Worker     bool updateBuffer(sk_sp<GrVkBuffer> buffer, const void* src, VkDeviceSize offset,
223*c8dee2aaSAndroid Build Coastguard Worker                       VkDeviceSize size);
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     bool zeroBuffer(sk_sp<GrGpuBuffer>);
226*c8dee2aaSAndroid Build Coastguard Worker 
227*c8dee2aaSAndroid Build Coastguard Worker     enum PersistentCacheKeyType : uint32_t {
228*c8dee2aaSAndroid Build Coastguard Worker         kShader_PersistentCacheKeyType = 0,
229*c8dee2aaSAndroid Build Coastguard Worker         kPipelineCache_PersistentCacheKeyType = 1,
230*c8dee2aaSAndroid Build Coastguard Worker     };
231*c8dee2aaSAndroid Build Coastguard Worker 
232*c8dee2aaSAndroid Build Coastguard Worker     void storeVkPipelineCacheData() override;
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker     bool beginRenderPass(const GrVkRenderPass*,
235*c8dee2aaSAndroid Build Coastguard Worker                          sk_sp<const GrVkFramebuffer>,
236*c8dee2aaSAndroid Build Coastguard Worker                          const VkClearValue* colorClear,
237*c8dee2aaSAndroid Build Coastguard Worker                          const GrSurface*,
238*c8dee2aaSAndroid Build Coastguard Worker                          const SkIRect& renderPassBounds,
239*c8dee2aaSAndroid Build Coastguard Worker                          bool forSecondaryCB);
240*c8dee2aaSAndroid Build Coastguard Worker     void endRenderPass(GrRenderTarget* target, GrSurfaceOrigin origin, const SkIRect& bounds);
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     // Returns true if VkResult indicates success and also checks for device lost or OOM. Every
243*c8dee2aaSAndroid Build Coastguard Worker     // Vulkan call (and skgpu::VulkanMemoryAllocator call that returns VkResult) made on behalf of
244*c8dee2aaSAndroid Build Coastguard Worker     // the GrVkGpu should be processed by this function so that we respond to OOMs and lost devices.
245*c8dee2aaSAndroid Build Coastguard Worker     bool checkVkResult(VkResult);
246*c8dee2aaSAndroid Build Coastguard Worker 
247*c8dee2aaSAndroid Build Coastguard Worker private:
248*c8dee2aaSAndroid Build Coastguard Worker     GrVkGpu(GrDirectContext*,
249*c8dee2aaSAndroid Build Coastguard Worker             const skgpu::VulkanBackendContext&,
250*c8dee2aaSAndroid Build Coastguard Worker             const sk_sp<GrVkCaps> caps,
251*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<const skgpu::VulkanInterface>,
252*c8dee2aaSAndroid Build Coastguard Worker             uint32_t instanceVersion,
253*c8dee2aaSAndroid Build Coastguard Worker             uint32_t physicalDeviceVersion,
254*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<skgpu::VulkanMemoryAllocator>);
255*c8dee2aaSAndroid Build Coastguard Worker 
256*c8dee2aaSAndroid Build Coastguard Worker     void destroyResources();
257*c8dee2aaSAndroid Build Coastguard Worker 
258*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture onCreateBackendTexture(SkISize dimensions,
259*c8dee2aaSAndroid Build Coastguard Worker                                             const GrBackendFormat&,
260*c8dee2aaSAndroid Build Coastguard Worker                                             GrRenderable,
261*c8dee2aaSAndroid Build Coastguard Worker                                             skgpu::Mipmapped,
262*c8dee2aaSAndroid Build Coastguard Worker                                             GrProtected,
263*c8dee2aaSAndroid Build Coastguard Worker                                             std::string_view label) override;
264*c8dee2aaSAndroid Build Coastguard Worker     GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions,
265*c8dee2aaSAndroid Build Coastguard Worker                                                       const GrBackendFormat&,
266*c8dee2aaSAndroid Build Coastguard Worker                                                       skgpu::Mipmapped,
267*c8dee2aaSAndroid Build Coastguard Worker                                                       GrProtected) override;
268*c8dee2aaSAndroid Build Coastguard Worker 
269*c8dee2aaSAndroid Build Coastguard Worker     bool onClearBackendTexture(const GrBackendTexture&,
270*c8dee2aaSAndroid Build Coastguard Worker                                sk_sp<skgpu::RefCntedCallback> finishedCallback,
271*c8dee2aaSAndroid Build Coastguard Worker                                std::array<float, 4> color) override;
272*c8dee2aaSAndroid Build Coastguard Worker 
273*c8dee2aaSAndroid Build Coastguard Worker     bool onUpdateCompressedBackendTexture(const GrBackendTexture&,
274*c8dee2aaSAndroid Build Coastguard Worker                                           sk_sp<skgpu::RefCntedCallback> finishedCallback,
275*c8dee2aaSAndroid Build Coastguard Worker                                           const void* data,
276*c8dee2aaSAndroid Build Coastguard Worker                                           size_t length) override;
277*c8dee2aaSAndroid Build Coastguard Worker 
278*c8dee2aaSAndroid Build Coastguard Worker     bool setBackendSurfaceState(GrVkImageInfo info,
279*c8dee2aaSAndroid Build Coastguard Worker                                 sk_sp<skgpu::MutableTextureState> currentState,
280*c8dee2aaSAndroid Build Coastguard Worker                                 SkISize dimensions,
281*c8dee2aaSAndroid Build Coastguard Worker                                 VkImageLayout newLayout,
282*c8dee2aaSAndroid Build Coastguard Worker                                 uint32_t newQueueFamilyIndex,
283*c8dee2aaSAndroid Build Coastguard Worker                                 skgpu::MutableTextureState* previousState,
284*c8dee2aaSAndroid Build Coastguard Worker                                 sk_sp<skgpu::RefCntedCallback> finishedCallback);
285*c8dee2aaSAndroid Build Coastguard Worker 
286*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onCreateTexture(SkISize,
287*c8dee2aaSAndroid Build Coastguard Worker                                      const GrBackendFormat&,
288*c8dee2aaSAndroid Build Coastguard Worker                                      GrRenderable,
289*c8dee2aaSAndroid Build Coastguard Worker                                      int renderTargetSampleCnt,
290*c8dee2aaSAndroid Build Coastguard Worker                                      skgpu::Budgeted,
291*c8dee2aaSAndroid Build Coastguard Worker                                      GrProtected,
292*c8dee2aaSAndroid Build Coastguard Worker                                      int mipLevelCount,
293*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t levelClearMask,
294*c8dee2aaSAndroid Build Coastguard Worker                                      std::string_view label) override;
295*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions,
296*c8dee2aaSAndroid Build Coastguard Worker                                                const GrBackendFormat&,
297*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Budgeted,
298*c8dee2aaSAndroid Build Coastguard Worker                                                skgpu::Mipmapped,
299*c8dee2aaSAndroid Build Coastguard Worker                                                GrProtected,
300*c8dee2aaSAndroid Build Coastguard Worker                                                const void* data,
301*c8dee2aaSAndroid Build Coastguard Worker                                                size_t dataSize) override;
302*c8dee2aaSAndroid Build Coastguard Worker 
303*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
304*c8dee2aaSAndroid Build Coastguard Worker                                           GrWrapOwnership,
305*c8dee2aaSAndroid Build Coastguard Worker                                           GrWrapCacheable,
306*c8dee2aaSAndroid Build Coastguard Worker                                           GrIOType) override;
307*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapCompressedBackendTexture(const GrBackendTexture&,
308*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapOwnership,
309*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapCacheable) override;
310*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
311*c8dee2aaSAndroid Build Coastguard Worker                                                     int sampleCnt,
312*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapOwnership,
313*c8dee2aaSAndroid Build Coastguard Worker                                                     GrWrapCacheable) override;
314*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override;
315*c8dee2aaSAndroid Build Coastguard Worker 
316*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTarget> onWrapVulkanSecondaryCBAsRenderTarget(const SkImageInfo&,
317*c8dee2aaSAndroid Build Coastguard Worker                                                                 const GrVkDrawableInfo&) override;
318*c8dee2aaSAndroid Build Coastguard Worker 
319*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrGpuBuffer> onCreateBuffer(size_t size, GrGpuBufferType type, GrAccessPattern) override;
320*c8dee2aaSAndroid Build Coastguard Worker 
321*c8dee2aaSAndroid Build Coastguard Worker     bool onReadPixels(GrSurface*,
322*c8dee2aaSAndroid Build Coastguard Worker                       SkIRect,
323*c8dee2aaSAndroid Build Coastguard Worker                       GrColorType surfaceColorType,
324*c8dee2aaSAndroid Build Coastguard Worker                       GrColorType dstColorType,
325*c8dee2aaSAndroid Build Coastguard Worker                       void* buffer,
326*c8dee2aaSAndroid Build Coastguard Worker                       size_t rowBytes) override;
327*c8dee2aaSAndroid Build Coastguard Worker 
328*c8dee2aaSAndroid Build Coastguard Worker     bool onWritePixels(GrSurface*,
329*c8dee2aaSAndroid Build Coastguard Worker                        SkIRect,
330*c8dee2aaSAndroid Build Coastguard Worker                        GrColorType surfaceColorType,
331*c8dee2aaSAndroid Build Coastguard Worker                        GrColorType srcColorType,
332*c8dee2aaSAndroid Build Coastguard Worker                        const GrMipLevel[],
333*c8dee2aaSAndroid Build Coastguard Worker                        int mipLevelCount,
334*c8dee2aaSAndroid Build Coastguard Worker                        bool prepForTexSampling) override;
335*c8dee2aaSAndroid Build Coastguard Worker 
336*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferFromBufferToBuffer(sk_sp<GrGpuBuffer> src,
337*c8dee2aaSAndroid Build Coastguard Worker                                       size_t srcOffset,
338*c8dee2aaSAndroid Build Coastguard Worker                                       sk_sp<GrGpuBuffer> dst,
339*c8dee2aaSAndroid Build Coastguard Worker                                       size_t dstOffset,
340*c8dee2aaSAndroid Build Coastguard Worker                                       size_t size) override;
341*c8dee2aaSAndroid Build Coastguard Worker 
342*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferPixelsTo(GrTexture*,
343*c8dee2aaSAndroid Build Coastguard Worker                             SkIRect,
344*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType textureColorType,
345*c8dee2aaSAndroid Build Coastguard Worker                             GrColorType bufferColorType,
346*c8dee2aaSAndroid Build Coastguard Worker                             sk_sp<GrGpuBuffer>,
347*c8dee2aaSAndroid Build Coastguard Worker                             size_t offset,
348*c8dee2aaSAndroid Build Coastguard Worker                             size_t rowBytes) override;
349*c8dee2aaSAndroid Build Coastguard Worker 
350*c8dee2aaSAndroid Build Coastguard Worker     bool onTransferPixelsFrom(GrSurface*,
351*c8dee2aaSAndroid Build Coastguard Worker                               SkIRect,
352*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType surfaceColorType,
353*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType bufferColorType,
354*c8dee2aaSAndroid Build Coastguard Worker                               sk_sp<GrGpuBuffer>,
355*c8dee2aaSAndroid Build Coastguard Worker                               size_t offset) override;
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker     bool onCopySurface(GrSurface* dst, const SkIRect& dstRect,
358*c8dee2aaSAndroid Build Coastguard Worker                        GrSurface* src, const SkIRect& srcRect,
359*c8dee2aaSAndroid Build Coastguard Worker                        GrSamplerState::Filter) override;
360*c8dee2aaSAndroid Build Coastguard Worker 
addFinishedCallback(skgpu::AutoCallback callback,std::optional<GrTimerQuery> timerQuery)361*c8dee2aaSAndroid Build Coastguard Worker     void addFinishedCallback(skgpu::AutoCallback callback,
362*c8dee2aaSAndroid Build Coastguard Worker                              std::optional<GrTimerQuery> timerQuery) override {
363*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(!timerQuery);
364*c8dee2aaSAndroid Build Coastguard Worker         this->addFinishedCallback(skgpu::RefCntedCallback::Make(std::move(callback)));
365*c8dee2aaSAndroid Build Coastguard Worker     }
366*c8dee2aaSAndroid Build Coastguard Worker 
367*c8dee2aaSAndroid Build Coastguard Worker     void addFinishedCallback(sk_sp<skgpu::RefCntedCallback> finishedCallback);
368*c8dee2aaSAndroid Build Coastguard Worker 
369*c8dee2aaSAndroid Build Coastguard Worker     GrOpsRenderPass* onGetOpsRenderPass(GrRenderTarget*,
370*c8dee2aaSAndroid Build Coastguard Worker                                         bool useMSAASurface,
371*c8dee2aaSAndroid Build Coastguard Worker                                         GrAttachment* stencil,
372*c8dee2aaSAndroid Build Coastguard Worker                                         GrSurfaceOrigin,
373*c8dee2aaSAndroid Build Coastguard Worker                                         const SkIRect&,
374*c8dee2aaSAndroid Build Coastguard Worker                                         const GrOpsRenderPass::LoadAndStoreInfo&,
375*c8dee2aaSAndroid Build Coastguard Worker                                         const GrOpsRenderPass::StencilLoadAndStoreInfo&,
376*c8dee2aaSAndroid Build Coastguard Worker                                         const skia_private::TArray<GrSurfaceProxy*, true>& sampledProxies,
377*c8dee2aaSAndroid Build Coastguard Worker                                         GrXferBarrierFlags renderPassXferBarriers) override;
378*c8dee2aaSAndroid Build Coastguard Worker 
379*c8dee2aaSAndroid Build Coastguard Worker     void prepareSurfacesForBackendAccessAndStateUpdates(
380*c8dee2aaSAndroid Build Coastguard Worker             SkSpan<GrSurfaceProxy*> proxies,
381*c8dee2aaSAndroid Build Coastguard Worker             SkSurfaces::BackendSurfaceAccess access,
382*c8dee2aaSAndroid Build Coastguard Worker             const skgpu::MutableTextureState* newState) override;
383*c8dee2aaSAndroid Build Coastguard Worker 
384*c8dee2aaSAndroid Build Coastguard Worker     bool onSubmitToGpu(const GrSubmitInfo& info) override;
385*c8dee2aaSAndroid Build Coastguard Worker 
386*c8dee2aaSAndroid Build Coastguard Worker     void onReportSubmitHistograms() override;
387*c8dee2aaSAndroid Build Coastguard Worker 
388*c8dee2aaSAndroid Build Coastguard Worker     // Ends and submits the current command buffer to the queue and then creates a new command
389*c8dee2aaSAndroid Build Coastguard Worker     // buffer and begins it. If fSync in the submitInfo is set to GrSyncCpu::kYes, the function will
390*c8dee2aaSAndroid Build Coastguard Worker     // wait for all work in the queue to finish before returning. If this GrVkGpu object has any
391*c8dee2aaSAndroid Build Coastguard Worker     // semaphores in fSemaphoreToSignal, we will add those signal semaphores to the submission of
392*c8dee2aaSAndroid Build Coastguard Worker     // this command buffer. If this GrVkGpu object has any semaphores in fSemaphoresToWaitOn, we
393*c8dee2aaSAndroid Build Coastguard Worker     // will add those wait semaphores to the submission of this command buffer.
394*c8dee2aaSAndroid Build Coastguard Worker     //
395*c8dee2aaSAndroid Build Coastguard Worker     // If fMarkBoundary in submitInfo is GrMarkFrameBoundary::kYes, then we will mark the end of a
396*c8dee2aaSAndroid Build Coastguard Worker     // frame if the VK_EXT_frame_boundary extension is available.
397*c8dee2aaSAndroid Build Coastguard Worker     bool submitCommandBuffer(const GrSubmitInfo& submitInfo);
398*c8dee2aaSAndroid Build Coastguard Worker 
399*c8dee2aaSAndroid Build Coastguard Worker     void copySurfaceAsCopyImage(GrSurface* dst,
400*c8dee2aaSAndroid Build Coastguard Worker                                 GrSurface* src,
401*c8dee2aaSAndroid Build Coastguard Worker                                 GrVkImage* dstImage,
402*c8dee2aaSAndroid Build Coastguard Worker                                 GrVkImage* srcImage,
403*c8dee2aaSAndroid Build Coastguard Worker                                 const SkIRect& srcRect,
404*c8dee2aaSAndroid Build Coastguard Worker                                 const SkIPoint& dstPoint);
405*c8dee2aaSAndroid Build Coastguard Worker 
406*c8dee2aaSAndroid Build Coastguard Worker     void copySurfaceAsBlit(GrSurface* dst,
407*c8dee2aaSAndroid Build Coastguard Worker                            GrSurface* src,
408*c8dee2aaSAndroid Build Coastguard Worker                            GrVkImage* dstImage,
409*c8dee2aaSAndroid Build Coastguard Worker                            GrVkImage* srcImage,
410*c8dee2aaSAndroid Build Coastguard Worker                            const SkIRect& srcRect,
411*c8dee2aaSAndroid Build Coastguard Worker                            const SkIRect& dstRect,
412*c8dee2aaSAndroid Build Coastguard Worker                            GrSamplerState::Filter filter);
413*c8dee2aaSAndroid Build Coastguard Worker 
414*c8dee2aaSAndroid Build Coastguard Worker     void copySurfaceAsResolve(GrSurface* dst, GrSurface* src, const SkIRect& srcRect,
415*c8dee2aaSAndroid Build Coastguard Worker                               const SkIPoint& dstPoint);
416*c8dee2aaSAndroid Build Coastguard Worker 
417*c8dee2aaSAndroid Build Coastguard Worker     // helpers for onCreateTexture and writeTexturePixels
418*c8dee2aaSAndroid Build Coastguard Worker     bool uploadTexDataLinear(GrVkImage* tex,
419*c8dee2aaSAndroid Build Coastguard Worker                              SkIRect rect,
420*c8dee2aaSAndroid Build Coastguard Worker                              GrColorType colorType,
421*c8dee2aaSAndroid Build Coastguard Worker                              const void* data,
422*c8dee2aaSAndroid Build Coastguard Worker                              size_t rowBytes);
423*c8dee2aaSAndroid Build Coastguard Worker     bool uploadTexDataOptimal(GrVkImage* tex,
424*c8dee2aaSAndroid Build Coastguard Worker                               SkIRect rect,
425*c8dee2aaSAndroid Build Coastguard Worker                               GrColorType colorType,
426*c8dee2aaSAndroid Build Coastguard Worker                               const GrMipLevel texels[],
427*c8dee2aaSAndroid Build Coastguard Worker                               int mipLevelCount);
428*c8dee2aaSAndroid Build Coastguard Worker     bool uploadTexDataCompressed(GrVkImage* tex,
429*c8dee2aaSAndroid Build Coastguard Worker                                  SkTextureCompressionType compression,
430*c8dee2aaSAndroid Build Coastguard Worker                                  VkFormat vkFormat,
431*c8dee2aaSAndroid Build Coastguard Worker                                  SkISize dimensions,
432*c8dee2aaSAndroid Build Coastguard Worker                                  skgpu::Mipmapped mipmapped,
433*c8dee2aaSAndroid Build Coastguard Worker                                  const void* data,
434*c8dee2aaSAndroid Build Coastguard Worker                                  size_t dataSize);
435*c8dee2aaSAndroid Build Coastguard Worker     void resolveImage(GrSurface* dst, GrVkRenderTarget* src, const SkIRect& srcRect,
436*c8dee2aaSAndroid Build Coastguard Worker                       const SkIPoint& dstPoint);
437*c8dee2aaSAndroid Build Coastguard Worker 
438*c8dee2aaSAndroid Build Coastguard Worker     bool createVkImageForBackendSurface(VkFormat,
439*c8dee2aaSAndroid Build Coastguard Worker                                         SkISize dimensions,
440*c8dee2aaSAndroid Build Coastguard Worker                                         int sampleCnt,
441*c8dee2aaSAndroid Build Coastguard Worker                                         GrTexturable,
442*c8dee2aaSAndroid Build Coastguard Worker                                         GrRenderable,
443*c8dee2aaSAndroid Build Coastguard Worker                                         skgpu::Mipmapped,
444*c8dee2aaSAndroid Build Coastguard Worker                                         GrVkImageInfo*,
445*c8dee2aaSAndroid Build Coastguard Worker                                         GrProtected);
446*c8dee2aaSAndroid Build Coastguard Worker 
447*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const skgpu::VulkanInterface>                   fInterface;
448*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<skgpu::VulkanMemoryAllocator>                   fMemoryAllocator;
449*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrVkCaps>                                       fVkCaps;
450*c8dee2aaSAndroid Build Coastguard Worker     bool                                                  fDeviceIsLost = false;
451*c8dee2aaSAndroid Build Coastguard Worker 
452*c8dee2aaSAndroid Build Coastguard Worker     VkPhysicalDevice                                      fPhysicalDevice;
453*c8dee2aaSAndroid Build Coastguard Worker     VkDevice                                              fDevice;
454*c8dee2aaSAndroid Build Coastguard Worker     VkQueue                                               fQueue;    // Must be Graphics queue
455*c8dee2aaSAndroid Build Coastguard Worker     uint32_t                                              fQueueIndex;
456*c8dee2aaSAndroid Build Coastguard Worker 
457*c8dee2aaSAndroid Build Coastguard Worker     // Created by GrVkGpu
458*c8dee2aaSAndroid Build Coastguard Worker     GrVkResourceProvider                                  fResourceProvider;
459*c8dee2aaSAndroid Build Coastguard Worker     GrStagingBufferManager                                fStagingBufferManager;
460*c8dee2aaSAndroid Build Coastguard Worker 
461*c8dee2aaSAndroid Build Coastguard Worker     GrVkMSAALoadManager                                   fMSAALoadManager;
462*c8dee2aaSAndroid Build Coastguard Worker 
463*c8dee2aaSAndroid Build Coastguard Worker     GrVkCommandPool*                                      fMainCmdPool;
464*c8dee2aaSAndroid Build Coastguard Worker     // just a raw pointer; object's lifespan is managed by fCmdPool
465*c8dee2aaSAndroid Build Coastguard Worker     GrVkPrimaryCommandBuffer*                             fMainCmdBuffer;
466*c8dee2aaSAndroid Build Coastguard Worker 
467*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<1, GrVkSemaphore::Resource*>    fSemaphoresToWaitOn;
468*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<1, GrVkSemaphore::Resource*>    fSemaphoresToSignal;
469*c8dee2aaSAndroid Build Coastguard Worker 
470*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<std::unique_ptr<SkDrawable::GpuDrawHandler>> fDrawables;
471*c8dee2aaSAndroid Build Coastguard Worker 
472*c8dee2aaSAndroid Build Coastguard Worker     VkPhysicalDeviceProperties                            fPhysDevProps;
473*c8dee2aaSAndroid Build Coastguard Worker     VkPhysicalDeviceMemoryProperties                      fPhysDevMemProps;
474*c8dee2aaSAndroid Build Coastguard Worker 
475*c8dee2aaSAndroid Build Coastguard Worker     // We need a bool to track whether or not we've already disconnected all the gpu resources from
476*c8dee2aaSAndroid Build Coastguard Worker     // vulkan context.
477*c8dee2aaSAndroid Build Coastguard Worker     bool                                                  fDisconnected;
478*c8dee2aaSAndroid Build Coastguard Worker 
479*c8dee2aaSAndroid Build Coastguard Worker     skgpu::Protected                                      fProtectedContext;
480*c8dee2aaSAndroid Build Coastguard Worker 
481*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrVkOpsRenderPass>                    fCachedOpsRenderPass;
482*c8dee2aaSAndroid Build Coastguard Worker 
483*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanDeviceLostContext                        fDeviceLostContext;
484*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanDeviceLostProc                           fDeviceLostProc;
485*c8dee2aaSAndroid Build Coastguard Worker 
486*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = GrGpu;
487*c8dee2aaSAndroid Build Coastguard Worker };
488*c8dee2aaSAndroid Build Coastguard Worker 
489*c8dee2aaSAndroid Build Coastguard Worker #endif
490