1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 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 skgpu_graphite_VulkanRenderPass_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_VulkanRenderPass_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Resource.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanCommandBuffer.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker struct AttachmentDesc; 19*c8dee2aaSAndroid Build Coastguard Worker struct RenderPassDesc; 20*c8dee2aaSAndroid Build Coastguard Worker class VulkanCommandBuffer; 21*c8dee2aaSAndroid Build Coastguard Worker class VulkanSharedContext; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker const static VkAttachmentStoreOp vkStoreOp[] { 24*c8dee2aaSAndroid Build Coastguard Worker VK_ATTACHMENT_STORE_OP_STORE, 25*c8dee2aaSAndroid Build Coastguard Worker VK_ATTACHMENT_STORE_OP_DONT_CARE 26*c8dee2aaSAndroid Build Coastguard Worker }; 27*c8dee2aaSAndroid Build Coastguard Worker const static VkAttachmentLoadOp vkLoadOp[] { 28*c8dee2aaSAndroid Build Coastguard Worker VK_ATTACHMENT_LOAD_OP_LOAD, 29*c8dee2aaSAndroid Build Coastguard Worker VK_ATTACHMENT_LOAD_OP_CLEAR, 30*c8dee2aaSAndroid Build Coastguard Worker VK_ATTACHMENT_LOAD_OP_DONT_CARE 31*c8dee2aaSAndroid Build Coastguard Worker }; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker /** 34*c8dee2aaSAndroid Build Coastguard Worker * Wrapper around VkRenderPass. 35*c8dee2aaSAndroid Build Coastguard Worker */ 36*c8dee2aaSAndroid Build Coastguard Worker class VulkanRenderPass : public Resource { 37*c8dee2aaSAndroid Build Coastguard Worker public: 38*c8dee2aaSAndroid Build Coastguard Worker // Statically assign attachment indices until such information can be fetched from 39*c8dee2aaSAndroid Build Coastguard Worker // graphite-level structures (likely RenderPassDesc) 40*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kColorAttachmentIdx = 0; 41*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kColorResolveAttachmentIdx = 1; 42*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kDepthStencilAttachmentIdx = 2; 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kMaxExpectedAttachmentCount = kDepthStencilAttachmentIdx + 1; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker // Methods to create compatible (needed when creating a framebuffer and graphics pipeline) or 47*c8dee2aaSAndroid Build Coastguard Worker // full (needed when beginning a render pass from the command buffer) render passes and keys. 48*c8dee2aaSAndroid Build Coastguard Worker static GraphiteResourceKey MakeRenderPassKey(const RenderPassDesc&, bool compatibleOnly); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<VulkanRenderPass> MakeRenderPass(const VulkanSharedContext*, 51*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 52*c8dee2aaSAndroid Build Coastguard Worker bool compatibleOnly); 53*c8dee2aaSAndroid Build Coastguard Worker renderPass()54*c8dee2aaSAndroid Build Coastguard Worker VkRenderPass renderPass() const { 55*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fRenderPass != VK_NULL_HANDLE); 56*c8dee2aaSAndroid Build Coastguard Worker return fRenderPass; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker granularity()59*c8dee2aaSAndroid Build Coastguard Worker VkExtent2D granularity() { return fGranularity; } 60*c8dee2aaSAndroid Build Coastguard Worker getResourceType()61*c8dee2aaSAndroid Build Coastguard Worker const char* getResourceType() const override { return "Vulkan RenderPass"; } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker // Struct to store Vulkan information surrounding a RenderPassDesc 64*c8dee2aaSAndroid Build Coastguard Worker struct VulkanRenderPassMetaData { 65*c8dee2aaSAndroid Build Coastguard Worker VulkanRenderPassMetaData(const RenderPassDesc& renderPassDesc); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker bool fLoadMSAAFromResolve; 68*c8dee2aaSAndroid Build Coastguard Worker bool fHasColorAttachment; 69*c8dee2aaSAndroid Build Coastguard Worker bool fHasColorResolveAttachment; 70*c8dee2aaSAndroid Build Coastguard Worker bool fHasDepthStencilAttachment; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker int fNumColorAttachments; 73*c8dee2aaSAndroid Build Coastguard Worker int fNumResolveAttachments; 74*c8dee2aaSAndroid Build Coastguard Worker int fNumDepthStencilAttachments; 75*c8dee2aaSAndroid Build Coastguard Worker int fSubpassCount; 76*c8dee2aaSAndroid Build Coastguard Worker int fSubpassDependencyCount; 77*c8dee2aaSAndroid Build Coastguard Worker int fUint32DataCnt; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker // Accumulate attachments into a container to mimic future structure in RenderPassDesc 80*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<const AttachmentDesc*> fAttachments; 81*c8dee2aaSAndroid Build Coastguard Worker }; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker static void AddRenderPassInfoToKey(VulkanRenderPassMetaData& rpMetaData, 84*c8dee2aaSAndroid Build Coastguard Worker ResourceKey::Builder& builder, 85*c8dee2aaSAndroid Build Coastguard Worker int& builderIdx, 86*c8dee2aaSAndroid Build Coastguard Worker bool compatibleOnly); 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker private: 89*c8dee2aaSAndroid Build Coastguard Worker void freeGpuData() override; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker VulkanRenderPass(const VulkanSharedContext*, VkRenderPass, VkExtent2D granularity); 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker const VulkanSharedContext* fSharedContext; 94*c8dee2aaSAndroid Build Coastguard Worker VkRenderPass fRenderPass; 95*c8dee2aaSAndroid Build Coastguard Worker VkExtent2D fGranularity; 96*c8dee2aaSAndroid Build Coastguard Worker }; 97*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_VulkanRenderPass_DEFINED 100