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 SkSL::Compiler* shaderCompiler() const override; 44 45 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override; 46 47 private: 48 GrVkPipelineStateBuilder(GrVkGpu*, const GrProgramDesc&, const GrProgramInfo&); 49 50 GrVkPipelineState* finalize(const GrProgramDesc&, VkRenderPass compatibleRenderPass, 51 bool overrideSupbassForResolveLoad); 52 53 // returns number of shader stages 54 int loadShadersFromCache(SkReadBuffer* cached, VkShaderModule outShaderModules[], 55 VkPipelineShaderStageCreateInfo* outStageInfo); 56 57 void storeShadersInCache(const std::string shaders[], const SkSL::Program::Inputs inputs[], 58 bool isSkSL); 59 60 bool createVkShaderModule(VkShaderStageFlagBits stage, 61 const std::string& sksl, 62 VkShaderModule* shaderModule, 63 VkPipelineShaderStageCreateInfo* stageInfo, 64 const SkSL::ProgramSettings& settings, 65 std::string* outSPIRV, 66 SkSL::Program::Inputs* outInputs); 67 68 bool installVkShaderModule(VkShaderStageFlagBits stage, 69 const GrGLSLShaderBuilder& builder, 70 VkShaderModule* shaderModule, 71 VkPipelineShaderStageCreateInfo* stageInfo, 72 std::string spirv, 73 SkSL::Program::Inputs inputs); 74 uniformHandler()75 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; } uniformHandler()76 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; } varyingHandler()77 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; } 78 79 GrVkGpu* fGpu; 80 GrVkVaryingHandler fVaryingHandler; 81 GrVkUniformHandler fUniformHandler; 82 83 using INHERITED = GrGLSLProgramBuilder; 84 }; 85 86 #endif 87