OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |