Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: src/gpu/vk/GrVkPipelineStateBuilder.cpp

Issue 2355493002: Move vulkan spir-v compile call to GrVkUtil (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/gpu/vk/GrVkUtil.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "vk/GrVkPipelineStateBuilder.h" 8 #include "vk/GrVkPipelineStateBuilder.h"
9 9
10 #include "vk/GrVkDescriptorSetManager.h" 10 #include "vk/GrVkDescriptorSetManager.h"
11 #include "vk/GrVkGpu.h" 11 #include "vk/GrVkGpu.h"
12 #include "vk/GrVkRenderPass.h" 12 #include "vk/GrVkRenderPass.h"
13 #if USE_SKSL
14 #include "SkSLCompiler.h"
15 #endif
16 13
17 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState( 14 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
18 GrVkGpu* gpu, 15 GrVkGpu* gpu,
19 const GrPipeline& pipeline, 16 const GrPipeline& pipeline,
20 const GrPrimitive Processor& primProc, 17 const GrPrimitive Processor& primProc,
21 GrPrimitiveType p rimitiveType, 18 GrPrimitiveType p rimitiveType,
22 const GrVkPipelin eState::Desc& desc, 19 const GrVkPipelin eState::Desc& desc,
23 const GrVkRenderP ass& renderPass) { 20 const GrVkRenderP ass& renderPass) {
24 // create a builder. This will be handed off to effects so they can use it to add 21 // create a builder. This will be handed off to effects so they can use it to add
25 // uniforms, varyings, textures, etc 22 // uniforms, varyings, textures, etc
(...skipping 28 matching lines...) Expand all
54 } 51 }
55 52
56 void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrGLSLShaderVar& outp utColor) { 53 void GrVkPipelineStateBuilder::finalizeFragmentOutputColor(GrGLSLShaderVar& outp utColor) {
57 outputColor.setLayoutQualifier("location = 0, index = 0"); 54 outputColor.setLayoutQualifier("location = 0, index = 0");
58 } 55 }
59 56
60 void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrGLSLShaderVar& o utputColor) { 57 void GrVkPipelineStateBuilder::finalizeFragmentSecondaryColor(GrGLSLShaderVar& o utputColor) {
61 outputColor.setLayoutQualifier("location = 0, index = 1"); 58 outputColor.setLayoutQualifier("location = 0, index = 1");
62 } 59 }
63 60
64 #if USE_SKSL
65 SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
66 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
67 return SkSL::Program::kVertex_Kind;
68 }
69 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
70 return SkSL::Program::kFragment_Kind;
71 }
72 #else
73 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) {
74 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
75 return shaderc_glsl_vertex_shader;
76 }
77 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
78 return shaderc_glsl_fragment_shader;
79 }
80 #endif
81 61
82 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu, 62 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu,
83 VkShaderStageFlagBits stage, 63 VkShaderStageFlagBits stage,
84 const GrGLSLShaderBuilder& b uilder, 64 const GrGLSLShaderBuilder& b uilder,
85 VkShaderModule* shaderModule , 65 VkShaderModule* shaderModule ,
86 VkPipelineShaderStageCreateI nfo* stageInfo) { 66 VkPipelineShaderStageCreateI nfo* stageInfo) {
87 SkString shaderString; 67 SkString shaderString;
88 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { 68 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) {
89 if (builder.fCompilerStrings[i]) { 69 if (builder.fCompilerStrings[i]) {
90 shaderString.append(builder.fCompilerStrings[i]); 70 shaderString.append(builder.fCompilerStrings[i]);
91 shaderString.append("\n"); 71 shaderString.append("\n");
92 } 72 }
93 } 73 }
94 74 return GrCompileVkShaderModule(gpu, shaderString.c_str(), stage, shaderModul e, stageInfo);
95 VkShaderModuleCreateInfo moduleCreateInfo;
96 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
97 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
98 moduleCreateInfo.pNext = nullptr;
99 moduleCreateInfo.flags = 0;
100
101 #if USE_SKSL
102 std::string code;
103 #else
104 shaderc_compilation_result_t result = nullptr;
105 #endif
106
107 if (gpu->vkCaps().canUseGLSLForShaderModule()) {
108 moduleCreateInfo.codeSize = strlen(shaderString.c_str());
109 moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str();
110 } else {
111
112 #if USE_SKSL
113 bool result = gpu->shaderCompiler()->toSPIRV(vk_shader_stage_to_skiasl_k ind(stage),
114 std::string(shaderString.c_ str()),
115 &code);
116 if (!result) {
117 SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
118 return false;
119 }
120 moduleCreateInfo.codeSize = code.size();
121 moduleCreateInfo.pCode = (const uint32_t*) code.c_str();
122 #else
123 shaderc_compiler_t compiler = gpu->shadercCompiler();
124
125 shaderc_compile_options_t options = shaderc_compile_options_initialize() ;
126
127 shaderc_shader_kind shadercStage = vk_shader_stage_to_shaderc_kind(stage );
128 result = shaderc_compile_into_spv(compiler,
129 shaderString.c_str(),
130 strlen(shaderString.c_str()),
131 shadercStage,
132 "shader",
133 "main",
134 options);
135 shaderc_compile_options_release(options);
136 #ifdef SK_DEBUG
137 if (shaderc_result_get_num_errors(result)) {
138 SkDebugf("%s\n", shaderString.c_str());
139 SkDebugf("%s\n", shaderc_result_get_error_message(result));
140 return false;
141 }
142 #endif // SK_DEBUG
143
144 moduleCreateInfo.codeSize = shaderc_result_get_length(result);
145 moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(resul t);
146 #endif // USE_SKSL
147 }
148
149 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device (),
150 &moduleCrea teInfo,
151 nullptr,
152 shaderModul e));
153
154 if (!gpu->vkCaps().canUseGLSLForShaderModule()) {
155 #if !USE_SKSL
156 shaderc_result_release(result);
157 #endif
158 }
159 if (err) {
160 return false;
161 }
162
163 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
164 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
165 stageInfo->pNext = nullptr;
166 stageInfo->flags = 0;
167 stageInfo->stage = stage;
168 stageInfo->module = *shaderModule;
169 stageInfo->pName = "main";
170 stageInfo->pSpecializationInfo = nullptr;
171
172 return true;
173 } 75 }
174 76
175 GrVkPipelineState* GrVkPipelineStateBuilder::finalize(GrPrimitiveType primitiveT ype, 77 GrVkPipelineState* GrVkPipelineStateBuilder::finalize(GrPrimitiveType primitiveT ype,
176 const GrVkRenderPass& rend erPass, 78 const GrVkRenderPass& rend erPass,
177 const GrVkPipelineState::D esc& desc) { 79 const GrVkPipelineState::D esc& desc) {
178 VkDescriptorSetLayout dsLayout[2]; 80 VkDescriptorSetLayout dsLayout[2];
179 VkPipelineLayout pipelineLayout; 81 VkPipelineLayout pipelineLayout;
180 VkShaderModule vertShaderModule; 82 VkShaderModule vertShaderModule;
181 VkShaderModule fragShaderModule; 83 VkShaderModule fragShaderModule;
182 84
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 fUniformHandles, 161 fUniformHandles,
260 fUniformHandler.fUniforms, 162 fUniformHandler.fUniforms,
261 fUniformHandler.fCurrentVertexUBOOffset, 163 fUniformHandler.fCurrentVertexUBOOffset,
262 fUniformHandler.fCurrentFragmentUBOOffset, 164 fUniformHandler.fCurrentFragmentUBOOffset,
263 (uint32_t)fUniformHandler.numSamplers(), 165 (uint32_t)fUniformHandler.numSamplers(),
264 fGeometryProcessor, 166 fGeometryProcessor,
265 fXferProcessor, 167 fXferProcessor,
266 fFragmentProcessors); 168 fFragmentProcessors);
267 } 169 }
268 170
OLDNEW
« no previous file with comments | « no previous file | src/gpu/vk/GrVkUtil.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698