blob: 88777ae68a2f5c639c51e0c4709151c6e205251d [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
Greg Daniel37fd6582020-09-14 12:36:09 -04008#include "src/gpu/vk/GrVkPipelineStateBuilder.h"
9
Adlai Holler3d0359a2020-07-09 15:35:55 -040010#include "include/gpu/GrDirectContext.h"
Brian Osman43542fc2020-04-02 10:38:16 -040011#include "src/core/SkTraceEvent.h"
Ethan Nicholasb6538132019-10-22 16:00:18 -040012#include "src/gpu/GrAutoLocaleSetter.h"
Adlai Hollera0693042020-10-14 11:23:11 -040013#include "src/gpu/GrDirectContextPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrPersistentCacheUtils.h"
15#include "src/gpu/GrShaderCaps.h"
Brian Osmanac9be9d2019-05-01 10:29:34 -040016#include "src/gpu/GrShaderUtils.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "src/gpu/GrStencilSettings.h"
18#include "src/gpu/vk/GrVkDescriptorSetManager.h"
19#include "src/gpu/vk/GrVkGpu.h"
Greg Daniel3ef052c2021-01-05 12:20:27 -050020#include "src/gpu/vk/GrVkPipeline.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "src/gpu/vk/GrVkRenderPass.h"
22#include "src/gpu/vk/GrVkRenderTarget.h"
jvanverth992ad362016-02-26 09:21:02 -080023
egdaniel22281c12016-03-23 13:49:40 -070024GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
Brian Salomon1471df92018-06-08 10:49:00 -040025 GrVkGpu* gpu,
Robert Phillips65a77752019-10-02 15:22:24 -040026 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000027 const GrProgramDesc& desc,
Robert Phillips901aff02019-10-08 12:32:56 -040028 const GrProgramInfo& programInfo,
Greg Daniel91b37b12021-01-05 15:40:54 -050029 VkRenderPass compatibleRenderPass,
30 bool overrideSubpassForResolveLoad) {
Robert Phillipsf497c362020-05-12 10:35:18 -040031
32 gpu->stats()->incShaderCompilations();
33
Ethan Nicholasb6538132019-10-22 16:00:18 -040034 // ensure that we use "." as a decimal separator when creating SkSL code
35 GrAutoLocaleSetter als("C");
36
jvanverth992ad362016-02-26 09:21:02 -080037 // create a builder. This will be handed off to effects so they can use it to add
38 // uniforms, varyings, textures, etc
Stephen Whiteb1857852020-02-07 15:33:23 +000039 GrVkPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
jvanverth992ad362016-02-26 09:21:02 -080040
Ethan Nicholas2983f402017-05-08 09:36:08 -040041 if (!builder.emitAndInstallProcs()) {
jvanverth992ad362016-02-26 09:21:02 -080042 return nullptr;
43 }
44
Greg Daniel91b37b12021-01-05 15:40:54 -050045 return builder.finalize(desc, compatibleRenderPass, overrideSubpassForResolveLoad);
jvanverth992ad362016-02-26 09:21:02 -080046}
47
egdaniel22281c12016-03-23 13:49:40 -070048GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050049 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000050 const GrProgramDesc& desc,
51 const GrProgramInfo& programInfo)
52 : INHERITED(renderTarget, desc, programInfo)
Brian Salomonff168d92018-06-23 15:17:27 -040053 , fGpu(gpu)
54 , fVaryingHandler(this)
55 , fUniformHandler(this) {}
jvanverth992ad362016-02-26 09:21:02 -080056
egdaniel22281c12016-03-23 13:49:40 -070057const GrCaps* GrVkPipelineStateBuilder::caps() const {
jvanverth992ad362016-02-26 09:21:02 -080058 return fGpu->caps();
59}
jvanverth992ad362016-02-26 09:21:02 -080060
Ethan Nicholasee9cb6a2021-02-02 11:59:09 -050061SkSL::Compiler* GrVkPipelineStateBuilder::shaderCompiler() const {
62 return fGpu->shaderCompiler();
63}
64
Brian Salomon99938a82016-11-21 13:41:08 -050065void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050066 outputColor.addLayoutQualifier("location = 0, index = 0");
jvanverth992ad362016-02-26 09:21:02 -080067}
68
Brian Salomon99938a82016-11-21 13:41:08 -050069void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050070 outputColor.addLayoutQualifier("location = 0, index = 1");
egdanield632bb42016-03-30 12:06:48 -070071}
72
Ethan Nicholas941e7e22016-12-12 15:33:30 -050073bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -040074 const SkSL::String& sksl,
egdaniel22281c12016-03-23 13:49:40 -070075 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -050076 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -050077 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050078 SkSL::String* outSPIRV,
79 SkSL::Program::Inputs* outInputs) {
Brian Osmanfd7657c2019-04-25 11:34:07 -040080 if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050081 stageInfo, settings, outSPIRV, outInputs)) {
82 return false;
83 }
84 if (outInputs->fRTHeight) {
85 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
86 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050087 return true;
88}
89
90bool GrVkPipelineStateBuilder::installVkShaderModule(VkShaderStageFlagBits stage,
91 const GrGLSLShaderBuilder& builder,
92 VkShaderModule* shaderModule,
93 VkPipelineShaderStageCreateInfo* stageInfo,
94 SkSL::String spirv,
95 SkSL::Program::Inputs inputs) {
96 if (!GrInstallVkShaderModule(fGpu, spirv, stage, shaderModule, stageInfo)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -050097 return false;
98 }
Greg Daniele6ab9982018-08-22 13:56:32 +000099 if (inputs.fRTHeight) {
100 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500101 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500102 return true;
103}
104
Brian Osmana085a412019-04-25 09:44:43 -0400105static constexpr SkFourByteTag kSPIRV_Tag = SkSetFourByteTag('S', 'P', 'R', 'V');
Brian Osmanfd7657c2019-04-25 11:34:07 -0400106static constexpr SkFourByteTag kSKSL_Tag = SkSetFourByteTag('S', 'K', 'S', 'L');
Brian Osmana085a412019-04-25 09:44:43 -0400107
Brian Osman9e4e4c72020-06-10 07:19:34 -0400108int GrVkPipelineStateBuilder::loadShadersFromCache(SkReadBuffer* cached,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400109 VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500110 VkPipelineShaderStageCreateInfo* outStageInfo) {
Brian Osmana5a010b2019-04-08 15:01:32 -0400111 SkSL::String shaders[kGrShaderTypeCount];
112 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500113
Brian Osman9e4e4c72020-06-10 07:19:34 -0400114 if (!GrPersistentCacheUtils::UnpackCachedShaders(cached, shaders, inputs, kGrShaderTypeCount)) {
115 return 0;
116 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500117
Brian Osman9e4e4c72020-06-10 07:19:34 -0400118 bool success = this->installVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500119 fVS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400120 &outShaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500121 &outStageInfo[0],
Brian Osmana5a010b2019-04-08 15:01:32 -0400122 shaders[kVertex_GrShaderType],
Brian Osman9e4e4c72020-06-10 07:19:34 -0400123 inputs[kVertex_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500124
Brian Osman9e4e4c72020-06-10 07:19:34 -0400125 success = success && this->installVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
126 fFS,
127 &outShaderModules[kFragment_GrShaderType],
128 &outStageInfo[1],
129 shaders[kFragment_GrShaderType],
130 inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500131
Brian Osmana5a010b2019-04-08 15:01:32 -0400132 if (!shaders[kGeometry_GrShaderType].empty()) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400133 success = success && this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
134 fGS,
135 &outShaderModules[kGeometry_GrShaderType],
136 &outStageInfo[2],
137 shaders[kGeometry_GrShaderType],
138 inputs[kGeometry_GrShaderType]);
Ethan Nicholas38657112017-02-09 17:01:22 -0500139 }
Brian Osman9e4e4c72020-06-10 07:19:34 -0400140
141 if (!success) {
142 for (int i = 0; i < kGrShaderTypeCount; ++i) {
143 if (outShaderModules[i]) {
144 GR_VK_CALL(fGpu->vkInterface(),
145 DestroyShaderModule(fGpu->device(), outShaderModules[i], nullptr));
146 }
147 }
148 return 0;
149 }
150 return shaders[kGeometry_GrShaderType].empty() ? 2 : 3;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500151}
152
Brian Osmana5a010b2019-04-08 15:01:32 -0400153void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
Brian Osmanfd7657c2019-04-25 11:34:07 -0400154 const SkSL::Program::Inputs inputs[],
Brian Osman4524e842019-09-24 16:03:41 -0400155 bool isSkSL) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400156 // Here we shear off the Vk-specific portion of the Desc in order to create the
157 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
158 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500159 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
160 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000161 sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
162 this->desc().initialKeyLength()+4);
Robert Phillips03e4c952019-11-26 16:20:22 -0500163
Brian Osmanfd7657c2019-04-25 11:34:07 -0400164 sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
165 shaders,
Brian Osman4524e842019-09-24 16:03:41 -0400166 inputs, kGrShaderTypeCount);
Brian Osmana5a010b2019-04-08 15:01:32 -0400167 this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data);
jvanverth992ad362016-02-26 09:21:02 -0800168}
169
Stephen Whiteb1857852020-02-07 15:33:23 +0000170GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrProgramDesc& desc,
Greg Daniel91b37b12021-01-05 15:40:54 -0500171 VkRenderPass compatibleRenderPass,
172 bool overrideSubpassForResolveLoad) {
Brian Osman43542fc2020-04-02 10:38:16 -0400173 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
174
Greg Daniel37fd6582020-09-14 12:36:09 -0400175 VkDescriptorSetLayout dsLayout[GrVkUniformHandler::kDescSetCount];
jvanverth992ad362016-02-26 09:21:02 -0800176 VkPipelineLayout pipelineLayout;
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400177 VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
178 VK_NULL_HANDLE,
179 VK_NULL_HANDLE };
jvanverth992ad362016-02-26 09:21:02 -0800180
egdaniel707bbd62016-07-26 07:19:47 -0700181 GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
Jim Van Verth684d7ce2016-11-17 13:30:22 -0500182 // These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
egdaniel707bbd62016-07-26 07:19:47 -0700183 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
184
185 GrVkDescriptorSetManager::Handle samplerDSHandle;
Greg Daniela7543782017-05-02 14:01:43 -0400186 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
187 fUniformHandler, &samplerDSHandle);
egdaniel707bbd62016-07-26 07:19:47 -0700188 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
189 resourceProvider.getSamplerDSLayout(samplerDSHandle);
jvanverth992ad362016-02-26 09:21:02 -0800190
Greg Daniel37fd6582020-09-14 12:36:09 -0400191 dsLayout[GrVkUniformHandler::kInputDescSet] = resourceProvider.getInputDSLayout();
192
Greg Daniel8cc5f192020-10-02 10:45:43 -0400193 bool usesInput = SkToBool(fProgramInfo.renderPassBarriers() & GrXferBarrierFlags::kTexture);
Greg Daniel37fd6582020-09-14 12:36:09 -0400194 uint32_t layoutCount =
195 usesInput ? GrVkUniformHandler::kDescSetCount : (GrVkUniformHandler::kDescSetCount - 1);
jvanverth992ad362016-02-26 09:21:02 -0800196 // Create the VkPipelineLayout
197 VkPipelineLayoutCreateInfo layoutCreateInfo;
198 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
199 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
John Stilesfe0de302020-08-14 10:52:06 -0400200 layoutCreateInfo.pNext = nullptr;
jvanverth992ad362016-02-26 09:21:02 -0800201 layoutCreateInfo.flags = 0;
Greg Daniel37fd6582020-09-14 12:36:09 -0400202 layoutCreateInfo.setLayoutCount = layoutCount;
jvanverth992ad362016-02-26 09:21:02 -0800203 layoutCreateInfo.pSetLayouts = dsLayout;
204 layoutCreateInfo.pushConstantRangeCount = 0;
205 layoutCreateInfo.pPushConstantRanges = nullptr;
206
Greg Daniel95f0b162019-11-11 13:42:30 -0500207 VkResult result;
208 GR_VK_CALL_RESULT(fGpu, result, CreatePipelineLayout(fGpu->device(), &layoutCreateInfo, nullptr,
209 &pipelineLayout));
210 if (result != VK_SUCCESS) {
211 return nullptr;
212 }
jvanverth992ad362016-02-26 09:21:02 -0800213
214 // We need to enable the following extensions so that the compiler can correctly make spir-v
215 // from our glsl shaders.
216 fVS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
217 fFS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
218 fVS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
219 fFS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
220
221 this->finalizeShaders();
222
Greg Daniel852d7152017-05-08 12:10:12 -0400223 VkPipelineShaderStageCreateInfo shaderStageInfo[3];
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500224 SkSL::Program::Settings settings;
Greg Daniel49f920e2020-04-16 10:33:39 -0400225 settings.fRTHeightBinding = this->gpu()->vkCaps().getFragmentUniformBinding();
226 settings.fRTHeightSet = this->gpu()->vkCaps().getFragmentUniformSet();
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500227 settings.fFlipY = this->origin() != kTopLeft_GrSurfaceOrigin;
Robert Phillipsc1541ae2019-02-04 12:05:37 -0500228 settings.fSharpenTextures =
Robert Phillips9da87e02019-02-04 13:26:26 -0500229 this->gpu()->getContext()->priv().options().fSharpenMipmappedTextures;
Ethan Nicholas0be34802019-08-15 12:36:58 -0400230 settings.fRTHeightOffset = fUniformHandler.getRTHeightOffset();
Brian Salomondc092132018-04-04 10:14:16 -0400231 SkASSERT(!this->fragColorIsInOut());
jvanverth992ad362016-02-26 09:21:02 -0800232
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500233 sk_sp<SkData> cached;
Brian Osman9e4e4c72020-06-10 07:19:34 -0400234 SkReadBuffer reader;
Brian Osmana66081d2019-09-03 14:59:26 -0400235 SkFourByteTag shaderType = 0;
Robert Phillips9da87e02019-02-04 13:26:26 -0500236 auto persistentCache = fGpu->getContext()->priv().getPersistentCache();
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500237 if (persistentCache) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400238 // Here we shear off the Vk-specific portion of the Desc in order to create the
239 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
240 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500241 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
242 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000243 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength()+4);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500244 cached = persistentCache->load(*key);
Brian Osmana66081d2019-09-03 14:59:26 -0400245 if (cached) {
246 reader.setMemory(cached->data(), cached->size());
Brian Osman1facd5e2020-03-16 16:21:24 -0400247 shaderType = GrPersistentCacheUtils::GetType(&reader);
Brian Osmana66081d2019-09-03 14:59:26 -0400248 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400249 }
250
Brian Osmana66081d2019-09-03 14:59:26 -0400251 int numShaderStages = 0;
252 if (kSPIRV_Tag == shaderType) {
253 numShaderStages = this->loadShadersFromCache(&reader, shaderModules, shaderStageInfo);
Brian Osman9e4e4c72020-06-10 07:19:34 -0400254 }
255
256 // Proceed from sources if we didn't get a SPIRV cache (or the cache was invalid)
257 if (!numShaderStages) {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500258 numShaderStages = 2; // We always have at least vertex and fragment stages.
Brian Osmana5a010b2019-04-08 15:01:32 -0400259 SkSL::String shaders[kGrShaderTypeCount];
260 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400261
262 SkSL::String* sksl[kGrShaderTypeCount] = {
263 &fVS.fCompilerString,
264 &fGS.fCompilerString,
265 &fFS.fCompilerString,
266 };
Brian Osmanfd7657c2019-04-25 11:34:07 -0400267 SkSL::String cached_sksl[kGrShaderTypeCount];
Brian Osmana66081d2019-09-03 14:59:26 -0400268 if (kSKSL_Tag == shaderType) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400269 if (GrPersistentCacheUtils::UnpackCachedShaders(&reader, cached_sksl, inputs,
270 kGrShaderTypeCount)) {
271 for (int i = 0; i < kGrShaderTypeCount; ++i) {
272 sksl[i] = &cached_sksl[i];
273 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400274 }
275 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400276
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400277 bool success = this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400278 *sksl[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400279 &shaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500280 &shaderStageInfo[0],
281 settings,
Brian Osmana5a010b2019-04-08 15:01:32 -0400282 &shaders[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400283 &inputs[kVertex_GrShaderType]);
Greg Daniel852d7152017-05-08 12:10:12 -0400284
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400285 success = success && this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
286 *sksl[kFragment_GrShaderType],
287 &shaderModules[kFragment_GrShaderType],
288 &shaderStageInfo[1],
289 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400290 &shaders[kFragment_GrShaderType],
291 &inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500292
293 if (this->primitiveProcessor().willUseGeoShader()) {
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400294 success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
295 *sksl[kGeometry_GrShaderType],
296 &shaderModules[kGeometry_GrShaderType],
297 &shaderStageInfo[2],
298 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400299 &shaders[kGeometry_GrShaderType],
300 &inputs[kGeometry_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500301 ++numShaderStages;
302 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400303
304 if (!success) {
305 for (int i = 0; i < kGrShaderTypeCount; ++i) {
306 if (shaderModules[i]) {
307 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(),
308 shaderModules[i], nullptr));
309 }
310 }
311 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
312 nullptr));
313 return nullptr;
314 }
315
Brian Osmanfd7657c2019-04-25 11:34:07 -0400316 if (persistentCache && !cached) {
317 bool isSkSL = false;
Brian Osmana66081d2019-09-03 14:59:26 -0400318 if (fGpu->getContext()->priv().options().fShaderCacheStrategy ==
319 GrContextOptions::ShaderCacheStrategy::kSkSL) {
Brian Osmanfd7657c2019-04-25 11:34:07 -0400320 for (int i = 0; i < kGrShaderTypeCount; ++i) {
Brian Osmanac9be9d2019-05-01 10:29:34 -0400321 shaders[i] = GrShaderUtils::PrettyPrint(*sksl[i]);
Brian Osmanfd7657c2019-04-25 11:34:07 -0400322 }
323 isSkSL = true;
324 }
Brian Osman4524e842019-09-24 16:03:41 -0400325 this->storeShadersInCache(shaders, inputs, isSkSL);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500326 }
327 }
Robert Phillipsa87c5292019-11-12 10:12:42 -0500328
Greg Daniel91b37b12021-01-05 15:40:54 -0500329 // For the vast majority of cases we only have one subpass so we default piplines to subpass 0.
330 // However, if we need to load a resolve into msaa attachment for discardable msaa then the
331 // main subpass will be 1.
332 uint32_t subpass = 0;
333 if (overrideSubpassForResolveLoad ||
334 (fProgramInfo.colorLoadOp() == GrLoadOp::kLoad &&
335 fProgramInfo.targetSupportsVkResolveLoad() &&
336 fGpu->vkCaps().preferDiscardableMSAAAttachment())) {
337 subpass = 1;
338 }
Greg Daniel3ef052c2021-01-05 12:20:27 -0500339 sk_sp<const GrVkPipeline> pipeline = resourceProvider.makePipeline(
Greg Daniel91b37b12021-01-05 15:40:54 -0500340 fProgramInfo, shaderStageInfo, numShaderStages, compatibleRenderPass, pipelineLayout,
341 subpass);
342
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400343 for (int i = 0; i < kGrShaderTypeCount; ++i) {
344 // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
345 // However this is causing a crash in certain drivers (e.g. NVidia).
346 if (shaderModules[i]) {
347 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), shaderModules[i],
348 nullptr));
349 }
Greg Daniel852d7152017-05-08 12:10:12 -0400350 }
jvanverth992ad362016-02-26 09:21:02 -0800351
352 if (!pipeline) {
353 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
354 nullptr));
jvanverth992ad362016-02-26 09:21:02 -0800355 return nullptr;
356 }
357
egdaniel22281c12016-03-23 13:49:40 -0700358 return new GrVkPipelineState(fGpu,
Greg Daniel3ef052c2021-01-05 12:20:27 -0500359 std::move(pipeline),
egdaniel707bbd62016-07-26 07:19:47 -0700360 samplerDSHandle,
egdaniel22281c12016-03-23 13:49:40 -0700361 fUniformHandles,
362 fUniformHandler.fUniforms,
Ethan Nicholas0be34802019-08-15 12:36:58 -0400363 fUniformHandler.fCurrentUBOOffset,
Greg Daniel7a82edf2018-12-04 10:54:34 -0500364 fUniformHandler.fSamplers,
Robert Phillips369e8b72017-08-01 16:13:04 -0400365 std::move(fGeometryProcessor),
366 std::move(fXferProcessor),
Brian Salomon61a70fb2020-07-08 19:02:54 -0400367 std::move(fFragmentProcessors));
jvanverth992ad362016-02-26 09:21:02 -0800368}