diff --git a/renderer/CMakeLists.txt b/renderer/CMakeLists.txt index b5722c0..f8bc97c 100644 --- a/renderer/CMakeLists.txt +++ b/renderer/CMakeLists.txt @@ -4,7 +4,7 @@ find_package(spirv_cross_core REQUIRED) find_package(spirv_cross_glsl REQUIRED) find_package(SPIRV-Headers REQUIRED) -find_package(glslang REQUIRED) +find_package(glslang) # for additional debug information in the GLSL add_library(renderer STATIC) target_sources(renderer @@ -53,10 +53,16 @@ target_link_libraries(renderer imgui dxbc spirv-cross-core - spirv-cross-glsl - glslang::SPIRV - glslang::glslang-default-resource-limits) + spirv-cross-glsl) target_compile_definitions(renderer PUBLIC GLM_FORCE_RADIANS GLM_FORCE_DEPTH_ZERO_TO_ONE GLM_ENABLE_EXPERIMENTAL) target_compile_options(renderer PUBLIC -fexceptions) # needed for spirv-cross and dxbc +if (glslang_FOUND) + target_link_libraries(renderer + PUBLIC + glslang::SPIRV + glslang::glslang-default-resource-limits) + target_compile_definitions(renderer PRIVATE HAVE_GLSLANG) +endif () + add_library(Novus::Renderer ALIAS renderer) \ No newline at end of file diff --git a/renderer/include/shadermanager.h b/renderer/include/shadermanager.h index 2282085..f57f2e7 100644 --- a/renderer/include/shadermanager.h +++ b/renderer/include/shadermanager.h @@ -6,12 +6,11 @@ #include #include -#include +#include #include #include #include -struct physis_Shader; class Device; class ShaderManager @@ -23,7 +22,7 @@ public: VkShaderModule convertShaderModule(const physis_Shader &shader, spv::ExecutionModel executionModel); private: - std::vector compileGLSL(const std::string_view sourceString, const EShLanguage sourceLanguage); + std::vector compileGLSL(std::string_view sourceString, ShaderStage stage); Device &m_device; }; \ No newline at end of file diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index d8c48b9..eb7411d 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -5,17 +5,11 @@ #include -#include - #include -#include -#include -#include #include #include #include "camera.h" -#include "dxbc_module.h" #include "dxbc_reader.h" #include "rendermanager.h" #include "swapchain.h" diff --git a/renderer/src/shadermanager.cpp b/renderer/src/shadermanager.cpp index 49c98be..926800d 100644 --- a/renderer/src/shadermanager.cpp +++ b/renderer/src/shadermanager.cpp @@ -5,12 +5,16 @@ #include #include -#include -#include -#include #include #include +#ifdef HAVE_GLSLANG +#include +#include +#include +#include +#endif + #include "device.h" ShaderManager::ShaderManager(Device &device) @@ -27,9 +31,7 @@ spirv_cross::CompilerGLSL ShaderManager::getShaderModuleResources(const physis_S dxvk::DxbcModuleInfo info; auto result = module.compile(info, "test"); - // glsl.build_combined_image_samplers(); - - return spirv_cross::CompilerGLSL(result.code.data(), result.code.dwords()); + return {result.code.data(), result.code.dwords()}; } VkShaderModule ShaderManager::convertShaderModule(const physis_Shader &shader, spv::ExecutionModel executionModel) @@ -41,6 +43,10 @@ VkShaderModule ShaderManager::convertShaderModule(const physis_Shader &shader, s dxvk::DxbcModuleInfo info; auto result = module.compile(info, "test"); + VkShaderModuleCreateInfo createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + +#ifdef HAVE_GLSLANG // TODO: for debug only spirv_cross::CompilerGLSL glsl(result.code.data(), result.code.dwords()); @@ -65,11 +71,7 @@ VkShaderModule ShaderManager::convertShaderModule(const physis_Shader &shader, s } else if (texture.name == "v7") { glsl.set_name(texture.id, "BoneId"); } - // glsl.set_name(texture.id, shader.) - // qInfo() << shader.resource_parameters[i].name << texture.id; - // qInfo() << "stage input" << i << texture.name << glsl.get_type(texture.type_id).width; i++; - // glsl.set_name(remap.combined_id, "SPIRV_Cross_Combined"); } // Here you can also set up decorations if you want (binding = #N). @@ -93,12 +95,13 @@ VkShaderModule ShaderManager::convertShaderModule(const physis_Shader &shader, s glsl.set_common_options(options); glsl.set_entry_point("main", executionModel); - auto newModule = compileGLSL(glsl.compile(), executionModel == spv::ExecutionModelVertex ? EShLanguage::EShLangVertex : EShLanguage::EShLangFragment); - - VkShaderModuleCreateInfo createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + auto newModule = compileGLSL(glsl.compile(), executionModel == spv::ExecutionModelVertex ? ShaderStage::Vertex : ShaderStage::Pixel); createInfo.codeSize = newModule.size() * sizeof(uint32_t); createInfo.pCode = reinterpret_cast(newModule.data()); +#else + createInfo.codeSize = result.code.size(); + createInfo.pCode = reinterpret_cast(result.code.data()); +#endif VkShaderModule shaderModule; vkCreateShaderModule(m_device.device, &createInfo, nullptr, &shaderModule); @@ -106,8 +109,9 @@ VkShaderModule ShaderManager::convertShaderModule(const physis_Shader &shader, s return shaderModule; } -std::vector ShaderManager::compileGLSL(const std::string_view sourceString, const EShLanguage sourceLanguage) +std::vector ShaderManager::compileGLSL(const std::string_view sourceString, const ShaderStage stage) { +#ifdef HAVE_GLSLANG static bool ProcessInitialized = false; if (!ProcessInitialized) { @@ -117,6 +121,16 @@ std::vector ShaderManager::compileGLSL(const std::string_view sourceSt const char *InputCString = sourceString.data(); + EShLanguage sourceLanguage = EShLanguage::EShLangVertex; + switch (stage) { + case ShaderStage::Vertex: + sourceLanguage = EShLanguage::EShLangVertex; + break; + case ShaderStage::Pixel: + sourceLanguage = EShLanguage::EShLangFragment; + break; + } + glslang::TShader shader(sourceLanguage); shader.setStrings(&InputCString, 1); @@ -151,4 +165,7 @@ std::vector ShaderManager::compileGLSL(const std::string_view sourceSt glslang::GlslangToSpv(*Program.getIntermediate(sourceLanguage), SpirV, &logger, &spvOptions); return SpirV; +#else + return {}; +#endif } \ No newline at end of file