| 248 | }; |
| 249 | |
| 250 | std::unique_ptr<VulkanShader> ShaderBuilder::Create(const char *shadername, VulkanDevice *device) |
| 251 | { |
| 252 | EShLanguage stage = (EShLanguage)this->stage; |
| 253 | |
| 254 | std::vector<const char*> namesC, sourcesC; |
| 255 | std::vector<int> lengthsC; |
| 256 | for (const auto& s : sources) |
| 257 | { |
| 258 | namesC.push_back(s.first.c_str()); |
| 259 | sourcesC.push_back(s.second.c_str()); |
| 260 | lengthsC.push_back((int)s.second.size()); |
| 261 | } |
| 262 | |
| 263 | TBuiltInResource resources = DefaultTBuiltInResource; |
| 264 | |
| 265 | glslang::TShader shader(stage); |
| 266 | shader.setStringsWithLengthsAndNames(sourcesC.data(), lengthsC.data(), namesC.data(), (int)sources.size()); |
| 267 | shader.setEnvInput(glslang::EShSourceGlsl, stage, glslang::EShClientVulkan, 100); |
| 268 | if (device->Instance->ApiVersion >= VK_API_VERSION_1_2) |
| 269 | { |
| 270 | shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_2); |
| 271 | shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); |
| 272 | } |
| 273 | else |
| 274 | { |
| 275 | shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_0); |
| 276 | shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_0); |
| 277 | } |
| 278 | |
| 279 | ShaderBuilderIncluderImpl includer(this); |
| 280 | bool compileSuccess = shader.parse(&resources, 110, false, EShMsgVulkanRules, includer); |
| 281 | if (!compileSuccess) |
| 282 | { |
| 283 | VulkanError((std::string("Shader compile failed: ") + shader.getInfoLog()).c_str()); |
| 284 | } |
| 285 | |
| 286 | glslang::TProgram program; |
| 287 | program.addShader(&shader); |
| 288 | bool linkSuccess = program.link(EShMsgDefault); |
| 289 | if (!linkSuccess) |
| 290 | { |
| 291 | VulkanError((std::string("Shader link failed: ") + program.getInfoLog()).c_str()); |
| 292 | } |
| 293 | |
| 294 | glslang::TIntermediate *intermediate = program.getIntermediate(stage); |
| 295 | if (!intermediate) |
| 296 | { |
| 297 | VulkanError("Internal shader compiler error"); |
| 298 | } |
| 299 | |
| 300 | glslang::SpvOptions spvOptions; |
| 301 | spvOptions.generateDebugInfo = false; |
| 302 | spvOptions.disableOptimizer = false; |
| 303 | spvOptions.optimizeSize = true; |
| 304 | |
| 305 | std::vector<unsigned int> spirv; |
| 306 | spv::SpvBuildLogger logger; |
| 307 | glslang::GlslangToSpv(*intermediate, spirv, &logger, &spvOptions); |
no test coverage detected