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