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/GrPipeline.h"
13 #include "src/gpu/glsl/GrGLSLProgramBuilder.h"
14 #include "src/gpu/vk/GrVkPipelineState.h"
15 #include "src/gpu/vk/GrVkUniformHandler.h"
16 #include "src/gpu/vk/GrVkVaryingHandler.h"
17 #include "src/sksl/SkSLCompiler.h"
18 
19 class GrProgramDesc;
20 class GrVkGpu;
21 class GrVkRenderPass;
22 class SkReader32;
23 
24 class GrVkPipelineStateBuilder : public GrGLSLProgramBuilder {
25 public:
26     /** Generates a pipeline state.
27      *
28      * The GrVkPipelineState implements what is specified in the GrPipeline and GrPrimitiveProcessor
29      * as input. After successful generation, the builder result objects are available to be used.
30      * @return the created pipeline if generation was successful; nullptr otherwise
31      */
32     static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
33                                                   GrRenderTarget*,
34                                                   const GrProgramDesc&,
35                                                   const GrProgramInfo&,
36                                                   VkRenderPass compatibleRenderPass);
37 
38     const GrCaps* caps() const override;
39 
gpu()40     GrVkGpu* gpu() const { return fGpu; }
41 
42     void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
43     void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
44 
45 private:
46     GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, const GrProgramDesc&, const GrProgramInfo&);
47 
48     GrVkPipelineState* finalize(const GrProgramDesc&, VkRenderPass compatibleRenderPass);
49 
50     // returns number of shader stages
51     int loadShadersFromCache(SkReader32* cached, VkShaderModule outShaderModules[],
52                              VkPipelineShaderStageCreateInfo* outStageInfo);
53 
54     void storeShadersInCache(const SkSL::String shaders[], const SkSL::Program::Inputs inputs[],
55                              bool isSkSL);
56 
57     bool createVkShaderModule(VkShaderStageFlagBits stage,
58                               const SkSL::String& sksl,
59                               VkShaderModule* shaderModule,
60                               VkPipelineShaderStageCreateInfo* stageInfo,
61                               const SkSL::Program::Settings& settings,
62                               SkSL::String* outSPIRV,
63                               SkSL::Program::Inputs* outInputs);
64 
65     bool installVkShaderModule(VkShaderStageFlagBits stage,
66                                const GrGLSLShaderBuilder& builder,
67                                VkShaderModule* shaderModule,
68                                VkPipelineShaderStageCreateInfo* stageInfo,
69                                SkSL::String spirv,
70                                SkSL::Program::Inputs inputs);
71 
uniformHandler()72     GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
uniformHandler()73     const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
varyingHandler()74     GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
75 
76     GrVkGpu* fGpu;
77     GrVkVaryingHandler fVaryingHandler;
78     GrVkUniformHandler fUniformHandler;
79 
80     typedef GrGLSLProgramBuilder INHERITED;
81 };
82 
83 #endif
84