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