blob: 29cb4bb262eba2aee9ccc1c029f0782a745b4a1a [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
Adlai Holler3d0359a2020-07-09 15:35:55 -04008#include "include/gpu/GrDirectContext.h"
Brian Osman43542fc2020-04-02 10:38:16 -04009#include "src/core/SkTraceEvent.h"
Ethan Nicholasb6538132019-10-22 16:00:18 -040010#include "src/gpu/GrAutoLocaleSetter.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrContextPriv.h"
12#include "src/gpu/GrPersistentCacheUtils.h"
13#include "src/gpu/GrShaderCaps.h"
Brian Osmanac9be9d2019-05-01 10:29:34 -040014#include "src/gpu/GrShaderUtils.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/gpu/GrStencilSettings.h"
16#include "src/gpu/vk/GrVkDescriptorSetManager.h"
17#include "src/gpu/vk/GrVkGpu.h"
18#include "src/gpu/vk/GrVkPipelineStateBuilder.h"
19#include "src/gpu/vk/GrVkRenderPass.h"
20#include "src/gpu/vk/GrVkRenderTarget.h"
jvanverth992ad362016-02-26 09:21:02 -080021
egdaniel22281c12016-03-23 13:49:40 -070022GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
Brian Salomon1471df92018-06-08 10:49:00 -040023 GrVkGpu* gpu,
Robert Phillips65a77752019-10-02 15:22:24 -040024 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000025 const GrProgramDesc& desc,
Robert Phillips901aff02019-10-08 12:32:56 -040026 const GrProgramInfo& programInfo,
Greg Daniel99b88e02018-10-03 15:31:20 -040027 VkRenderPass compatibleRenderPass) {
Robert Phillipsf497c362020-05-12 10:35:18 -040028
29 gpu->stats()->incShaderCompilations();
30
Ethan Nicholasb6538132019-10-22 16:00:18 -040031 // ensure that we use "." as a decimal separator when creating SkSL code
32 GrAutoLocaleSetter als("C");
33
jvanverth992ad362016-02-26 09:21:02 -080034 // create a builder. This will be handed off to effects so they can use it to add
35 // uniforms, varyings, textures, etc
Stephen Whiteb1857852020-02-07 15:33:23 +000036 GrVkPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
jvanverth992ad362016-02-26 09:21:02 -080037
Ethan Nicholas2983f402017-05-08 09:36:08 -040038 if (!builder.emitAndInstallProcs()) {
jvanverth992ad362016-02-26 09:21:02 -080039 return nullptr;
40 }
41
Stephen Whiteb1857852020-02-07 15:33:23 +000042 return builder.finalize(desc, compatibleRenderPass);
jvanverth992ad362016-02-26 09:21:02 -080043}
44
egdaniel22281c12016-03-23 13:49:40 -070045GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050046 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000047 const GrProgramDesc& desc,
48 const GrProgramInfo& programInfo)
49 : INHERITED(renderTarget, desc, programInfo)
Brian Salomonff168d92018-06-23 15:17:27 -040050 , fGpu(gpu)
51 , fVaryingHandler(this)
52 , fUniformHandler(this) {}
jvanverth992ad362016-02-26 09:21:02 -080053
egdaniel22281c12016-03-23 13:49:40 -070054const GrCaps* GrVkPipelineStateBuilder::caps() const {
jvanverth992ad362016-02-26 09:21:02 -080055 return fGpu->caps();
56}
jvanverth992ad362016-02-26 09:21:02 -080057
Brian Salomon99938a82016-11-21 13:41:08 -050058void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050059 outputColor.addLayoutQualifier("location = 0, index = 0");
jvanverth992ad362016-02-26 09:21:02 -080060}
61
Brian Salomon99938a82016-11-21 13:41:08 -050062void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050063 outputColor.addLayoutQualifier("location = 0, index = 1");
egdanield632bb42016-03-30 12:06:48 -070064}
65
Ethan Nicholas941e7e22016-12-12 15:33:30 -050066bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -040067 const SkSL::String& sksl,
egdaniel22281c12016-03-23 13:49:40 -070068 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -050069 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -050070 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050071 SkSL::String* outSPIRV,
72 SkSL::Program::Inputs* outInputs) {
Brian Osmanfd7657c2019-04-25 11:34:07 -040073 if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050074 stageInfo, settings, outSPIRV, outInputs)) {
75 return false;
76 }
77 if (outInputs->fRTHeight) {
78 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
79 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050080 return true;
81}
82
83bool GrVkPipelineStateBuilder::installVkShaderModule(VkShaderStageFlagBits stage,
84 const GrGLSLShaderBuilder& builder,
85 VkShaderModule* shaderModule,
86 VkPipelineShaderStageCreateInfo* stageInfo,
87 SkSL::String spirv,
88 SkSL::Program::Inputs inputs) {
89 if (!GrInstallVkShaderModule(fGpu, spirv, stage, shaderModule, stageInfo)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -050090 return false;
91 }
Greg Daniele6ab9982018-08-22 13:56:32 +000092 if (inputs.fRTHeight) {
93 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
Ethan Nicholas941e7e22016-12-12 15:33:30 -050094 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050095 return true;
96}
97
Brian Osmana085a412019-04-25 09:44:43 -040098static constexpr SkFourByteTag kSPIRV_Tag = SkSetFourByteTag('S', 'P', 'R', 'V');
Brian Osmanfd7657c2019-04-25 11:34:07 -040099static constexpr SkFourByteTag kSKSL_Tag = SkSetFourByteTag('S', 'K', 'S', 'L');
Brian Osmana085a412019-04-25 09:44:43 -0400100
Brian Osman9e4e4c72020-06-10 07:19:34 -0400101int GrVkPipelineStateBuilder::loadShadersFromCache(SkReadBuffer* cached,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400102 VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500103 VkPipelineShaderStageCreateInfo* outStageInfo) {
Brian Osmana5a010b2019-04-08 15:01:32 -0400104 SkSL::String shaders[kGrShaderTypeCount];
105 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500106
Brian Osman9e4e4c72020-06-10 07:19:34 -0400107 if (!GrPersistentCacheUtils::UnpackCachedShaders(cached, shaders, inputs, kGrShaderTypeCount)) {
108 return 0;
109 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500110
Brian Osman9e4e4c72020-06-10 07:19:34 -0400111 bool success = this->installVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500112 fVS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400113 &outShaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500114 &outStageInfo[0],
Brian Osmana5a010b2019-04-08 15:01:32 -0400115 shaders[kVertex_GrShaderType],
Brian Osman9e4e4c72020-06-10 07:19:34 -0400116 inputs[kVertex_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500117
Brian Osman9e4e4c72020-06-10 07:19:34 -0400118 success = success && this->installVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
119 fFS,
120 &outShaderModules[kFragment_GrShaderType],
121 &outStageInfo[1],
122 shaders[kFragment_GrShaderType],
123 inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500124
Brian Osmana5a010b2019-04-08 15:01:32 -0400125 if (!shaders[kGeometry_GrShaderType].empty()) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400126 success = success && this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
127 fGS,
128 &outShaderModules[kGeometry_GrShaderType],
129 &outStageInfo[2],
130 shaders[kGeometry_GrShaderType],
131 inputs[kGeometry_GrShaderType]);
Ethan Nicholas38657112017-02-09 17:01:22 -0500132 }
Brian Osman9e4e4c72020-06-10 07:19:34 -0400133
134 if (!success) {
135 for (int i = 0; i < kGrShaderTypeCount; ++i) {
136 if (outShaderModules[i]) {
137 GR_VK_CALL(fGpu->vkInterface(),
138 DestroyShaderModule(fGpu->device(), outShaderModules[i], nullptr));
139 }
140 }
141 return 0;
142 }
143 return shaders[kGeometry_GrShaderType].empty() ? 2 : 3;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500144}
145
Brian Osmana5a010b2019-04-08 15:01:32 -0400146void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
Brian Osmanfd7657c2019-04-25 11:34:07 -0400147 const SkSL::Program::Inputs inputs[],
Brian Osman4524e842019-09-24 16:03:41 -0400148 bool isSkSL) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400149 // Here we shear off the Vk-specific portion of the Desc in order to create the
150 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
151 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500152 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
153 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000154 sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
155 this->desc().initialKeyLength()+4);
Robert Phillips03e4c952019-11-26 16:20:22 -0500156
Brian Osmanfd7657c2019-04-25 11:34:07 -0400157 sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
158 shaders,
Brian Osman4524e842019-09-24 16:03:41 -0400159 inputs, kGrShaderTypeCount);
Brian Osmana5a010b2019-04-08 15:01:32 -0400160 this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data);
jvanverth992ad362016-02-26 09:21:02 -0800161}
162
Stephen Whiteb1857852020-02-07 15:33:23 +0000163GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrProgramDesc& desc,
164 VkRenderPass compatibleRenderPass) {
Brian Osman43542fc2020-04-02 10:38:16 -0400165 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
166
Brian Salomon662ea4b2018-07-12 14:53:49 -0400167 VkDescriptorSetLayout dsLayout[2];
jvanverth992ad362016-02-26 09:21:02 -0800168 VkPipelineLayout pipelineLayout;
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400169 VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
170 VK_NULL_HANDLE,
171 VK_NULL_HANDLE };
jvanverth992ad362016-02-26 09:21:02 -0800172
egdaniel707bbd62016-07-26 07:19:47 -0700173 GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
Jim Van Verth684d7ce2016-11-17 13:30:22 -0500174 // These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
egdaniel707bbd62016-07-26 07:19:47 -0700175 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
176
177 GrVkDescriptorSetManager::Handle samplerDSHandle;
Greg Daniela7543782017-05-02 14:01:43 -0400178 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
179 fUniformHandler, &samplerDSHandle);
egdaniel707bbd62016-07-26 07:19:47 -0700180 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
181 resourceProvider.getSamplerDSLayout(samplerDSHandle);
jvanverth992ad362016-02-26 09:21:02 -0800182
183 // Create the VkPipelineLayout
184 VkPipelineLayoutCreateInfo layoutCreateInfo;
185 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
186 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
John Stilesfe0de302020-08-14 10:52:06 -0400187 layoutCreateInfo.pNext = nullptr;
jvanverth992ad362016-02-26 09:21:02 -0800188 layoutCreateInfo.flags = 0;
Brian Salomon662ea4b2018-07-12 14:53:49 -0400189 layoutCreateInfo.setLayoutCount = 2;
jvanverth992ad362016-02-26 09:21:02 -0800190 layoutCreateInfo.pSetLayouts = dsLayout;
191 layoutCreateInfo.pushConstantRangeCount = 0;
192 layoutCreateInfo.pPushConstantRanges = nullptr;
193
Greg Daniel95f0b162019-11-11 13:42:30 -0500194 VkResult result;
195 GR_VK_CALL_RESULT(fGpu, result, CreatePipelineLayout(fGpu->device(), &layoutCreateInfo, nullptr,
196 &pipelineLayout));
197 if (result != VK_SUCCESS) {
198 return nullptr;
199 }
jvanverth992ad362016-02-26 09:21:02 -0800200
201 // We need to enable the following extensions so that the compiler can correctly make spir-v
202 // from our glsl shaders.
203 fVS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
204 fFS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
205 fVS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
206 fFS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
207
208 this->finalizeShaders();
209
Greg Daniel852d7152017-05-08 12:10:12 -0400210 VkPipelineShaderStageCreateInfo shaderStageInfo[3];
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500211 SkSL::Program::Settings settings;
Ethan Nicholase4682862017-07-18 14:08:18 -0400212 settings.fCaps = this->caps()->shaderCaps();
Greg Daniel49f920e2020-04-16 10:33:39 -0400213 settings.fRTHeightBinding = this->gpu()->vkCaps().getFragmentUniformBinding();
214 settings.fRTHeightSet = this->gpu()->vkCaps().getFragmentUniformSet();
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500215 settings.fFlipY = this->origin() != kTopLeft_GrSurfaceOrigin;
Robert Phillipsc1541ae2019-02-04 12:05:37 -0500216 settings.fSharpenTextures =
Robert Phillips9da87e02019-02-04 13:26:26 -0500217 this->gpu()->getContext()->priv().options().fSharpenMipmappedTextures;
Ethan Nicholas0be34802019-08-15 12:36:58 -0400218 settings.fRTHeightOffset = fUniformHandler.getRTHeightOffset();
Brian Salomondc092132018-04-04 10:14:16 -0400219 SkASSERT(!this->fragColorIsInOut());
jvanverth992ad362016-02-26 09:21:02 -0800220
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500221 sk_sp<SkData> cached;
Brian Osman9e4e4c72020-06-10 07:19:34 -0400222 SkReadBuffer reader;
Brian Osmana66081d2019-09-03 14:59:26 -0400223 SkFourByteTag shaderType = 0;
Robert Phillips9da87e02019-02-04 13:26:26 -0500224 auto persistentCache = fGpu->getContext()->priv().getPersistentCache();
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500225 if (persistentCache) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400226 // Here we shear off the Vk-specific portion of the Desc in order to create the
227 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
228 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500229 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
230 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000231 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength()+4);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500232 cached = persistentCache->load(*key);
Brian Osmana66081d2019-09-03 14:59:26 -0400233 if (cached) {
234 reader.setMemory(cached->data(), cached->size());
Brian Osman1facd5e2020-03-16 16:21:24 -0400235 shaderType = GrPersistentCacheUtils::GetType(&reader);
Brian Osmana66081d2019-09-03 14:59:26 -0400236 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400237 }
238
Brian Osmana66081d2019-09-03 14:59:26 -0400239 int numShaderStages = 0;
240 if (kSPIRV_Tag == shaderType) {
241 numShaderStages = this->loadShadersFromCache(&reader, shaderModules, shaderStageInfo);
Brian Osman9e4e4c72020-06-10 07:19:34 -0400242 }
243
244 // Proceed from sources if we didn't get a SPIRV cache (or the cache was invalid)
245 if (!numShaderStages) {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500246 numShaderStages = 2; // We always have at least vertex and fragment stages.
Brian Osmana5a010b2019-04-08 15:01:32 -0400247 SkSL::String shaders[kGrShaderTypeCount];
248 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400249
250 SkSL::String* sksl[kGrShaderTypeCount] = {
251 &fVS.fCompilerString,
252 &fGS.fCompilerString,
253 &fFS.fCompilerString,
254 };
Brian Osmanfd7657c2019-04-25 11:34:07 -0400255 SkSL::String cached_sksl[kGrShaderTypeCount];
Brian Osmana66081d2019-09-03 14:59:26 -0400256 if (kSKSL_Tag == shaderType) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400257 if (GrPersistentCacheUtils::UnpackCachedShaders(&reader, cached_sksl, inputs,
258 kGrShaderTypeCount)) {
259 for (int i = 0; i < kGrShaderTypeCount; ++i) {
260 sksl[i] = &cached_sksl[i];
261 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400262 }
263 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400264
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400265 bool success = this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400266 *sksl[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400267 &shaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500268 &shaderStageInfo[0],
269 settings,
Brian Osmana5a010b2019-04-08 15:01:32 -0400270 &shaders[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400271 &inputs[kVertex_GrShaderType]);
Greg Daniel852d7152017-05-08 12:10:12 -0400272
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400273 success = success && this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
274 *sksl[kFragment_GrShaderType],
275 &shaderModules[kFragment_GrShaderType],
276 &shaderStageInfo[1],
277 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400278 &shaders[kFragment_GrShaderType],
279 &inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500280
281 if (this->primitiveProcessor().willUseGeoShader()) {
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400282 success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
283 *sksl[kGeometry_GrShaderType],
284 &shaderModules[kGeometry_GrShaderType],
285 &shaderStageInfo[2],
286 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400287 &shaders[kGeometry_GrShaderType],
288 &inputs[kGeometry_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500289 ++numShaderStages;
290 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400291
292 if (!success) {
293 for (int i = 0; i < kGrShaderTypeCount; ++i) {
294 if (shaderModules[i]) {
295 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(),
296 shaderModules[i], nullptr));
297 }
298 }
299 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
300 nullptr));
301 return nullptr;
302 }
303
Brian Osmanfd7657c2019-04-25 11:34:07 -0400304 if (persistentCache && !cached) {
305 bool isSkSL = false;
Brian Osmana66081d2019-09-03 14:59:26 -0400306 if (fGpu->getContext()->priv().options().fShaderCacheStrategy ==
307 GrContextOptions::ShaderCacheStrategy::kSkSL) {
Brian Osmanfd7657c2019-04-25 11:34:07 -0400308 for (int i = 0; i < kGrShaderTypeCount; ++i) {
Brian Osmanac9be9d2019-05-01 10:29:34 -0400309 shaders[i] = GrShaderUtils::PrettyPrint(*sksl[i]);
Brian Osmanfd7657c2019-04-25 11:34:07 -0400310 }
311 isSkSL = true;
312 }
Brian Osman4524e842019-09-24 16:03:41 -0400313 this->storeShadersInCache(shaders, inputs, isSkSL);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500314 }
315 }
Robert Phillipsa87c5292019-11-12 10:12:42 -0500316
317 GrVkPipeline* pipeline = resourceProvider.createPipeline(fProgramInfo, shaderStageInfo,
318 numShaderStages, compatibleRenderPass,
319 pipelineLayout);
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400320 for (int i = 0; i < kGrShaderTypeCount; ++i) {
321 // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
322 // However this is causing a crash in certain drivers (e.g. NVidia).
323 if (shaderModules[i]) {
324 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), shaderModules[i],
325 nullptr));
326 }
Greg Daniel852d7152017-05-08 12:10:12 -0400327 }
jvanverth992ad362016-02-26 09:21:02 -0800328
329 if (!pipeline) {
330 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
331 nullptr));
jvanverth992ad362016-02-26 09:21:02 -0800332 return nullptr;
333 }
334
egdaniel22281c12016-03-23 13:49:40 -0700335 return new GrVkPipelineState(fGpu,
egdaniel22281c12016-03-23 13:49:40 -0700336 pipeline,
egdaniel707bbd62016-07-26 07:19:47 -0700337 samplerDSHandle,
egdaniel22281c12016-03-23 13:49:40 -0700338 fUniformHandles,
339 fUniformHandler.fUniforms,
Ethan Nicholas0be34802019-08-15 12:36:58 -0400340 fUniformHandler.fCurrentUBOOffset,
Greg Daniel7a82edf2018-12-04 10:54:34 -0500341 fUniformHandler.fSamplers,
Robert Phillips369e8b72017-08-01 16:13:04 -0400342 std::move(fGeometryProcessor),
343 std::move(fXferProcessor),
Brian Salomon61a70fb2020-07-08 19:02:54 -0400344 std::move(fFragmentProcessors));
jvanverth992ad362016-02-26 09:21:02 -0800345}