// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
#pragma once
#include "ShaderMeta.h"
#if COMPILE_WITH_SHADER_COMPILER
#include "Engine/Core/Types/String.h"
#include "IShaderFunctionReader.h"
#include "ITokenReadersContainer.h"
namespace ShaderProcessing
{
extern VertexShaderMeta::InputType ParseInputType(const Token& token);
extern PixelFormat ParsePixelFormat(const Token& token);
extern ShaderFlags ParseShaderFlags(const Token& token);
///
/// Shader files meta data processing tool
///
class Parser : public IShaderParser, public ITokenReadersContainerBase
{
private:
bool failed;
String targetName;
Reader text;
ParserMacros _macros;
FeatureLevel _featureLevel;
private:
Parser(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, FeatureLevel featureLevel);
~Parser();
public:
///
/// Process shader source code and generate metadata
///
/// Calling object name (used for warnings/errors logging)
/// ANSI source code
/// Amount of characters in the source code
/// The input macros.
/// The target feature level.
/// Output result with metadata
/// True if cannot process the file (too many errors), otherwise false
static bool Process(const String& targetName, const char* source, int32 sourceLength, ParserMacros macros, FeatureLevel featureLevel, ShaderMeta* result);
public:
///
/// Process shader source code and generate metadata
///
/// Output result with metadata
void Process(ShaderMeta* result);
private:
void init();
bool process();
bool collectResults(ShaderMeta* result);
public:
// [IShaderParser]
FeatureLevel GetFeatureLevel() const override
{
return _featureLevel;
}
bool Failed() const override
{
return failed;
}
Reader& GetReader() override
{
return text;
}
ParserMacros GetMacros() const override
{
return _macros;
}
void OnError(const String& message) override;
void OnWarning(const String& message) override;
};
}
#endif