refactor: add shader pass and backend variants
This commit is contained in:
@@ -22,6 +22,13 @@ enum class ShaderLanguage : Core::uint8 {
|
||||
SPIRV
|
||||
};
|
||||
|
||||
enum class ShaderBackend : Core::uint8 {
|
||||
Generic = 0,
|
||||
D3D12,
|
||||
OpenGL,
|
||||
Vulkan
|
||||
};
|
||||
|
||||
struct ShaderUniform {
|
||||
Containers::String name;
|
||||
Core::uint32 location;
|
||||
@@ -36,6 +43,27 @@ struct ShaderAttribute {
|
||||
Core::uint32 type;
|
||||
};
|
||||
|
||||
struct ShaderPassTagEntry {
|
||||
Containers::String name;
|
||||
Containers::String value;
|
||||
};
|
||||
|
||||
struct ShaderStageVariant {
|
||||
ShaderType stage = ShaderType::Fragment;
|
||||
ShaderLanguage language = ShaderLanguage::GLSL;
|
||||
ShaderBackend backend = ShaderBackend::Generic;
|
||||
Containers::String entryPoint;
|
||||
Containers::String profile;
|
||||
Containers::String sourceCode;
|
||||
Containers::Array<Core::uint8> compiledBinary;
|
||||
};
|
||||
|
||||
struct ShaderPass {
|
||||
Containers::String name;
|
||||
Containers::Array<ShaderPassTagEntry> tags;
|
||||
Containers::Array<ShaderStageVariant> variants;
|
||||
};
|
||||
|
||||
class Shader : public IResource {
|
||||
public:
|
||||
Shader();
|
||||
@@ -49,10 +77,10 @@ public:
|
||||
size_t GetMemorySize() const override { return m_memorySize; }
|
||||
void Release() override;
|
||||
|
||||
void SetShaderType(ShaderType type) { m_shaderType = type; }
|
||||
void SetShaderType(ShaderType type);
|
||||
ShaderType GetShaderType() const { return m_shaderType; }
|
||||
|
||||
void SetShaderLanguage(ShaderLanguage lang) { m_language = lang; }
|
||||
void SetShaderLanguage(ShaderLanguage lang);
|
||||
ShaderLanguage GetShaderLanguage() const { return m_language; }
|
||||
|
||||
void SetSourceCode(const Containers::String& source);
|
||||
@@ -66,11 +94,33 @@ public:
|
||||
|
||||
void AddAttribute(const ShaderAttribute& attribute);
|
||||
const Containers::Array<ShaderAttribute>& GetAttributes() const { return m_attributes; }
|
||||
|
||||
void AddPass(const ShaderPass& pass);
|
||||
void ClearPasses();
|
||||
Core::uint32 GetPassCount() const { return static_cast<Core::uint32>(m_passes.Size()); }
|
||||
const Containers::Array<ShaderPass>& GetPasses() const { return m_passes; }
|
||||
|
||||
void AddPassVariant(const Containers::String& passName, const ShaderStageVariant& variant);
|
||||
void SetPassTag(
|
||||
const Containers::String& passName,
|
||||
const Containers::String& tagName,
|
||||
const Containers::String& tagValue);
|
||||
bool HasPass(const Containers::String& passName) const;
|
||||
const ShaderPass* FindPass(const Containers::String& passName) const;
|
||||
ShaderPass* FindPass(const Containers::String& passName);
|
||||
const ShaderStageVariant* FindVariant(
|
||||
const Containers::String& passName,
|
||||
ShaderType stage,
|
||||
ShaderBackend backend = ShaderBackend::Generic) const;
|
||||
|
||||
class IRHIShader* GetRHIResource() const { return m_rhiResource; }
|
||||
void SetRHIResource(class IRHIShader* resource);
|
||||
|
||||
private:
|
||||
ShaderPass& GetOrCreatePass(const Containers::String& passName);
|
||||
ShaderStageVariant& GetOrCreateLegacyVariant();
|
||||
void SyncLegacyVariant();
|
||||
|
||||
ShaderType m_shaderType = ShaderType::Fragment;
|
||||
ShaderLanguage m_language = ShaderLanguage::GLSL;
|
||||
|
||||
@@ -79,6 +129,7 @@ private:
|
||||
|
||||
Containers::Array<ShaderUniform> m_uniforms;
|
||||
Containers::Array<ShaderAttribute> m_attributes;
|
||||
Containers::Array<ShaderPass> m_passes;
|
||||
|
||||
class IRHIShader* m_rhiResource = nullptr;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user