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