blob: c144833ee6d5fe7eba30ae731aa52c2157541e8e [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "src/gpu/GrContextPriv.h"
14#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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "src/gpu/vk/GrVkRenderPass.h"
21#include "src/gpu/vk/GrVkRenderTarget.h"
jvanverth992ad362016-02-26 09:21:02 -080022
egdaniel22281c12016-03-23 13:49:40 -070023GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
Brian Salomon1471df92018-06-08 10:49:00 -040024 GrVkGpu* gpu,
Robert Phillips65a77752019-10-02 15:22:24 -040025 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000026 const GrProgramDesc& desc,
Robert Phillips901aff02019-10-08 12:32:56 -040027 const GrProgramInfo& programInfo,
Greg Daniel99b88e02018-10-03 15:31:20 -040028 VkRenderPass compatibleRenderPass) {
Robert Phillipsf497c362020-05-12 10:35:18 -040029
30 gpu->stats()->incShaderCompilations();
31
Ethan Nicholasb6538132019-10-22 16:00:18 -040032 // ensure that we use "." as a decimal separator when creating SkSL code
33 GrAutoLocaleSetter als("C");
34
jvanverth992ad362016-02-26 09:21:02 -080035 // create a builder. This will be handed off to effects so they can use it to add
36 // uniforms, varyings, textures, etc
Stephen Whiteb1857852020-02-07 15:33:23 +000037 GrVkPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
jvanverth992ad362016-02-26 09:21:02 -080038
Ethan Nicholas2983f402017-05-08 09:36:08 -040039 if (!builder.emitAndInstallProcs()) {
jvanverth992ad362016-02-26 09:21:02 -080040 return nullptr;
41 }
42
Stephen Whiteb1857852020-02-07 15:33:23 +000043 return builder.finalize(desc, compatibleRenderPass);
jvanverth992ad362016-02-26 09:21:02 -080044}
45
egdaniel22281c12016-03-23 13:49:40 -070046GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050047 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000048 const GrProgramDesc& desc,
49 const GrProgramInfo& programInfo)
50 : INHERITED(renderTarget, desc, programInfo)
Brian Salomonff168d92018-06-23 15:17:27 -040051 , fGpu(gpu)
52 , fVaryingHandler(this)
53 , fUniformHandler(this) {}
jvanverth992ad362016-02-26 09:21:02 -080054
egdaniel22281c12016-03-23 13:49:40 -070055const GrCaps* GrVkPipelineStateBuilder::caps() const {
jvanverth992ad362016-02-26 09:21:02 -080056 return fGpu->caps();
57}
jvanverth992ad362016-02-26 09:21:02 -080058
Brian Salomon99938a82016-11-21 13:41:08 -050059void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050060 outputColor.addLayoutQualifier("location = 0, index = 0");
jvanverth992ad362016-02-26 09:21:02 -080061}
62
Brian Salomon99938a82016-11-21 13:41:08 -050063void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050064 outputColor.addLayoutQualifier("location = 0, index = 1");
egdanield632bb42016-03-30 12:06:48 -070065}
66
Ethan Nicholas941e7e22016-12-12 15:33:30 -050067bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -040068 const SkSL::String& sksl,
egdaniel22281c12016-03-23 13:49:40 -070069 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -050070 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -050071 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050072 SkSL::String* outSPIRV,
73 SkSL::Program::Inputs* outInputs) {
Brian Osmanfd7657c2019-04-25 11:34:07 -040074 if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050075 stageInfo, settings, outSPIRV, outInputs)) {
76 return false;
77 }
78 if (outInputs->fRTHeight) {
79 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
80 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050081 return true;
82}
83
84bool GrVkPipelineStateBuilder::installVkShaderModule(VkShaderStageFlagBits stage,
85 const GrGLSLShaderBuilder& builder,
86 VkShaderModule* shaderModule,
87 VkPipelineShaderStageCreateInfo* stageInfo,
88 SkSL::String spirv,
89 SkSL::Program::Inputs inputs) {
90 if (!GrInstallVkShaderModule(fGpu, spirv, stage, shaderModule, stageInfo)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -050091 return false;
92 }
Greg Daniele6ab9982018-08-22 13:56:32 +000093 if (inputs.fRTHeight) {
94 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
Ethan Nicholas941e7e22016-12-12 15:33:30 -050095 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050096 return true;
97}
98
Brian Osmana085a412019-04-25 09:44:43 -040099static constexpr SkFourByteTag kSPIRV_Tag = SkSetFourByteTag('S', 'P', 'R', 'V');
Brian Osmanfd7657c2019-04-25 11:34:07 -0400100static constexpr SkFourByteTag kSKSL_Tag = SkSetFourByteTag('S', 'K', 'S', 'L');
Brian Osmana085a412019-04-25 09:44:43 -0400101
Brian Osman9e4e4c72020-06-10 07:19:34 -0400102int GrVkPipelineStateBuilder::loadShadersFromCache(SkReadBuffer* cached,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400103 VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500104 VkPipelineShaderStageCreateInfo* outStageInfo) {
Brian Osmana5a010b2019-04-08 15:01:32 -0400105 SkSL::String shaders[kGrShaderTypeCount];
106 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500107
Brian Osman9e4e4c72020-06-10 07:19:34 -0400108 if (!GrPersistentCacheUtils::UnpackCachedShaders(cached, shaders, inputs, kGrShaderTypeCount)) {
109 return 0;
110 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500111
Brian Osman9e4e4c72020-06-10 07:19:34 -0400112 bool success = this->installVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500113 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],
Brian Osman9e4e4c72020-06-10 07:19:34 -0400117 inputs[kVertex_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500118
Brian Osman9e4e4c72020-06-10 07:19:34 -0400119 success = success && this->installVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
120 fFS,
121 &outShaderModules[kFragment_GrShaderType],
122 &outStageInfo[1],
123 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()) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400127 success = success && this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
128 fGS,
129 &outShaderModules[kGeometry_GrShaderType],
130 &outStageInfo[2],
131 shaders[kGeometry_GrShaderType],
132 inputs[kGeometry_GrShaderType]);
Ethan Nicholas38657112017-02-09 17:01:22 -0500133 }
Brian Osman9e4e4c72020-06-10 07:19:34 -0400134
135 if (!success) {
136 for (int i = 0; i < kGrShaderTypeCount; ++i) {
137 if (outShaderModules[i]) {
138 GR_VK_CALL(fGpu->vkInterface(),
139 DestroyShaderModule(fGpu->device(), outShaderModules[i], nullptr));
140 }
141 }
142 return 0;
143 }
144 return shaders[kGeometry_GrShaderType].empty() ? 2 : 3;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500145}
146
Brian Osmana5a010b2019-04-08 15:01:32 -0400147void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
Brian Osmanfd7657c2019-04-25 11:34:07 -0400148 const SkSL::Program::Inputs inputs[],
Brian Osman4524e842019-09-24 16:03:41 -0400149 bool isSkSL) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400150 // Here we shear off the Vk-specific portion of the Desc in order to create the
151 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
152 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500153 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
154 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000155 sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
156 this->desc().initialKeyLength()+4);
Robert Phillips03e4c952019-11-26 16:20:22 -0500157
Brian Osmanfd7657c2019-04-25 11:34:07 -0400158 sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
159 shaders,
Brian Osman4524e842019-09-24 16:03:41 -0400160 inputs, kGrShaderTypeCount);
Brian Osmana5a010b2019-04-08 15:01:32 -0400161 this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data);
jvanverth992ad362016-02-26 09:21:02 -0800162}
163
Stephen Whiteb1857852020-02-07 15:33:23 +0000164GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrProgramDesc& desc,
165 VkRenderPass compatibleRenderPass) {
Brian Osman43542fc2020-04-02 10:38:16 -0400166 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
167
Greg Daniel37fd6582020-09-14 12:36:09 -0400168 VkDescriptorSetLayout dsLayout[GrVkUniformHandler::kDescSetCount];
jvanverth992ad362016-02-26 09:21:02 -0800169 VkPipelineLayout pipelineLayout;
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400170 VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
171 VK_NULL_HANDLE,
172 VK_NULL_HANDLE };
jvanverth992ad362016-02-26 09:21:02 -0800173
egdaniel707bbd62016-07-26 07:19:47 -0700174 GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
Jim Van Verth684d7ce2016-11-17 13:30:22 -0500175 // These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
egdaniel707bbd62016-07-26 07:19:47 -0700176 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
177
178 GrVkDescriptorSetManager::Handle samplerDSHandle;
Greg Daniela7543782017-05-02 14:01:43 -0400179 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
180 fUniformHandler, &samplerDSHandle);
egdaniel707bbd62016-07-26 07:19:47 -0700181 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
182 resourceProvider.getSamplerDSLayout(samplerDSHandle);
jvanverth992ad362016-02-26 09:21:02 -0800183
Greg Daniel37fd6582020-09-14 12:36:09 -0400184 dsLayout[GrVkUniformHandler::kInputDescSet] = resourceProvider.getInputDSLayout();
185
186 bool usesInput = fProgramInfo.pipeline().usesInputAttachment();
187 uint32_t layoutCount =
188 usesInput ? GrVkUniformHandler::kDescSetCount : (GrVkUniformHandler::kDescSetCount - 1);
jvanverth992ad362016-02-26 09:21:02 -0800189 // Create the VkPipelineLayout
190 VkPipelineLayoutCreateInfo layoutCreateInfo;
191 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
192 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
John Stilesfe0de302020-08-14 10:52:06 -0400193 layoutCreateInfo.pNext = nullptr;
jvanverth992ad362016-02-26 09:21:02 -0800194 layoutCreateInfo.flags = 0;
Greg Daniel37fd6582020-09-14 12:36:09 -0400195 layoutCreateInfo.setLayoutCount = layoutCount;
jvanverth992ad362016-02-26 09:21:02 -0800196 layoutCreateInfo.pSetLayouts = dsLayout;
197 layoutCreateInfo.pushConstantRangeCount = 0;
198 layoutCreateInfo.pPushConstantRanges = nullptr;
199
Greg Daniel95f0b162019-11-11 13:42:30 -0500200 VkResult result;
201 GR_VK_CALL_RESULT(fGpu, result, CreatePipelineLayout(fGpu->device(), &layoutCreateInfo, nullptr,
202 &pipelineLayout));
203 if (result != VK_SUCCESS) {
204 return nullptr;
205 }
jvanverth992ad362016-02-26 09:21:02 -0800206
207 // We need to enable the following extensions so that the compiler can correctly make spir-v
208 // from our glsl shaders.
209 fVS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
210 fFS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
211 fVS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
212 fFS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
213
214 this->finalizeShaders();
215
Greg Daniel852d7152017-05-08 12:10:12 -0400216 VkPipelineShaderStageCreateInfo shaderStageInfo[3];
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500217 SkSL::Program::Settings settings;
Ethan Nicholase4682862017-07-18 14:08:18 -0400218 settings.fCaps = this->caps()->shaderCaps();
Greg Daniel49f920e2020-04-16 10:33:39 -0400219 settings.fRTHeightBinding = this->gpu()->vkCaps().getFragmentUniformBinding();
220 settings.fRTHeightSet = this->gpu()->vkCaps().getFragmentUniformSet();
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500221 settings.fFlipY = this->origin() != kTopLeft_GrSurfaceOrigin;
Robert Phillipsc1541ae2019-02-04 12:05:37 -0500222 settings.fSharpenTextures =
Robert Phillips9da87e02019-02-04 13:26:26 -0500223 this->gpu()->getContext()->priv().options().fSharpenMipmappedTextures;
Ethan Nicholas0be34802019-08-15 12:36:58 -0400224 settings.fRTHeightOffset = fUniformHandler.getRTHeightOffset();
Brian Salomondc092132018-04-04 10:14:16 -0400225 SkASSERT(!this->fragColorIsInOut());
jvanverth992ad362016-02-26 09:21:02 -0800226
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500227 sk_sp<SkData> cached;
Brian Osman9e4e4c72020-06-10 07:19:34 -0400228 SkReadBuffer reader;
Brian Osmana66081d2019-09-03 14:59:26 -0400229 SkFourByteTag shaderType = 0;
Robert Phillips9da87e02019-02-04 13:26:26 -0500230 auto persistentCache = fGpu->getContext()->priv().getPersistentCache();
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500231 if (persistentCache) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400232 // Here we shear off the Vk-specific portion of the Desc in order to create the
233 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
234 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500235 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
236 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000237 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength()+4);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500238 cached = persistentCache->load(*key);
Brian Osmana66081d2019-09-03 14:59:26 -0400239 if (cached) {
240 reader.setMemory(cached->data(), cached->size());
Brian Osman1facd5e2020-03-16 16:21:24 -0400241 shaderType = GrPersistentCacheUtils::GetType(&reader);
Brian Osmana66081d2019-09-03 14:59:26 -0400242 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400243 }
244
Brian Osmana66081d2019-09-03 14:59:26 -0400245 int numShaderStages = 0;
246 if (kSPIRV_Tag == shaderType) {
247 numShaderStages = this->loadShadersFromCache(&reader, shaderModules, shaderStageInfo);
Brian Osman9e4e4c72020-06-10 07:19:34 -0400248 }
249
250 // Proceed from sources if we didn't get a SPIRV cache (or the cache was invalid)
251 if (!numShaderStages) {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500252 numShaderStages = 2; // We always have at least vertex and fragment stages.
Brian Osmana5a010b2019-04-08 15:01:32 -0400253 SkSL::String shaders[kGrShaderTypeCount];
254 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400255
256 SkSL::String* sksl[kGrShaderTypeCount] = {
257 &fVS.fCompilerString,
258 &fGS.fCompilerString,
259 &fFS.fCompilerString,
260 };
Brian Osmanfd7657c2019-04-25 11:34:07 -0400261 SkSL::String cached_sksl[kGrShaderTypeCount];
Brian Osmana66081d2019-09-03 14:59:26 -0400262 if (kSKSL_Tag == shaderType) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400263 if (GrPersistentCacheUtils::UnpackCachedShaders(&reader, cached_sksl, inputs,
264 kGrShaderTypeCount)) {
265 for (int i = 0; i < kGrShaderTypeCount; ++i) {
266 sksl[i] = &cached_sksl[i];
267 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400268 }
269 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400270
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400271 bool success = this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400272 *sksl[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400273 &shaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500274 &shaderStageInfo[0],
275 settings,
Brian Osmana5a010b2019-04-08 15:01:32 -0400276 &shaders[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400277 &inputs[kVertex_GrShaderType]);
Greg Daniel852d7152017-05-08 12:10:12 -0400278
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400279 success = success && this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
280 *sksl[kFragment_GrShaderType],
281 &shaderModules[kFragment_GrShaderType],
282 &shaderStageInfo[1],
283 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400284 &shaders[kFragment_GrShaderType],
285 &inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500286
287 if (this->primitiveProcessor().willUseGeoShader()) {
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400288 success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
289 *sksl[kGeometry_GrShaderType],
290 &shaderModules[kGeometry_GrShaderType],
291 &shaderStageInfo[2],
292 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400293 &shaders[kGeometry_GrShaderType],
294 &inputs[kGeometry_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500295 ++numShaderStages;
296 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400297
298 if (!success) {
299 for (int i = 0; i < kGrShaderTypeCount; ++i) {
300 if (shaderModules[i]) {
301 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(),
302 shaderModules[i], nullptr));
303 }
304 }
305 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
306 nullptr));
307 return nullptr;
308 }
309
Brian Osmanfd7657c2019-04-25 11:34:07 -0400310 if (persistentCache && !cached) {
311 bool isSkSL = false;
Brian Osmana66081d2019-09-03 14:59:26 -0400312 if (fGpu->getContext()->priv().options().fShaderCacheStrategy ==
313 GrContextOptions::ShaderCacheStrategy::kSkSL) {
Brian Osmanfd7657c2019-04-25 11:34:07 -0400314 for (int i = 0; i < kGrShaderTypeCount; ++i) {
Brian Osmanac9be9d2019-05-01 10:29:34 -0400315 shaders[i] = GrShaderUtils::PrettyPrint(*sksl[i]);
Brian Osmanfd7657c2019-04-25 11:34:07 -0400316 }
317 isSkSL = true;
318 }
Brian Osman4524e842019-09-24 16:03:41 -0400319 this->storeShadersInCache(shaders, inputs, isSkSL);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500320 }
321 }
Robert Phillipsa87c5292019-11-12 10:12:42 -0500322
323 GrVkPipeline* pipeline = resourceProvider.createPipeline(fProgramInfo, shaderStageInfo,
324 numShaderStages, compatibleRenderPass,
325 pipelineLayout);
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400326 for (int i = 0; i < kGrShaderTypeCount; ++i) {
327 // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
328 // However this is causing a crash in certain drivers (e.g. NVidia).
329 if (shaderModules[i]) {
330 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), shaderModules[i],
331 nullptr));
332 }
Greg Daniel852d7152017-05-08 12:10:12 -0400333 }
jvanverth992ad362016-02-26 09:21:02 -0800334
335 if (!pipeline) {
336 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
337 nullptr));
jvanverth992ad362016-02-26 09:21:02 -0800338 return nullptr;
339 }
340
egdaniel22281c12016-03-23 13:49:40 -0700341 return new GrVkPipelineState(fGpu,
egdaniel22281c12016-03-23 13:49:40 -0700342 pipeline,
egdaniel707bbd62016-07-26 07:19:47 -0700343 samplerDSHandle,
egdaniel22281c12016-03-23 13:49:40 -0700344 fUniformHandles,
345 fUniformHandler.fUniforms,
Ethan Nicholas0be34802019-08-15 12:36:58 -0400346 fUniformHandler.fCurrentUBOOffset,
Greg Daniel7a82edf2018-12-04 10:54:34 -0500347 fUniformHandler.fSamplers,
Robert Phillips369e8b72017-08-01 16:13:04 -0400348 std::move(fGeometryProcessor),
349 std::move(fXferProcessor),
Brian Salomon61a70fb2020-07-08 19:02:54 -0400350 std::move(fFragmentProcessors));
jvanverth992ad362016-02-26 09:21:02 -0800351}