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