69 lines
2.1 KiB
C
69 lines
2.1 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <XCEngine/Core/Containers/String.h>
|
||
|
|
#include <XCEngine/RHI/RHIEnums.h>
|
||
|
|
#include <XCEngine/RHI/RHIPipelineState.h>
|
||
|
|
#include <XCEngine/Resources/Shader/Shader.h>
|
||
|
|
|
||
|
|
#include <string>
|
||
|
|
|
||
|
|
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<wchar_t>(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
|