#pragma once #include #include #include #include #include namespace XCEngine { namespace Rendering { namespace Detail { inline Resources::ShaderBackend ToShaderBackend(RHI::RHIType backendType) { switch (backendType) { case RHI::RHIType::D3D12: return Resources::ShaderBackend::D3D12; case RHI::RHIType::Vulkan: return Resources::ShaderBackend::Vulkan; case RHI::RHIType::OpenGL: default: return Resources::ShaderBackend::OpenGL; } } inline RHI::ShaderLanguage ToRHIShaderLanguage(Resources::ShaderLanguage language) { switch (language) { case Resources::ShaderLanguage::HLSL: return RHI::ShaderLanguage::HLSL; case Resources::ShaderLanguage::SPIRV: return RHI::ShaderLanguage::SPIRV; case Resources::ShaderLanguage::GLSL: default: return RHI::ShaderLanguage::GLSL; } } inline std::wstring ToWideAscii(const Containers::String& value) { std::wstring wide; wide.reserve(value.Length()); for (size_t index = 0; index < value.Length(); ++index) { wide.push_back(static_cast(value[index])); } return wide; } inline void ApplyShaderStageVariant( const Resources::ShaderStageVariant& variant, RHI::ShaderCompileDesc& compileDesc) { compileDesc.source.assign( variant.sourceCode.CStr(), variant.sourceCode.CStr() + variant.sourceCode.Length()); compileDesc.sourceLanguage = ToRHIShaderLanguage(variant.language); compileDesc.entryPoint = ToWideAscii(variant.entryPoint); compileDesc.profile = ToWideAscii(variant.profile); } inline bool ShaderPassHasGraphicsVariants( const Resources::Shader& shader, const Containers::String& passName, Resources::ShaderBackend backend) { return shader.FindVariant(passName, Resources::ShaderType::Vertex, backend) != nullptr && shader.FindVariant(passName, Resources::ShaderType::Fragment, backend) != nullptr; } } // namespace Detail } // namespace Rendering } // namespace XCEngine