162 lines
4.4 KiB
C++
162 lines
4.4 KiB
C++
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
|
|
|
|
#include "ShaderProcessing.h"
|
|
|
|
#if COMPILE_WITH_SHADER_COMPILER
|
|
|
|
#include "Engine/Core/Log.h"
|
|
|
|
VertexShaderMeta::InputType ShaderProcessing::ParseInputType(const Token& token)
|
|
{
|
|
struct InputDesc
|
|
{
|
|
VertexShaderMeta::InputType e;
|
|
const char* s;
|
|
};
|
|
|
|
#define _PARSE_ENTRY(x) { VertexShaderMeta::InputType::x, #x }
|
|
const InputDesc formats[] =
|
|
{
|
|
_PARSE_ENTRY(Invalid),
|
|
_PARSE_ENTRY(POSITION),
|
|
_PARSE_ENTRY(COLOR),
|
|
_PARSE_ENTRY(TEXCOORD),
|
|
_PARSE_ENTRY(NORMAL),
|
|
_PARSE_ENTRY(TANGENT),
|
|
_PARSE_ENTRY(BITANGENT),
|
|
_PARSE_ENTRY(ATTRIBUTE),
|
|
_PARSE_ENTRY(BLENDINDICES),
|
|
_PARSE_ENTRY(BLENDWEIGHT),
|
|
};
|
|
#undef _PARSE_ENTRY
|
|
|
|
for (int32 i = 0; i < ARRAY_COUNT(formats); i++)
|
|
{
|
|
if (token == formats[i].s)
|
|
return formats[i].e;
|
|
}
|
|
|
|
return VertexShaderMeta::InputType::Invalid;
|
|
}
|
|
|
|
PixelFormat ShaderProcessing::ParsePixelFormat(const Token& token)
|
|
{
|
|
struct DataDesc
|
|
{
|
|
PixelFormat e;
|
|
const char* s;
|
|
};
|
|
|
|
#define _PARSE_ENTRY(x) { PixelFormat::x, #x }
|
|
const DataDesc formats[] =
|
|
{
|
|
_PARSE_ENTRY(Unknown),
|
|
_PARSE_ENTRY(R32G32B32A32_Float),
|
|
_PARSE_ENTRY(R32G32B32A32_UInt),
|
|
_PARSE_ENTRY(R32G32B32A32_SInt),
|
|
_PARSE_ENTRY(R32G32B32_Float),
|
|
_PARSE_ENTRY(R32G32B32_UInt),
|
|
_PARSE_ENTRY(R32G32B32_SInt),
|
|
_PARSE_ENTRY(R16G16B16A16_Float),
|
|
_PARSE_ENTRY(R16G16B16A16_UNorm),
|
|
_PARSE_ENTRY(R16G16B16A16_UInt),
|
|
_PARSE_ENTRY(R16G16B16A16_SNorm),
|
|
_PARSE_ENTRY(R16G16B16A16_SInt),
|
|
_PARSE_ENTRY(R32G32_Float),
|
|
_PARSE_ENTRY(R32G32_UInt),
|
|
_PARSE_ENTRY(R32G32_SInt),
|
|
_PARSE_ENTRY(R10G10B10A2_UNorm),
|
|
_PARSE_ENTRY(R10G10B10A2_UInt),
|
|
_PARSE_ENTRY(R11G11B10_Float),
|
|
_PARSE_ENTRY(R8G8B8A8_UNorm),
|
|
_PARSE_ENTRY(R8G8B8A8_UNorm_sRGB),
|
|
_PARSE_ENTRY(R8G8B8A8_UInt),
|
|
_PARSE_ENTRY(R8G8B8A8_SNorm),
|
|
_PARSE_ENTRY(R8G8B8A8_SInt),
|
|
_PARSE_ENTRY(R16G16_Float),
|
|
_PARSE_ENTRY(R16G16_UNorm),
|
|
_PARSE_ENTRY(R16G16_UInt),
|
|
_PARSE_ENTRY(R16G16_SNorm),
|
|
_PARSE_ENTRY(R16G16_SInt),
|
|
_PARSE_ENTRY(R32_Float),
|
|
_PARSE_ENTRY(R32_UInt),
|
|
_PARSE_ENTRY(R32_SInt),
|
|
_PARSE_ENTRY(R8G8_UNorm),
|
|
_PARSE_ENTRY(R8G8_UInt),
|
|
_PARSE_ENTRY(R8G8_SNorm),
|
|
_PARSE_ENTRY(R8G8_SInt),
|
|
_PARSE_ENTRY(R16_Float),
|
|
_PARSE_ENTRY(R16_UNorm),
|
|
_PARSE_ENTRY(R16_UInt),
|
|
_PARSE_ENTRY(R16_SNorm),
|
|
_PARSE_ENTRY(R16_SInt),
|
|
_PARSE_ENTRY(R8_UNorm),
|
|
_PARSE_ENTRY(R8_UInt),
|
|
_PARSE_ENTRY(R8_SNorm),
|
|
_PARSE_ENTRY(R8_SInt),
|
|
_PARSE_ENTRY(A8_UNorm),
|
|
_PARSE_ENTRY(R1_UNorm),
|
|
_PARSE_ENTRY(R8G8_B8G8_UNorm),
|
|
_PARSE_ENTRY(G8R8_G8B8_UNorm),
|
|
_PARSE_ENTRY(BC1_UNorm),
|
|
_PARSE_ENTRY(BC1_UNorm_sRGB),
|
|
_PARSE_ENTRY(BC2_UNorm),
|
|
_PARSE_ENTRY(BC2_UNorm_sRGB),
|
|
_PARSE_ENTRY(BC3_UNorm),
|
|
_PARSE_ENTRY(BC3_UNorm_sRGB),
|
|
_PARSE_ENTRY(BC4_UNorm),
|
|
_PARSE_ENTRY(BC4_SNorm),
|
|
_PARSE_ENTRY(BC5_UNorm),
|
|
_PARSE_ENTRY(BC5_SNorm),
|
|
_PARSE_ENTRY(B5G6R5_UNorm),
|
|
_PARSE_ENTRY(B5G5R5A1_UNorm),
|
|
_PARSE_ENTRY(B8G8R8A8_UNorm),
|
|
_PARSE_ENTRY(B8G8R8X8_UNorm),
|
|
_PARSE_ENTRY(B8G8R8A8_UNorm_sRGB),
|
|
_PARSE_ENTRY(B8G8R8X8_UNorm_sRGB),
|
|
_PARSE_ENTRY(BC6H_Uf16),
|
|
_PARSE_ENTRY(BC6H_Sf16),
|
|
_PARSE_ENTRY(BC7_UNorm),
|
|
_PARSE_ENTRY(BC7_UNorm_sRGB),
|
|
};
|
|
#undef _PARSE_ENTRY
|
|
|
|
for (int32 i = 0; i < ARRAY_COUNT(formats); i++)
|
|
{
|
|
if (token.EqualsIgnoreCase(formats[i].s))
|
|
return formats[i].e;
|
|
}
|
|
|
|
return PixelFormat::Unknown;
|
|
}
|
|
|
|
ShaderFlags ShaderProcessing::ParseShaderFlags(const Token& token)
|
|
{
|
|
struct DataDesc
|
|
{
|
|
ShaderFlags e;
|
|
const char* s;
|
|
};
|
|
|
|
#define _PARSE_ENTRY(x) { ShaderFlags::x, #x }
|
|
const DataDesc data[] =
|
|
{
|
|
_PARSE_ENTRY(Default),
|
|
_PARSE_ENTRY(Hidden),
|
|
_PARSE_ENTRY(NoFastMath),
|
|
_PARSE_ENTRY(VertexToGeometryShader),
|
|
};
|
|
static_assert(ARRAY_COUNT(data) == 4, "Invalid amount of Shader Flag data entries.");
|
|
#undef _PARSE_ENTRY
|
|
|
|
for (int32 i = 0; i < ARRAY_COUNT(data); i++)
|
|
{
|
|
if (token.EqualsIgnoreCase(data[i].s))
|
|
return data[i].e;
|
|
}
|
|
|
|
return ShaderFlags::Default;
|
|
}
|
|
|
|
#endif
|