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