xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkPipelineStateBuilder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2 * Copyright 2016 Google Inc.
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 GrVkPipelineStateBuilder_DEFINED
9 #define GrVkPipelineStateBuilder_DEFINED
10 
11 #include "include/core/SkString.h"
12 #include "include/private/gpu/vk/SkiaVulkan.h"
13 #include "src/gpu/ganesh/glsl/GrGLSLProgramBuilder.h"
14 #include "src/gpu/ganesh/glsl/GrGLSLShaderBuilder.h"
15 #include "src/gpu/ganesh/vk/GrVkUniformHandler.h"
16 #include "src/gpu/ganesh/vk/GrVkVaryingHandler.h"
17 #include "src/sksl/ir/SkSLProgram.h"
18 
19 #include <string>
20 
21 class GrCaps;
22 class GrGLSLUniformHandler;
23 class GrGLSLVaryingHandler;
24 class GrProgramDesc;
25 class GrProgramInfo;
26 class GrShaderVar;
27 class GrVkGpu;
28 class GrVkPipelineState;
29 class SkReadBuffer;
30 namespace SkSL {
31 struct ProgramSettings;
32 }
33 
34 class GrVkPipelineStateBuilder : public GrGLSLProgramBuilder {
35 public:
36     /** Generates a pipeline state.
37      *
38      * The return GrVkPipelineState implements the supplied GrProgramInfo.
39      *
40      * @return the created pipeline if generation was successful; nullptr otherwise
41      */
42     static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
43                                                   const GrProgramDesc&,
44                                                   const GrProgramInfo&,
45                                                   VkRenderPass compatibleRenderPass,
46                                                   bool overrideSubpassForResolveLoad);
47 
48     const GrCaps* caps() const override;
49 
gpu()50     GrVkGpu* gpu() const { return fGpu; }
51 
52     void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
53 
54 private:
55     GrVkPipelineStateBuilder(GrVkGpu*, const GrProgramDesc&, const GrProgramInfo&);
56 
57     GrVkPipelineState* finalize(const GrProgramDesc&, VkRenderPass compatibleRenderPass,
58                                 bool overrideSupbassForResolveLoad);
59 
60     // returns number of shader stages
61     int loadShadersFromCache(SkReadBuffer* cached, VkShaderModule outShaderModules[],
62                              VkPipelineShaderStageCreateInfo* outStageInfo);
63 
64     void storeShadersInCache(const std::string shaders[],
65                              const SkSL::Program::Interface[],
66                              bool isSkSL);
67 
68     bool createVkShaderModule(VkShaderStageFlagBits stage,
69                               const std::string& sksl,
70                               VkShaderModule* shaderModule,
71                               VkPipelineShaderStageCreateInfo* stageInfo,
72                               const SkSL::ProgramSettings& settings,
73                               std::string* outSPIRV,
74                               SkSL::Program::Interface* outInterface);
75 
76     bool installVkShaderModule(VkShaderStageFlagBits stage,
77                                const GrGLSLShaderBuilder& builder,
78                                VkShaderModule* shaderModule,
79                                VkPipelineShaderStageCreateInfo* stageInfo,
80                                std::string spirv,
81                                SkSL::Program::Interface);
82 
uniformHandler()83     GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
uniformHandler()84     const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
varyingHandler()85     GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
86 
87     GrVkGpu* fGpu;
88     GrVkVaryingHandler fVaryingHandler;
89     GrVkUniformHandler fUniformHandler;
90 
91     using INHERITED = GrGLSLProgramBuilder;
92 };
93 
94 #endif
95