xref: /aosp_15_r20/external/skia/src/gpu/graphite/vk/VulkanGraphicsPipeline.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_VulkanGraphicsPipeline_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_VulkanGraphicsPipeline_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Blend.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GraphicsPipeline.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanGraphiteUtilsPriv.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/vk/VulkanSampler.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL {
22*c8dee2aaSAndroid Build Coastguard Worker     class Compiler;
23*c8dee2aaSAndroid Build Coastguard Worker }
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker class Attribute;
28*c8dee2aaSAndroid Build Coastguard Worker class GraphicsPipelineDesc;
29*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary;
30*c8dee2aaSAndroid Build Coastguard Worker class VulkanResourceProvider;
31*c8dee2aaSAndroid Build Coastguard Worker class VulkanSharedContext;
32*c8dee2aaSAndroid Build Coastguard Worker struct RenderPassDesc;
33*c8dee2aaSAndroid Build Coastguard Worker class TextureInfo;
34*c8dee2aaSAndroid Build Coastguard Worker class VulkanRenderPass;
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker class VulkanGraphicsPipeline final : public GraphicsPipeline {
37*c8dee2aaSAndroid Build Coastguard Worker public:
38*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kIntrinsicUniformBufferIndex = 0;
39*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kRenderStepUniformBufferIndex = 1;
40*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kPaintUniformBufferIndex = 2;
41*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kGradientBufferIndex = 3;
42*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kNumUniformBuffers = 4;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     // For now, rigidly assign all uniform buffer descriptors to be in set 0 and all
45*c8dee2aaSAndroid Build Coastguard Worker     // texture/samplers to be in set 1.
46*c8dee2aaSAndroid Build Coastguard Worker     // TODO(b/274762935): Make the bindings and descriptor set organization more flexible.
47*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kUniformBufferDescSetIndex = 0;
48*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kTextureBindDescSetIndex = 1;
49*c8dee2aaSAndroid Build Coastguard Worker     // Currently input attachments are only used for loading MSAA from resolve, so we can use the
50*c8dee2aaSAndroid Build Coastguard Worker     // descriptor set index normally assigned to uniform desc sets.
51*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kInputAttachmentDescSetIndex = kUniformBufferDescSetIndex;
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kVertexBufferIndex = 0;
54*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kInstanceBufferIndex = 1;
55*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kNumInputBuffers = 2;
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     inline static const DescriptorData kIntrinsicUniformBufferDescriptor = {
58*c8dee2aaSAndroid Build Coastguard Worker             DescriptorType::kUniformBuffer, /*count=*/1,
59*c8dee2aaSAndroid Build Coastguard Worker             kIntrinsicUniformBufferIndex,
60*c8dee2aaSAndroid Build Coastguard Worker             PipelineStageFlags::kVertexShader | PipelineStageFlags::kFragmentShader};
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     // Currently we only ever have one input attachment descriptor by itself within a set, so its
63*c8dee2aaSAndroid Build Coastguard Worker     // binding index will always be 0.
64*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr unsigned int kInputAttachmentBindingIndex = 0;
65*c8dee2aaSAndroid Build Coastguard Worker     inline static const DescriptorData kInputAttachmentDescriptor = {
66*c8dee2aaSAndroid Build Coastguard Worker             DescriptorType::kInputAttachment, /*count=*/1,
67*c8dee2aaSAndroid Build Coastguard Worker             kInputAttachmentBindingIndex,
68*c8dee2aaSAndroid Build Coastguard Worker             PipelineStageFlags::kFragmentShader};
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<VulkanGraphicsPipeline> Make(VulkanResourceProvider*,
71*c8dee2aaSAndroid Build Coastguard Worker                                               const RuntimeEffectDictionary*,
72*c8dee2aaSAndroid Build Coastguard Worker                                               const GraphicsPipelineDesc&,
73*c8dee2aaSAndroid Build Coastguard Worker                                               const RenderPassDesc&,
74*c8dee2aaSAndroid Build Coastguard Worker                                               SkEnumBitMask<PipelineCreationFlags>);
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<VulkanGraphicsPipeline> MakeLoadMSAAPipeline(
77*c8dee2aaSAndroid Build Coastguard Worker             const VulkanSharedContext*,
78*c8dee2aaSAndroid Build Coastguard Worker             VkShaderModule vsModule,
79*c8dee2aaSAndroid Build Coastguard Worker             VkShaderModule fsModule,
80*c8dee2aaSAndroid Build Coastguard Worker             VkPipelineShaderStageCreateInfo* pipelineShaderStages,
81*c8dee2aaSAndroid Build Coastguard Worker             VkPipelineLayout,
82*c8dee2aaSAndroid Build Coastguard Worker             sk_sp<VulkanRenderPass> compatibleRenderPass,
83*c8dee2aaSAndroid Build Coastguard Worker             VkPipelineCache,
84*c8dee2aaSAndroid Build Coastguard Worker             const TextureInfo& dstColorAttachmentTexInfo);
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker     static bool InitializeMSAALoadPipelineStructs(
87*c8dee2aaSAndroid Build Coastguard Worker             const VulkanSharedContext*,
88*c8dee2aaSAndroid Build Coastguard Worker             VkShaderModule* outVertexShaderModule,
89*c8dee2aaSAndroid Build Coastguard Worker             VkShaderModule* outFragShaderModule,
90*c8dee2aaSAndroid Build Coastguard Worker             VkPipelineShaderStageCreateInfo* outShaderStageInfo,
91*c8dee2aaSAndroid Build Coastguard Worker             VkPipelineLayout* outPipelineLayout);
92*c8dee2aaSAndroid Build Coastguard Worker 
~VulkanGraphicsPipeline()93*c8dee2aaSAndroid Build Coastguard Worker     ~VulkanGraphicsPipeline() override {}
94*c8dee2aaSAndroid Build Coastguard Worker 
layout()95*c8dee2aaSAndroid Build Coastguard Worker     VkPipelineLayout layout() const {
96*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fPipelineLayout != VK_NULL_HANDLE);
97*c8dee2aaSAndroid Build Coastguard Worker         return fPipelineLayout;
98*c8dee2aaSAndroid Build Coastguard Worker     }
99*c8dee2aaSAndroid Build Coastguard Worker 
pipeline()100*c8dee2aaSAndroid Build Coastguard Worker     VkPipeline pipeline() const {
101*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fPipeline != VK_NULL_HANDLE);
102*c8dee2aaSAndroid Build Coastguard Worker         return fPipeline;
103*c8dee2aaSAndroid Build Coastguard Worker     }
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker private:
106*c8dee2aaSAndroid Build Coastguard Worker     VulkanGraphicsPipeline(const VulkanSharedContext* sharedContext,
107*c8dee2aaSAndroid Build Coastguard Worker                            const PipelineInfo& pipelineInfo,
108*c8dee2aaSAndroid Build Coastguard Worker                            VkPipelineLayout,
109*c8dee2aaSAndroid Build Coastguard Worker                            VkPipeline,
110*c8dee2aaSAndroid Build Coastguard Worker                            bool ownsPipelineLayout,
111*c8dee2aaSAndroid Build Coastguard Worker                            skia_private::TArray<sk_sp<VulkanSampler>> immutableSamplers);
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     void freeGpuData() override;
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     VkPipelineLayout fPipelineLayout = VK_NULL_HANDLE;
116*c8dee2aaSAndroid Build Coastguard Worker     VkPipeline fPipeline = VK_NULL_HANDLE;
117*c8dee2aaSAndroid Build Coastguard Worker     bool fOwnsPipelineLayout = true;
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker     // Hold a ref to immutable samplers used such that their lifetime is properly managed.
120*c8dee2aaSAndroid Build Coastguard Worker     const skia_private::TArray<sk_sp<VulkanSampler>> fImmutableSamplers;
121*c8dee2aaSAndroid Build Coastguard Worker };
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_MtlGraphicsPipeline_DEFINED
126