blob: 355d62c7d586c56f40113b4763e14ae0407074d6 [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
egdaniel22281c12016-03-23 13:49:40 -070011#include "GrPipeline.h"
Brian Salomon1471df92018-06-08 10:49:00 -040012#include "GrProgramDesc.h"
egdaniel22281c12016-03-23 13:49:40 -070013#include "GrVkPipelineState.h"
14#include "GrVkUniformHandler.h"
15#include "GrVkVaryingHandler.h"
Ethan Nicholas941e7e22016-12-12 15:33:30 -050016#include "SkSLCompiler.h"
Brian Salomon1471df92018-06-08 10:49:00 -040017#include "glsl/GrGLSLProgramBuilder.h"
Greg Daniel487132b2018-12-20 14:09:36 -050018#include "vk/GrVkTypes.h"
egdaniel22281c12016-03-23 13:49:40 -070019
egdaniel22281c12016-03-23 13:49:40 -070020class GrVkGpu;
21class GrVkRenderPass;
egdaniel22281c12016-03-23 13:49:40 -070022
23class GrVkPipelineStateBuilder : public GrGLSLProgramBuilder {
24public:
Brian Salomon1471df92018-06-08 10:49:00 -040025 /**
26 * For Vulkan we want to cache the entire VkPipeline for reuse of draws. The Desc here holds all
27 * the information needed to differentiate one pipeline from another.
28 *
29 * The GrProgramDesc contains all the information need to create the actual shaders for the
30 * pipeline.
31 *
32 * For Vulkan we need to add to the GrProgramDesc to include the rest of the state on the
33 * pipline. This includes stencil settings, blending information, render pass format, draw face
34 * information, and primitive type. Note that some state is set dynamically on the pipeline for
35 * each draw and thus is not included in this descriptor. This includes the viewport, scissor,
36 * and blend constant.
37 */
38 class Desc : public GrProgramDesc {
39 public:
40 static bool Build(Desc*,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050041 GrRenderTarget*,
Brian Salomon1471df92018-06-08 10:49:00 -040042 const GrPrimitiveProcessor&,
43 const GrPipeline&,
44 const GrStencilSettings&,
45 GrPrimitiveType primitiveType,
Greg Daniel7a82edf2018-12-04 10:54:34 -050046 GrVkGpu* gpu);
Brian Salomon1471df92018-06-08 10:49:00 -040047
Greg Daniela870b462019-01-08 15:49:46 -050048 size_t shaderKeyLength() const { return fShaderKeyLength; }
49
Brian Salomon1471df92018-06-08 10:49:00 -040050 private:
Greg Daniela870b462019-01-08 15:49:46 -050051 size_t fShaderKeyLength;
52
Brian Salomon1471df92018-06-08 10:49:00 -040053 typedef GrProgramDesc INHERITED;
54 };
55
egdaniel22281c12016-03-23 13:49:40 -070056 /** Generates a pipeline state.
57 *
58 * The GrVkPipelineState implements what is specified in the GrPipeline and GrPrimitiveProcessor
59 * as input. After successful generation, the builder result objects are available to be used.
Ethan Nicholas38657112017-02-09 17:01:22 -050060 * This function may modify the program key by setting the surface origin key to 0 (unspecified)
61 * if it turns out the program does not care about the surface origin.
egdaniel22281c12016-03-23 13:49:40 -070062 * @return true if generation was successful.
63 */
64 static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050065 GrRenderTarget*, GrSurfaceOrigin,
Brian Salomonff168d92018-06-23 15:17:27 -040066 const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050067 const GrTextureProxy* const primProcProxies[],
egdaniel22281c12016-03-23 13:49:40 -070068 const GrPipeline&,
csmartdaltonc633abb2016-11-01 08:55:55 -070069 const GrStencilSettings&,
egdaniel22281c12016-03-23 13:49:40 -070070 GrPrimitiveType,
Brian Salomon1471df92018-06-08 10:49:00 -040071 Desc*,
Greg Daniel99b88e02018-10-03 15:31:20 -040072 VkRenderPass compatibleRenderPass);
egdaniel22281c12016-03-23 13:49:40 -070073
74 const GrCaps* caps() const override;
egdaniel22281c12016-03-23 13:49:40 -070075
76 GrVkGpu* gpu() const { return fGpu; }
77
Brian Salomon99938a82016-11-21 13:41:08 -050078 void finalizeFragmentOutputColor(GrShaderVar& outputColor) override;
79 void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
egdaniel22281c12016-03-23 13:49:40 -070080
81private:
Robert Phillipsd0fe8752019-01-31 14:13:59 -050082 GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, GrSurfaceOrigin,
egdaniel22281c12016-03-23 13:49:40 -070083 const GrPipeline&,
84 const GrPrimitiveProcessor&,
Greg Daniel9a51a862018-11-30 10:18:14 -050085 const GrTextureProxy* const primProcProxies[],
Ethan Nicholas38657112017-02-09 17:01:22 -050086 GrProgramDesc*);
egdaniel22281c12016-03-23 13:49:40 -070087
csmartdaltonc633abb2016-11-01 08:55:55 -070088 GrVkPipelineState* finalize(const GrStencilSettings&,
89 GrPrimitiveType primitiveType,
Greg Daniel99b88e02018-10-03 15:31:20 -040090 VkRenderPass compatibleRenderPass,
Brian Salomon1471df92018-06-08 10:49:00 -040091 Desc*);
egdaniel22281c12016-03-23 13:49:40 -070092
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050093 // returns number of shader stages
94 int loadShadersFromCache(const SkData& cached,
95 VkShaderModule* outVertShaderModule,
96 VkShaderModule* outFragShaderModule,
97 VkShaderModule* outGeomShaderModule,
98 VkPipelineShaderStageCreateInfo* outStageInfo);
99
100 void storeShadersInCache(const SkSL::String& vert,
101 const SkSL::Program::Inputs& vertInputs,
102 const SkSL::String& frag,
103 const SkSL::Program::Inputs& fragInputs,
104 const SkSL::String& geom,
105 const SkSL::Program::Inputs& geomInputs);
106
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500107 bool createVkShaderModule(VkShaderStageFlagBits stage,
108 const GrGLSLShaderBuilder& builder,
109 VkShaderModule* shaderModule,
110 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -0500111 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500112 Desc* desc,
113 SkSL::String* outSPIRV,
114 SkSL::Program::Inputs* outInputs);
115
116 bool installVkShaderModule(VkShaderStageFlagBits stage,
117 const GrGLSLShaderBuilder& builder,
118 VkShaderModule* shaderModule,
119 VkPipelineShaderStageCreateInfo* stageInfo,
120 SkSL::String spirv,
121 SkSL::Program::Inputs inputs);
egdaniel22281c12016-03-23 13:49:40 -0700122
123 GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
124 const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
125 GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
126
127 GrVkGpu* fGpu;
Brian Salomon1471df92018-06-08 10:49:00 -0400128 GrVkVaryingHandler fVaryingHandler;
129 GrVkUniformHandler fUniformHandler;
egdaniel22281c12016-03-23 13:49:40 -0700130
131 typedef GrGLSLProgramBuilder INHERITED;
132};
133
134#endif