2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef GrVkPipelineStateBuilder_DEFINED
9 #define GrVkPipelineStateBuilder_DEFINED
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"
24 class GrVkPipelineStateBuilder : public GrGLSLProgramBuilder {
26 /** Generates a pipeline state.
28 * The return GrVkPipelineState implements the supplied GrProgramInfo.
30 * @return the created pipeline if generation was successful; nullptr otherwise
32 static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
35 VkRenderPass compatibleRenderPass,
36 bool overrideSubpassForResolveLoad);
38 const GrCaps* caps() const override;
40 GrVkGpu* gpu() const { return fGpu; }
42 SkSL::Compiler* shaderCompiler() const override;
44 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
45 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
48 GrVkPipelineStateBuilder(GrVkGpu*, const GrProgramDesc&, const GrProgramInfo&);
50 GrVkPipelineState* finalize(const GrProgramDesc&, VkRenderPass compatibleRenderPass,
51 bool overrideSupbassForResolveLoad);
53 // returns number of shader stages
54 int loadShadersFromCache(SkReadBuffer* cached, VkShaderModule outShaderModules[],
55 VkPipelineShaderStageCreateInfo* outStageInfo);
57 void storeShadersInCache(const std::string shaders[], const SkSL::Program::Inputs inputs[],
60 bool createVkShaderModule(VkShaderStageFlagBits stage,
61 const std::string& sksl,
62 VkShaderModule* shaderModule,
63 VkPipelineShaderStageCreateInfo* stageInfo,
64 const SkSL::Program::Settings& settings,
65 std::string* outSPIRV,
66 SkSL::Program::Inputs* outInputs);
68 bool installVkShaderModule(VkShaderStageFlagBits stage,
69 const GrGLSLShaderBuilder& builder,
70 VkShaderModule* shaderModule,
71 VkPipelineShaderStageCreateInfo* stageInfo,
73 SkSL::Program::Inputs inputs);
75 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
76 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
77 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
80 GrVkVaryingHandler fVaryingHandler;
81 GrVkUniformHandler fUniformHandler;
83 using INHERITED = GrGLSLProgramBuilder;