blob: 1d6d31287d8f6dca144382b51d8667e4265b721d [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
Robert Phillipsae67c522021-03-03 11:03:38 -050032 GrVkResourceProvider& resourceProvider = gpu->resourceProvider();
33
34 resourceProvider.pipelineStateCache()->stats()->incShaderCompilations();
Robert Phillipsf497c362020-05-12 10:35:18 -040035
Ethan Nicholasb6538132019-10-22 16:00:18 -040036 // ensure that we use "." as a decimal separator when creating SkSL code
37 GrAutoLocaleSetter als("C");
38
jvanverth992ad362016-02-26 09:21:02 -080039 // create a builder. This will be handed off to effects so they can use it to add
40 // uniforms, varyings, textures, etc
Stephen Whiteb1857852020-02-07 15:33:23 +000041 GrVkPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
jvanverth992ad362016-02-26 09:21:02 -080042
Ethan Nicholas2983f402017-05-08 09:36:08 -040043 if (!builder.emitAndInstallProcs()) {
jvanverth992ad362016-02-26 09:21:02 -080044 return nullptr;
45 }
46
Greg Daniel91b37b12021-01-05 15:40:54 -050047 return builder.finalize(desc, compatibleRenderPass, overrideSubpassForResolveLoad);
jvanverth992ad362016-02-26 09:21:02 -080048}
49
egdaniel22281c12016-03-23 13:49:40 -070050GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050051 GrRenderTarget* renderTarget,
Stephen Whiteb1857852020-02-07 15:33:23 +000052 const GrProgramDesc& desc,
53 const GrProgramInfo& programInfo)
54 : INHERITED(renderTarget, desc, programInfo)
Brian Salomonff168d92018-06-23 15:17:27 -040055 , fGpu(gpu)
56 , fVaryingHandler(this)
57 , fUniformHandler(this) {}
jvanverth992ad362016-02-26 09:21:02 -080058
egdaniel22281c12016-03-23 13:49:40 -070059const GrCaps* GrVkPipelineStateBuilder::caps() const {
jvanverth992ad362016-02-26 09:21:02 -080060 return fGpu->caps();
61}
jvanverth992ad362016-02-26 09:21:02 -080062
Ethan Nicholasee9cb6a2021-02-02 11:59:09 -050063SkSL::Compiler* GrVkPipelineStateBuilder::shaderCompiler() const {
64 return fGpu->shaderCompiler();
65}
66
Brian Salomon99938a82016-11-21 13:41:08 -050067void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050068 outputColor.addLayoutQualifier("location = 0, index = 0");
jvanverth992ad362016-02-26 09:21:02 -080069}
70
Brian Salomon99938a82016-11-21 13:41:08 -050071void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrShaderVar& outputColor) {
Brian Salomon60397682016-11-22 15:06:46 -050072 outputColor.addLayoutQualifier("location = 0, index = 1");
egdanield632bb42016-03-30 12:06:48 -070073}
74
Ethan Nicholas941e7e22016-12-12 15:33:30 -050075bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
Brian Osmanfd7657c2019-04-25 11:34:07 -040076 const SkSL::String& sksl,
egdaniel22281c12016-03-23 13:49:40 -070077 VkShaderModule* shaderModule,
Ethan Nicholas941e7e22016-12-12 15:33:30 -050078 VkPipelineShaderStageCreateInfo* stageInfo,
Ethan Nicholas38657112017-02-09 17:01:22 -050079 const SkSL::Program::Settings& settings,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050080 SkSL::String* outSPIRV,
81 SkSL::Program::Inputs* outInputs) {
Brian Osmanfd7657c2019-04-25 11:34:07 -040082 if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050083 stageInfo, settings, outSPIRV, outInputs)) {
84 return false;
85 }
86 if (outInputs->fRTHeight) {
87 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
88 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050089 return true;
90}
91
92bool GrVkPipelineStateBuilder::installVkShaderModule(VkShaderStageFlagBits stage,
93 const GrGLSLShaderBuilder& builder,
94 VkShaderModule* shaderModule,
95 VkPipelineShaderStageCreateInfo* stageInfo,
96 SkSL::String spirv,
97 SkSL::Program::Inputs inputs) {
98 if (!GrInstallVkShaderModule(fGpu, spirv, stage, shaderModule, stageInfo)) {
Ethan Nicholas941e7e22016-12-12 15:33:30 -050099 return false;
100 }
Greg Daniele6ab9982018-08-22 13:56:32 +0000101 if (inputs.fRTHeight) {
102 this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500103 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500104 return true;
105}
106
Brian Osmana085a412019-04-25 09:44:43 -0400107static constexpr SkFourByteTag kSPIRV_Tag = SkSetFourByteTag('S', 'P', 'R', 'V');
Brian Osmanfd7657c2019-04-25 11:34:07 -0400108static constexpr SkFourByteTag kSKSL_Tag = SkSetFourByteTag('S', 'K', 'S', 'L');
Brian Osmana085a412019-04-25 09:44:43 -0400109
Brian Osman9e4e4c72020-06-10 07:19:34 -0400110int GrVkPipelineStateBuilder::loadShadersFromCache(SkReadBuffer* cached,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400111 VkShaderModule outShaderModules[],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500112 VkPipelineShaderStageCreateInfo* outStageInfo) {
Brian Osmana5a010b2019-04-08 15:01:32 -0400113 SkSL::String shaders[kGrShaderTypeCount];
114 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500115
Brian Osman9e4e4c72020-06-10 07:19:34 -0400116 if (!GrPersistentCacheUtils::UnpackCachedShaders(cached, shaders, inputs, kGrShaderTypeCount)) {
117 return 0;
118 }
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500119
Brian Osman9e4e4c72020-06-10 07:19:34 -0400120 bool success = this->installVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500121 fVS,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400122 &outShaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500123 &outStageInfo[0],
Brian Osmana5a010b2019-04-08 15:01:32 -0400124 shaders[kVertex_GrShaderType],
Brian Osman9e4e4c72020-06-10 07:19:34 -0400125 inputs[kVertex_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500126
Brian Osman9e4e4c72020-06-10 07:19:34 -0400127 success = success && this->installVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
128 fFS,
129 &outShaderModules[kFragment_GrShaderType],
130 &outStageInfo[1],
131 shaders[kFragment_GrShaderType],
132 inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500133
Brian Osmana5a010b2019-04-08 15:01:32 -0400134 if (!shaders[kGeometry_GrShaderType].empty()) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400135 success = success && this->installVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
136 fGS,
137 &outShaderModules[kGeometry_GrShaderType],
138 &outStageInfo[2],
139 shaders[kGeometry_GrShaderType],
140 inputs[kGeometry_GrShaderType]);
Ethan Nicholas38657112017-02-09 17:01:22 -0500141 }
Brian Osman9e4e4c72020-06-10 07:19:34 -0400142
143 if (!success) {
144 for (int i = 0; i < kGrShaderTypeCount; ++i) {
145 if (outShaderModules[i]) {
146 GR_VK_CALL(fGpu->vkInterface(),
147 DestroyShaderModule(fGpu->device(), outShaderModules[i], nullptr));
148 }
149 }
150 return 0;
151 }
152 return shaders[kGeometry_GrShaderType].empty() ? 2 : 3;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500153}
154
Brian Osmana5a010b2019-04-08 15:01:32 -0400155void GrVkPipelineStateBuilder::storeShadersInCache(const SkSL::String shaders[],
Brian Osmanfd7657c2019-04-25 11:34:07 -0400156 const SkSL::Program::Inputs inputs[],
Brian Osman4524e842019-09-24 16:03:41 -0400157 bool isSkSL) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400158 // Here we shear off the Vk-specific portion of the Desc in order to create the
159 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
160 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500161 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
162 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000163 sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
164 this->desc().initialKeyLength()+4);
Robert Phillipsced5e832021-03-23 09:36:53 -0400165 SkString description = GrProgramDesc::Describe(fProgramInfo, *this->caps());
Robert Phillips03e4c952019-11-26 16:20:22 -0500166
Brian Osmanfd7657c2019-04-25 11:34:07 -0400167 sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
168 shaders,
Brian Osman4524e842019-09-24 16:03:41 -0400169 inputs, kGrShaderTypeCount);
Brian Osmanf0de96f2021-02-26 13:54:11 -0500170
171 this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data, description);
jvanverth992ad362016-02-26 09:21:02 -0800172}
173
Stephen Whiteb1857852020-02-07 15:33:23 +0000174GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrProgramDesc& desc,
Greg Daniel91b37b12021-01-05 15:40:54 -0500175 VkRenderPass compatibleRenderPass,
176 bool overrideSubpassForResolveLoad) {
Brian Osman7a20b5c2021-03-15 16:23:33 -0400177 TRACE_EVENT0("skia.shaders", TRACE_FUNC);
Brian Osman43542fc2020-04-02 10:38:16 -0400178
Greg Daniel37fd6582020-09-14 12:36:09 -0400179 VkDescriptorSetLayout dsLayout[GrVkUniformHandler::kDescSetCount];
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400180 VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
181 VK_NULL_HANDLE,
182 VK_NULL_HANDLE };
jvanverth992ad362016-02-26 09:21:02 -0800183
egdaniel707bbd62016-07-26 07:19:47 -0700184 GrVkResourceProvider& resourceProvider = fGpu->resourceProvider();
Jim Van Verth684d7ce2016-11-17 13:30:22 -0500185 // These layouts are not owned by the PipelineStateBuilder and thus should not be destroyed
egdaniel707bbd62016-07-26 07:19:47 -0700186 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
187
188 GrVkDescriptorSetManager::Handle samplerDSHandle;
Greg Daniela7543782017-05-02 14:01:43 -0400189 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
190 fUniformHandler, &samplerDSHandle);
egdaniel707bbd62016-07-26 07:19:47 -0700191 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
192 resourceProvider.getSamplerDSLayout(samplerDSHandle);
jvanverth992ad362016-02-26 09:21:02 -0800193
Greg Daniel37fd6582020-09-14 12:36:09 -0400194 dsLayout[GrVkUniformHandler::kInputDescSet] = resourceProvider.getInputDSLayout();
195
jvanverth992ad362016-02-26 09:21:02 -0800196 // We need to enable the following extensions so that the compiler can correctly make spir-v
197 // from our glsl shaders.
198 fVS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
199 fFS.extensions().appendf("#extension GL_ARB_separate_shader_objects : enable\n");
200 fVS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
201 fFS.extensions().appendf("#extension GL_ARB_shading_language_420pack : enable\n");
202
203 this->finalizeShaders();
204
Jim Van Verth205e99a2021-02-08 18:02:41 -0500205 bool usePushConstants = fUniformHandler.usePushConstants();
Greg Daniel852d7152017-05-08 12:10:12 -0400206 VkPipelineShaderStageCreateInfo shaderStageInfo[3];
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500207 SkSL::Program::Settings settings;
Greg Daniel49f920e2020-04-16 10:33:39 -0400208 settings.fRTHeightBinding = this->gpu()->vkCaps().getFragmentUniformBinding();
209 settings.fRTHeightSet = this->gpu()->vkCaps().getFragmentUniformSet();
Jim Van Verth205e99a2021-02-08 18:02:41 -0500210 settings.fFlipY = fUniformHandler.getFlipY();
Robert Phillipsc1541ae2019-02-04 12:05:37 -0500211 settings.fSharpenTextures =
Robert Phillips9da87e02019-02-04 13:26:26 -0500212 this->gpu()->getContext()->priv().options().fSharpenMipmappedTextures;
Ethan Nicholas0be34802019-08-15 12:36:58 -0400213 settings.fRTHeightOffset = fUniformHandler.getRTHeightOffset();
Jim Van Verth205e99a2021-02-08 18:02:41 -0500214 settings.fUsePushConstants = usePushConstants;
Ethan Nicholas8f352ce2021-03-17 14:12:20 -0400215 if (fFS.fForceHighPrecision) {
216 settings.fForceHighPrecision = true;
217 }
Brian Salomondc092132018-04-04 10:14:16 -0400218 SkASSERT(!this->fragColorIsInOut());
jvanverth992ad362016-02-26 09:21:02 -0800219
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500220 sk_sp<SkData> cached;
Brian Osman9e4e4c72020-06-10 07:19:34 -0400221 SkReadBuffer reader;
Brian Osmana66081d2019-09-03 14:59:26 -0400222 SkFourByteTag shaderType = 0;
Robert Phillips9da87e02019-02-04 13:26:26 -0500223 auto persistentCache = fGpu->getContext()->priv().getPersistentCache();
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500224 if (persistentCache) {
Robert Phillipsd5c1f342019-10-14 09:50:05 -0400225 // Here we shear off the Vk-specific portion of the Desc in order to create the
226 // persistent key. This is bc Vk only caches the SPIRV code, not the fully compiled
227 // program, and that only depends on the base GrProgramDesc data.
Robert Phillipsc15e8902019-11-26 14:26:36 -0500228 // The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
229 // to the key right after the base key.
Stephen Whiteb1857852020-02-07 15:33:23 +0000230 sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength()+4);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500231 cached = persistentCache->load(*key);
Brian Osmana66081d2019-09-03 14:59:26 -0400232 if (cached) {
233 reader.setMemory(cached->data(), cached->size());
Brian Osman1facd5e2020-03-16 16:21:24 -0400234 shaderType = GrPersistentCacheUtils::GetType(&reader);
Brian Osmana66081d2019-09-03 14:59:26 -0400235 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400236 }
237
Brian Osmana66081d2019-09-03 14:59:26 -0400238 int numShaderStages = 0;
239 if (kSPIRV_Tag == shaderType) {
240 numShaderStages = this->loadShadersFromCache(&reader, shaderModules, shaderStageInfo);
Brian Osman9e4e4c72020-06-10 07:19:34 -0400241 }
242
243 // Proceed from sources if we didn't get a SPIRV cache (or the cache was invalid)
244 if (!numShaderStages) {
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500245 numShaderStages = 2; // We always have at least vertex and fragment stages.
Brian Osmana5a010b2019-04-08 15:01:32 -0400246 SkSL::String shaders[kGrShaderTypeCount];
247 SkSL::Program::Inputs inputs[kGrShaderTypeCount];
Brian Osmanfd7657c2019-04-25 11:34:07 -0400248
249 SkSL::String* sksl[kGrShaderTypeCount] = {
250 &fVS.fCompilerString,
251 &fGS.fCompilerString,
252 &fFS.fCompilerString,
253 };
Brian Osmanfd7657c2019-04-25 11:34:07 -0400254 SkSL::String cached_sksl[kGrShaderTypeCount];
Brian Osmana66081d2019-09-03 14:59:26 -0400255 if (kSKSL_Tag == shaderType) {
Brian Osman9e4e4c72020-06-10 07:19:34 -0400256 if (GrPersistentCacheUtils::UnpackCachedShaders(&reader, cached_sksl, inputs,
257 kGrShaderTypeCount)) {
258 for (int i = 0; i < kGrShaderTypeCount; ++i) {
259 sksl[i] = &cached_sksl[i];
260 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400261 }
262 }
Brian Osmanfd7657c2019-04-25 11:34:07 -0400263
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400264 bool success = this->createVkShaderModule(VK_SHADER_STAGE_VERTEX_BIT,
Brian Osmanfd7657c2019-04-25 11:34:07 -0400265 *sksl[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400266 &shaderModules[kVertex_GrShaderType],
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500267 &shaderStageInfo[0],
268 settings,
Brian Osmana5a010b2019-04-08 15:01:32 -0400269 &shaders[kVertex_GrShaderType],
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400270 &inputs[kVertex_GrShaderType]);
Greg Daniel852d7152017-05-08 12:10:12 -0400271
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400272 success = success && this->createVkShaderModule(VK_SHADER_STAGE_FRAGMENT_BIT,
273 *sksl[kFragment_GrShaderType],
274 &shaderModules[kFragment_GrShaderType],
275 &shaderStageInfo[1],
276 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400277 &shaders[kFragment_GrShaderType],
278 &inputs[kFragment_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500279
Robert Phillips787fd9d2021-03-22 14:48:09 -0400280 if (this->geometryProcessor().willUseGeoShader()) {
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400281 success = success && this->createVkShaderModule(VK_SHADER_STAGE_GEOMETRY_BIT,
282 *sksl[kGeometry_GrShaderType],
283 &shaderModules[kGeometry_GrShaderType],
284 &shaderStageInfo[2],
285 settings,
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400286 &shaders[kGeometry_GrShaderType],
287 &inputs[kGeometry_GrShaderType]);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500288 ++numShaderStages;
289 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400290
291 if (!success) {
292 for (int i = 0; i < kGrShaderTypeCount; ++i) {
293 if (shaderModules[i]) {
294 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(),
295 shaderModules[i], nullptr));
296 }
297 }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400298 return nullptr;
299 }
300
Brian Osmanfd7657c2019-04-25 11:34:07 -0400301 if (persistentCache && !cached) {
302 bool isSkSL = false;
Brian Osmana66081d2019-09-03 14:59:26 -0400303 if (fGpu->getContext()->priv().options().fShaderCacheStrategy ==
304 GrContextOptions::ShaderCacheStrategy::kSkSL) {
Brian Osmanfd7657c2019-04-25 11:34:07 -0400305 for (int i = 0; i < kGrShaderTypeCount; ++i) {
Brian Osmanac9be9d2019-05-01 10:29:34 -0400306 shaders[i] = GrShaderUtils::PrettyPrint(*sksl[i]);
Brian Osmanfd7657c2019-04-25 11:34:07 -0400307 }
308 isSkSL = true;
309 }
Brian Osman4524e842019-09-24 16:03:41 -0400310 this->storeShadersInCache(shaders, inputs, isSkSL);
Ethan Nicholas92e01cf2018-12-19 13:12:10 -0500311 }
312 }
Robert Phillipsa87c5292019-11-12 10:12:42 -0500313
Jim Van Verth205e99a2021-02-08 18:02:41 -0500314 bool usesInput = SkToBool(fProgramInfo.renderPassBarriers() & GrXferBarrierFlags::kTexture);
315 uint32_t layoutCount =
316 usesInput ? GrVkUniformHandler::kDescSetCount : (GrVkUniformHandler::kDescSetCount - 1);
317 // Create the VkPipelineLayout
318 VkPipelineLayoutCreateInfo layoutCreateInfo;
319 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
320 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
321 layoutCreateInfo.pNext = nullptr;
322 layoutCreateInfo.flags = 0;
323 layoutCreateInfo.setLayoutCount = layoutCount;
324 layoutCreateInfo.pSetLayouts = dsLayout;
325 VkPushConstantRange pushConstantRange = {};
326 if (usePushConstants) {
327 pushConstantRange.stageFlags = fGpu->vkCaps().getPushConstantStageFlags();
328 pushConstantRange.offset = 0;
329 // size must be a multiple of 4
330 SkASSERT(!SkToBool(fUniformHandler.currentOffset() & 0x3));
331 pushConstantRange.size = fUniformHandler.currentOffset();
332 layoutCreateInfo.pushConstantRangeCount = 1;
333 layoutCreateInfo.pPushConstantRanges = &pushConstantRange;
334 } else {
335 layoutCreateInfo.pushConstantRangeCount = 0;
336 layoutCreateInfo.pPushConstantRanges = nullptr;
337 }
338
339 VkPipelineLayout pipelineLayout;
340 VkResult result;
341 GR_VK_CALL_RESULT(fGpu, result, CreatePipelineLayout(fGpu->device(), &layoutCreateInfo, nullptr,
342 &pipelineLayout));
343 if (result != VK_SUCCESS) {
344 return nullptr;
345 }
346
Greg Daniel91b37b12021-01-05 15:40:54 -0500347 // For the vast majority of cases we only have one subpass so we default piplines to subpass 0.
348 // However, if we need to load a resolve into msaa attachment for discardable msaa then the
349 // main subpass will be 1.
350 uint32_t subpass = 0;
351 if (overrideSubpassForResolveLoad ||
352 (fProgramInfo.colorLoadOp() == GrLoadOp::kLoad &&
353 fProgramInfo.targetSupportsVkResolveLoad() &&
354 fGpu->vkCaps().preferDiscardableMSAAAttachment())) {
355 subpass = 1;
356 }
Greg Daniel3ef052c2021-01-05 12:20:27 -0500357 sk_sp<const GrVkPipeline> pipeline = resourceProvider.makePipeline(
Greg Daniel91b37b12021-01-05 15:40:54 -0500358 fProgramInfo, shaderStageInfo, numShaderStages, compatibleRenderPass, pipelineLayout,
359 subpass);
360
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400361 for (int i = 0; i < kGrShaderTypeCount; ++i) {
362 // This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
363 // However this is causing a crash in certain drivers (e.g. NVidia).
364 if (shaderModules[i]) {
365 GR_VK_CALL(fGpu->vkInterface(), DestroyShaderModule(fGpu->device(), shaderModules[i],
366 nullptr));
367 }
Greg Daniel852d7152017-05-08 12:10:12 -0400368 }
jvanverth992ad362016-02-26 09:21:02 -0800369
370 if (!pipeline) {
371 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineLayout(fGpu->device(), pipelineLayout,
372 nullptr));
jvanverth992ad362016-02-26 09:21:02 -0800373 return nullptr;
374 }
375
egdaniel22281c12016-03-23 13:49:40 -0700376 return new GrVkPipelineState(fGpu,
Greg Daniel3ef052c2021-01-05 12:20:27 -0500377 std::move(pipeline),
egdaniel707bbd62016-07-26 07:19:47 -0700378 samplerDSHandle,
egdaniel22281c12016-03-23 13:49:40 -0700379 fUniformHandles,
380 fUniformHandler.fUniforms,
Jim Van Verth205e99a2021-02-08 18:02:41 -0500381 fUniformHandler.currentOffset(),
382 fUniformHandler.usePushConstants(),
Greg Daniel7a82edf2018-12-04 10:54:34 -0500383 fUniformHandler.fSamplers,
Robert Phillips369e8b72017-08-01 16:13:04 -0400384 std::move(fGeometryProcessor),
385 std::move(fXferProcessor),
Brian Salomon17f95b12021-02-23 09:35:08 -0500386 std::move(fFPImpls));
jvanverth992ad362016-02-26 09:21:02 -0800387}