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