xref: /aosp_15_r20/external/skia/src/gpu/graphite/vk/VulkanRenderPass.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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