blob: 980e6acb873b73d4f611be7a551191b4cf85faf7 [file] [log] [blame]
egdaniel22281c12016-03-23 13:49:40 -07001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/gpu/vk/GrVkTypes.h"
12#include "src/gpu/GrPipeline.h"
13#include "src/gpu/GrProgramDesc.h"
14#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
15#include "src/gpu/vk/GrVkPipelineState.h"
16#include "src/gpu/vk/GrVkUniformHandler.h"
17#include "src/gpu/vk/GrVkVaryingHandler.h"
18#include "src/sksl/SkSLCompiler.h"
egdaniel22281c12016-03-23 13:49:40 -070019
egdaniel22281c12016-03-23 13:49:40 -070020class GrVkGpu;
21class GrVkRenderPass;
Brian Osmana66081d2019-09-03 14:59:26 -040022class SkReader32;
egdaniel22281c12016-03-23 13:49:40 -070023
24class GrVkPipelineStateBuilder : public GrGLSLProgramBuilder {
25public:
Brian Salomon1471df92018-06-08 10:49:00 -040026 /**
27 * For Vulkan we want to cache the entire VkPipeline for reuse of draws. The Desc here holds all
28 * the information needed to differentiate one pipeline from another.
29 *
30 * The GrProgramDesc contains all the information need to create the actual shaders for the
31 * pipeline.
32 *
33 * For Vulkan we need to add to the GrProgramDesc to include the rest of the state on the
34 * pipline. This includes stencil settings, blending information, render pass format, draw face
35 * information, and primitive type. Note that some state is set dynamically on the pipeline for
36 * each draw and thus is not included in this descriptor. This includes the viewport, scissor,
37 * and blend constant.
38 */
39 class Desc : public GrProgramDesc {
40 public:
41 static bool Build(Desc*,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050042 GrRenderTarget*,
Brian Salomon1471df92018-06-08 10:49:00 -040043 const GrPrimitiveProcessor&,
44 const GrPipeline&,
45 const GrStencilSettings&,
46 GrPrimitiveType primitiveType,
Greg Daniel7a82edf2018-12-04 10:54:34 -050047 GrVkGpu* gpu);
Brian Salomon1471df92018-06-08 10:49:00 -040048
Greg Daniela870b462019-01-08 15:49:46 -050049 size_t shaderKeyLength() const { return fShaderKeyLength; }
50
Brian Salomon1471df92018-06-08 10:49:00 -040051 private:
Greg Daniela870b462019-01-08 15:49:46 -050052 size_t fShaderKeyLength;
53
Brian Salomon1471df92018-06-08 10:49:00 -040054 typedef GrProgramDesc INHERITED;
55 };
56
egdaniel22281c12016-03-23 13:49:40 -070057 /** Generates a pipeline state.
58 *
59 * The GrVkPipelineState implements what is specified in the GrPipeline and GrPrimitiveProcessor
60 * as input. After successful generation, the builder result objects are available to be used.
Ethan Nicholas38657112017-02-09 17:01:22 -050061 * This function may modify the program key by setting the surface origin key to 0 (unspecified)
62 * if it turns out the program does not care about the surface origin.
egdaniel22281c12016-03-23 13:49:40 -070063 * @return true if generation was successful.
64 */
65 static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050066 GrRenderTarget*, GrSurfaceOrigin,
Brian Salomonff168d92018-06-23 15:17:27 -040067 const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050068 const GrTextureProxy* const primProcProxies[],
egdaniel22281c12016-03-23 13:49:40 -070069 const GrPipeline&,
csmartdaltonc633abb2016-11-01 08:55:55 -070070 const GrStencilSettings&,
egdaniel22281c12016-03-23 13:49:40 -070071 GrPrimitiveType,
Brian Salomon1471df92018-06-08 10:49:00 -040072 Desc*,
Greg Daniel99b88e02018-10-03 15:31:20 -040073 VkRenderPass compatibleRenderPass);
egdaniel22281c12016-03-23 13:49:40 -070074
75 const GrCaps* caps() const override;
egdaniel22281c12016-03-23 13:49:40 -070076
77 GrVkGpu* gpu() const { return fGpu; }
78
Brian Salomon99938a82016-11-21 13:41:08 -050079 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
80 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
egdaniel22281c12016-03-23 13:49:40 -070081
82private:
Robert Phillipsd0fe8752019-01-31 14:13:59 -050083 GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, GrSurfaceOrigin,
egdaniel22281c12016-03-23 13:49:40 -070084 const GrPipeline&,
85 const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050086 const GrTextureProxy* const primProcProxies[],
Ethan Nicholas38657112017-02-09 17:01:22 -050087 GrProgramDesc*);
egdaniel22281c12016-03-23 13:49:40 -070088
csmartdaltonc633abb2016-11-01 08:55:55 -070089 GrVkPipelineState* finalize(const GrStencilSettings&,
90 GrPrimitiveType primitiveType,
Greg Daniel99b88e02018-10-03 15:31:20 -040091 VkRenderPass compatibleRenderPass,
Brian Salomon1471df92018-06-08 10:49:00 -040092 Desc*);
egdaniel22281c12016-03-23 13:49:40 -070093
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050094 // returns number of shader stages
Brian Osmana66081d2019-09-03 14:59:26 -040095 int loadShadersFromCache(SkReader32* cached, VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050096 VkPipelineShaderStageCreateInfo* outStageInfo);
97
Brian Osmanfd7657c2019-04-25 11:34:07 -040098 void storeShadersInCache(const SkSL::String shaders[], const SkSL::Program::Inputs inputs[],
Brian Osman4524e842019-09-24 16:03:41 -040099 bool isSkSL);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500100
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500101 bool createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400102 const SkSL::String& sksl,
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500103 VkShaderModule* shaderModule,
104 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -0500105 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500106 Desc* desc,
107 SkSL::String* outSPIRV,
108 SkSL::Program::Inputs* outInputs);
109
110 bool installVkShaderModule(VkShaderStageFlagBits stage,
111 const GrGLSLShaderBuilder& builder,
112 VkShaderModule* shaderModule,
113 VkPipelineShaderStageCreateInfo* stageInfo,
114 SkSL::String spirv,
115 SkSL::Program::Inputs inputs);
egdaniel22281c12016-03-23 13:49:40 -0700116
117 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
118 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
119 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
120
121 GrVkGpu* fGpu;
Brian Salomon1471df92018-06-08 10:49:00 -0400122 GrVkVaryingHandler fVaryingHandler;
123 GrVkUniformHandler fUniformHandler;
egdaniel22281c12016-03-23 13:49:40 -0700124
125 typedef GrGLSLProgramBuilder INHERITED;
126};
127
128#endif