blob: 09198272899449003ae4953730922b6ecea31662 [file] [log] [blame]
jvanverth992ad362016-02-26 09:21:02 -08001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/gpu/GrContext.h"
9#include "src/gpu/GrContextPriv.h"
10#include "src/gpu/GrPersistentCacheUtils.h"
11#include "src/gpu/GrShaderCaps.h"
Brian Osmanac9be9d2019-05-01 10:29:34 -040012#include "src/gpu/GrShaderUtils.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "src/gpu/GrStencilSettings.h"
14#include "src/gpu/vk/GrVkDescriptorSetManager.h"
15#include "src/gpu/vk/GrVkGpu.h"
16#include "src/gpu/vk/GrVkPipelineStateBuilder.h"
17#include "src/gpu/vk/GrVkRenderPass.h"
18#include "src/gpu/vk/GrVkRenderTarget.h"
jvanverth992ad362016-02-26 09:21:02 -080019
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050020typedef size_t shader_size;
21
egdaniel22281c12016-03-23 13:49:40 -070022GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
Brian Salomon1471df92018-06-08 10:49:00 -040023 GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050024 GrRenderTarget* renderTarget, GrSurfaceOrigin origin,
Brian Salomonff168d92018-06-23 15:17:27 -040025 const GrPrimitiveProcessor& primProc,
Greg Daniel9a51a862018-11-30 10:18:14 -050026 const GrTextureProxy* const primProcProxies[],
Brian Salomon1471df92018-06-08 10:49:00 -040027 const GrPipeline& pipeline,
28 const GrStencilSettings& stencil,
Brian Salomon1471df92018-06-08 10:49:00 -040029 GrPrimitiveType primitiveType,
30 Desc* desc,
Greg Daniel99b88e02018-10-03 15:31:20 -040031 VkRenderPass compatibleRenderPass) {
jvanverth992ad362016-02-26 09:21:02 -080032 // create a builder. This will be handed off to effects so they can use it to add
33 // uniforms, varyings, textures, etc
Robert Phillipsd0fe8752019-01-31 14:13:59 -050034 GrVkPipelineStateBuilder builder(gpu, renderTarget, origin, pipeline, primProc,
35 primProcProxies, desc);
jvanverth992ad362016-02-26 09:21:02 -080036
Ethan Nicholas2983f402017-05-08 09:36:08 -040037 if (!builder.emitAndInstallProcs()) {
jvanverth992ad362016-02-26 09:21:02 -080038 return nullptr;
39 }
40
Greg Daniel99b88e02018-10-03 15:31:20 -040041 return builder.finalize(stencil, primitiveType, compatibleRenderPass, desc);
jvanverth992ad362016-02-26 09:21:02 -080042}
43
egdaniel22281c12016-03-23 13:49:40 -070044GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050045 GrRenderTarget* renderTarget,
46 GrSurfaceOrigin origin,
egdaniel22281c12016-03-23 13:49:40 -070047 const GrPipeline& pipeline,
48 const GrPrimitiveProcessor& primProc,
Greg Daniel9a51a862018-11-30 10:18:14 -050049 const GrTextureProxy* const primProcProxies[],
Ethan Nicholas38657112017-02-09 17:01:22 -050050 GrProgramDesc* desc)
Robert Phillipsd0fe8752019-01-31 14:13:59 -050051 : INHERITED(renderTarget, origin, primProc, primProcProxies, pipeline, desc)
Brian Salomonff168d92018-06-23 15:17:27 -040052 , fGpu(gpu)
53 , fVaryingHandler(this)
54 , fUniformHandler(this) {}
jvanverth992ad362016-02-26 09:21:02 -080055
egdaniel22281c12016-03-23 13:49:40 -070056const GrCaps* GrVkPipelineStateBuilder::caps() const {
jvanverth992ad362016-02-26 09:21:02 -080057 return fGpu->caps();
58}
jvanverth992ad362016-02-26 09:21:02 -080059
Brian Salomon99938a82016-11-21 13:41:08 -050060void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050061 outputColor.addLayoutQualifier("location = 0, index = 0");
jvanverth992ad362016-02-26 09:21:02 -080062}
63
Brian Salomon99938a82016-11-21 13:41:08 -050064void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050065 outputColor.addLayoutQualifier("location = 0, index = 1");
egdanield632bb42016-03-30 12:06:48 -070066}
67
Ethan Nicholas941e7e22016-12-12 15:33:30 -050068bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -040069 const SkSL::String& sksl,
egdaniel22281c12016-03-23 13:49:40 -070070 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -050071 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -050072 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050073 Desc* desc,
74 SkSL::String* outSPIRV,
75 SkSL::Program::Inputs* outInputs) {
Brian Osmanfd7657c2019-04-25 11:34:07 -040076 if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050077 stageInfo, settings, outSPIRV, outInputs)) {
78 return false;
79 }
80 if (outInputs->fRTHeight) {
81 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
82 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050083 return true;
84}
85
86bool GrVkPipelineStateBuilder::installVkShaderModule(VkShaderStageFlagBits stage,
87 const GrGLSLShaderBuilder& builder,
88 VkShaderModule* shaderModule,
89 VkPipelineShaderStageCreateInfo* stageInfo,
90 SkSL::String spirv,
91 SkSL::Program::Inputs inputs) {
92 if (!GrInstallVkShaderModule(fGpu, spirv, stage, shaderModule, stageInfo)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -050093 return false;
94 }
Greg Daniele6ab9982018-08-22 13:56:32 +000095 if (inputs.fRTHeight) {
96 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
Ethan Nicholas941e7e22016-12-12 15:33:30 -050097 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050098 return true;
99}
100
Brian Osmana085a412019-04-25 09:44:43 -0400101static constexpr SkFourByteTag kSPIRV_Tag = SkSetFourByteTag('S', 'P', 'R', 'V');
Brian Osmanfd7657c2019-04-25 11:34:07 -0400102static constexpr SkFourByteTag kSKSL_Tag = SkSetFourByteTag('S', 'K', 'S', 'L');
Brian Osmana085a412019-04-25 09:44:43 -0400103
Brian Osmana66081d2019-09-03 14:59:26 -0400104int GrVkPipelineStateBuilder::loadShadersFromCache(SkReader32* cached,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400105 VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500106 VkPipelineShaderStageCreateInfo* outStageInfo) {
Brian Osmana5a010b2019-04-08 15:01:32 -0400107 SkSL::String shaders[kGrShaderTypeCount];
108 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500109
Brian Osmana66081d2019-09-03 14:59:26 -0400110 GrPersistentCacheUtils::UnpackCachedShaders(cached, shaders, inputs, kGrShaderTypeCount);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500111
112 SkAssertResult(this->installVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
113 fVS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400114 &outShaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500115 &outStageInfo[0],
Brian Osmana5a010b2019-04-08 15:01:32 -0400116 shaders[kVertex_GrShaderType],
117 inputs[kVertex_GrShaderType]));
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500118
119 SkAssertResult(this->installVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
120 fFS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400121 &outShaderModules[kFragment_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500122 &outStageInfo[1],
Brian Osmana5a010b2019-04-08 15:01:32 -0400123 shaders[kFragment_GrShaderType],
124 inputs[kFragment_GrShaderType]));
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500125
Brian Osmana5a010b2019-04-08 15:01:32 -0400126 if (!shaders[kGeometry_GrShaderType].empty()) {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500127 SkAssertResult(this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
128 fGS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400129 &outShaderModules[kGeometry_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500130 &outStageInfo[2],
Brian Osmana5a010b2019-04-08 15:01:32 -0400131 shaders[kGeometry_GrShaderType],
132 inputs[kGeometry_GrShaderType]));
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500133 return 3;
134 } else {
135 return 2;
Ethan Nicholas38657112017-02-09 17:01:22 -0500136 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500137}
138
Brian Osmana5a010b2019-04-08 15:01:32 -0400139void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
Brian Osmanfd7657c2019-04-25 11:34:07 -0400140 const SkSL::Program::Inputs inputs[],
Brian Osmaned58e002019-09-06 14:42:43 -0400141 bool isSkSL,
142 const SkSL::Program::Settings& settings) {
Greg Daniela870b462019-01-08 15:49:46 -0500143 Desc* desc = static_cast<Desc*>(this->desc());
Greg Daniela870b462019-01-08 15:49:46 -0500144 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc->asKey(), desc->shaderKeyLength());
Brian Osmanfd7657c2019-04-25 11:34:07 -0400145 sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
146 shaders,
Brian Osmaned58e002019-09-06 14:42:43 -0400147 inputs, kGrShaderTypeCount,
148 &settings);
Brian Osmana5a010b2019-04-08 15:01:32 -0400149 this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data);
jvanverth992ad362016-02-26 09:21:02 -0800150}
151
csmartdaltonc633abb2016-11-01 08:55:55 -0700152GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& stencil,
153 GrPrimitiveType primitiveType,
Greg Daniel99b88e02018-10-03 15:31:20 -0400154 VkRenderPass compatibleRenderPass,
Brian Salomon1471df92018-06-08 10:49:00 -0400155 Desc* desc) {
Brian Salomon662ea4b2018-07-12 14:53:49 -0400156 VkDescriptorSetLayout dsLayout[2];
jvanverth992ad362016-02-26 09:21:02 -0800157 VkPipelineLayout pipelineLayout;
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400158 VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
159 VK_NULL_HANDLE,
160 VK_NULL_HANDLE };
jvanverth992ad362016-02-26 09:21:02 -0800161
egdaniel707bbd62016-07-26 07:19:47 -0700162 GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
Jim Van Verth684d7ce2016-11-17 13:30:22 -0500163 // These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
egdaniel707bbd62016-07-26 07:19:47 -0700164 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
165
166 GrVkDescriptorSetManager::Handle samplerDSHandle;
Greg Daniela7543782017-05-02 14:01:43 -0400167 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
168 fUniformHandler, &samplerDSHandle);
egdaniel707bbd62016-07-26 07:19:47 -0700169 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
170 resourceProvider.getSamplerDSLayout(samplerDSHandle);
jvanverth992ad362016-02-26 09:21:02 -0800171
172 // Create the VkPipelineLayout
173 VkPipelineLayoutCreateInfo layoutCreateInfo;
174 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
175 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
176 layoutCreateInfo.pNext = 0;
177 layoutCreateInfo.flags = 0;
Brian Salomon662ea4b2018-07-12 14:53:49 -0400178 layoutCreateInfo.setLayoutCount = 2;
jvanverth992ad362016-02-26 09:21:02 -0800179 layoutCreateInfo.pSetLayouts = dsLayout;
180 layoutCreateInfo.pushConstantRangeCount = 0;
181 layoutCreateInfo.pPushConstantRanges = nullptr;
182
183 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreatePipelineLayout(fGpu->device(),
184 &layoutCreateInfo,
185 nullptr,
186 &pipelineLayout));
187
188 // We need to enable the following extensions so that the compiler can correctly make spir-v
189 // from our glsl shaders.
190 fVS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
191 fFS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
192 fVS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
193 fFS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
194
195 this->finalizeShaders();
196
Greg Daniel852d7152017-05-08 12:10:12 -0400197 VkPipelineShaderStageCreateInfo shaderStageInfo[3];
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500198 SkSL::Program::Settings settings;
Ethan Nicholase4682862017-07-18 14:08:18 -0400199 settings.fCaps = this->caps()->shaderCaps();
Ethan Nicholas0be34802019-08-15 12:36:58 -0400200 settings.fVkCaps = &this->gpu()->vkCaps();
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500201 settings.fFlipY = this->origin() != kTopLeft_GrSurfaceOrigin;
Robert Phillipsc1541ae2019-02-04 12:05:37 -0500202 settings.fSharpenTextures =
Robert Phillips9da87e02019-02-04 13:26:26 -0500203 this->gpu()->getContext()->priv().options().fSharpenMipmappedTextures;
Ethan Nicholas0be34802019-08-15 12:36:58 -0400204 settings.fRTHeightOffset = fUniformHandler.getRTHeightOffset();
Brian Salomondc092132018-04-04 10:14:16 -0400205 SkASSERT(!this->fragColorIsInOut());
jvanverth992ad362016-02-26 09:21:02 -0800206
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500207 sk_sp<SkData> cached;
Brian Osmana66081d2019-09-03 14:59:26 -0400208 SkReader32 reader;
209 SkFourByteTag shaderType = 0;
Robert Phillips9da87e02019-02-04 13:26:26 -0500210 auto persistentCache = fGpu->getContext()->priv().getPersistentCache();
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500211 if (persistentCache) {
Greg Daniela870b462019-01-08 15:49:46 -0500212 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc->asKey(), desc->shaderKeyLength());
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500213 cached = persistentCache->load(*key);
Brian Osmana66081d2019-09-03 14:59:26 -0400214 if (cached) {
215 reader.setMemory(cached->data(), cached->size());
216 shaderType = reader.readU32();
217 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400218 }
219
Brian Osmana66081d2019-09-03 14:59:26 -0400220 int numShaderStages = 0;
221 if (kSPIRV_Tag == shaderType) {
222 numShaderStages = this->loadShadersFromCache(&reader, shaderModules, shaderStageInfo);
223 } else {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500224 numShaderStages = 2; // We always have at least vertex and fragment stages.
Brian Osmana5a010b2019-04-08 15:01:32 -0400225 SkSL::String shaders[kGrShaderTypeCount];
226 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400227
228 SkSL::String* sksl[kGrShaderTypeCount] = {
229 &fVS.fCompilerString,
230 &fGS.fCompilerString,
231 &fFS.fCompilerString,
232 };
Brian Osmanfd7657c2019-04-25 11:34:07 -0400233 SkSL::String cached_sksl[kGrShaderTypeCount];
Brian Osmana66081d2019-09-03 14:59:26 -0400234 if (kSKSL_Tag == shaderType) {
235 GrPersistentCacheUtils::UnpackCachedShaders(&reader, cached_sksl, inputs,
236 kGrShaderTypeCount);
237 for (int i = 0; i < kGrShaderTypeCount; ++i) {
238 sksl[i] = &cached_sksl[i];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400239 }
240 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400241
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400242 bool success = this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400243 *sksl[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400244 &shaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500245 &shaderStageInfo[0],
246 settings,
247 desc,
Brian Osmana5a010b2019-04-08 15:01:32 -0400248 &shaders[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400249 &inputs[kVertex_GrShaderType]);
Greg Daniel852d7152017-05-08 12:10:12 -0400250
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400251 success = success && this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
252 *sksl[kFragment_GrShaderType],
253 &shaderModules[kFragment_GrShaderType],
254 &shaderStageInfo[1],
255 settings,
256 desc,
257 &shaders[kFragment_GrShaderType],
258 &inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500259
260 if (this->primitiveProcessor().willUseGeoShader()) {
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400261 success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
262 *sksl[kGeometry_GrShaderType],
263 &shaderModules[kGeometry_GrShaderType],
264 &shaderStageInfo[2],
265 settings,
266 desc,
267 &shaders[kGeometry_GrShaderType],
268 &inputs[kGeometry_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500269 ++numShaderStages;
270 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400271
272 if (!success) {
273 for (int i = 0; i < kGrShaderTypeCount; ++i) {
274 if (shaderModules[i]) {
275 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(),
276 shaderModules[i], nullptr));
277 }
278 }
279 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
280 nullptr));
281 return nullptr;
282 }
283
Brian Osmanfd7657c2019-04-25 11:34:07 -0400284 if (persistentCache && !cached) {
285 bool isSkSL = false;
Brian Osmana66081d2019-09-03 14:59:26 -0400286 if (fGpu->getContext()->priv().options().fShaderCacheStrategy ==
287 GrContextOptions::ShaderCacheStrategy::kSkSL) {
Brian Osmanfd7657c2019-04-25 11:34:07 -0400288 for (int i = 0; i < kGrShaderTypeCount; ++i) {
Brian Osmanac9be9d2019-05-01 10:29:34 -0400289 shaders[i] = GrShaderUtils::PrettyPrint(*sksl[i]);
Brian Osmanfd7657c2019-04-25 11:34:07 -0400290 }
291 isSkSL = true;
292 }
Brian Osmaned58e002019-09-06 14:42:43 -0400293 this->storeShadersInCache(shaders, inputs, isSkSL, settings);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500294 }
295 }
Chris Daltond7291ba2019-03-07 14:17:03 -0700296 GrVkPipeline* pipeline = resourceProvider.createPipeline(
Chris Dalton6ce447a2019-06-23 18:07:38 -0600297 this->renderTarget()->numSamples(), fPrimProc, fPipeline, stencil, this->origin(),
Chris Dalton71713f62019-04-18 12:41:03 -0600298 shaderStageInfo, numShaderStages, primitiveType, compatibleRenderPass, pipelineLayout);
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400299 for (int i = 0; i < kGrShaderTypeCount; ++i) {
300 // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
301 // However this is causing a crash in certain drivers (e.g. NVidia).
302 if (shaderModules[i]) {
303 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), shaderModules[i],
304 nullptr));
305 }
Greg Daniel852d7152017-05-08 12:10:12 -0400306 }
jvanverth992ad362016-02-26 09:21:02 -0800307
308 if (!pipeline) {
309 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
310 nullptr));
jvanverth992ad362016-02-26 09:21:02 -0800311 return nullptr;
312 }
313
egdaniel22281c12016-03-23 13:49:40 -0700314 return new GrVkPipelineState(fGpu,
egdaniel22281c12016-03-23 13:49:40 -0700315 pipeline,
egdaniel707bbd62016-07-26 07:19:47 -0700316 samplerDSHandle,
egdaniel22281c12016-03-23 13:49:40 -0700317 fUniformHandles,
318 fUniformHandler.fUniforms,
Ethan Nicholas0be34802019-08-15 12:36:58 -0400319 fUniformHandler.fCurrentUBOOffset,
Greg Daniel7a82edf2018-12-04 10:54:34 -0500320 fUniformHandler.fSamplers,
Robert Phillips369e8b72017-08-01 16:13:04 -0400321 std::move(fGeometryProcessor),
322 std::move(fXferProcessor),
Brian Salomon4d3f5172018-06-07 14:42:52 -0400323 std::move(fFragmentProcessors),
324 fFragmentProcessorCnt);
jvanverth992ad362016-02-26 09:21:02 -0800325}
egdaniel707bbd62016-07-26 07:19:47 -0700326
Brian Salomon1471df92018-06-08 10:49:00 -0400327//////////////////////////////////////////////////////////////////////////////
328
Brian Salomon1471df92018-06-08 10:49:00 -0400329bool GrVkPipelineStateBuilder::Desc::Build(Desc* desc,
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500330 GrRenderTarget* renderTarget,
Brian Salomon1471df92018-06-08 10:49:00 -0400331 const GrPrimitiveProcessor& primProc,
332 const GrPipeline& pipeline,
333 const GrStencilSettings& stencil,
334 GrPrimitiveType primitiveType,
Greg Daniel7a82edf2018-12-04 10:54:34 -0500335 GrVkGpu* gpu) {
Chris Daltond7291ba2019-03-07 14:17:03 -0700336 if (!INHERITED::Build(desc, renderTarget, primProc,
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500337 primitiveType == GrPrimitiveType::kPoints, pipeline, gpu)) {
Brian Salomon1471df92018-06-08 10:49:00 -0400338 return false;
339 }
340
341 GrProcessorKeyBuilder b(&desc->key());
Greg Daniela870b462019-01-08 15:49:46 -0500342
343 b.add32(GrVkGpu::kShader_PersistentCacheKeyType);
344 int keyLength = desc->key().count();
345 SkASSERT(0 == (keyLength % 4));
346 desc->fShaderKeyLength = SkToU32(keyLength);
347
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500348 GrVkRenderTarget* vkRT = (GrVkRenderTarget*)renderTarget;
Brian Salomon1471df92018-06-08 10:49:00 -0400349 vkRT->simpleRenderPass()->genKey(&b);
350
351 stencil.genKey(&b);
352
Jim Van Verth1223e7f2019-02-28 17:38:35 -0500353 b.add32(pipeline.getBlendInfoKey());
Brian Salomon1471df92018-06-08 10:49:00 -0400354
355 b.add32((uint32_t)primitiveType);
356
357 return true;
358}