// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Types/BaseTypes.h"
#include "Engine/Core/Types/String.h"
#include "Config.h"
///
/// The shader program metadata container. Contains description about resources used by the shader.
///
struct FLAXENGINE_API ShaderBindings
{
uint32 InstructionsCount;
uint32 UsedCBsMask;
uint32 UsedSRsMask;
uint32 UsedUAsMask;
bool IsUsingCB(uint32 slotIndex) const
{
return (UsedCBsMask & (1u << slotIndex)) != 0u;
}
bool IsUsingSR(uint32 slotIndex) const
{
return (UsedSRsMask & (1u << slotIndex)) != 0u;
}
bool IsUsingUA(uint32 slotIndex) const
{
return (UsedUAsMask & (1u << slotIndex)) != 0u;
}
};
struct GPUShaderProgramInitializer
{
StringAnsi Name;
ShaderBindings Bindings;
ShaderFlags Flags;
};
///
/// Mini program that can run on the GPU.
///
class FLAXENGINE_API GPUShaderProgram
{
protected:
StringAnsi _name;
ShaderBindings _bindings;
ShaderFlags _flags;
void Init(const GPUShaderProgramInitializer& initializer)
{
_name = initializer.Name;
_bindings = initializer.Bindings;
_flags = initializer.Flags;
}
public:
///
/// Finalizes an instance of the class.
///
virtual ~GPUShaderProgram()
{
}
public:
///
/// Gets name of the shader program
///
/// Name
FORCE_INLINE const StringAnsi& GetName() const
{
return _name;
}
///
/// Gets the shader resource bindings.
///
/// The bindings.
FORCE_INLINE const ShaderBindings& GetBindings() const
{
return _bindings;
}
///
/// Gets the shader flags.
///
/// The flags.
FORCE_INLINE ShaderFlags GetFlags() const
{
return _flags;
}
public:
///
/// Gets shader program stage type
///
/// Shader Stage type
virtual ShaderStage GetStage() const = 0;
///
/// Gets buffer handle (platform dependent)
///
/// Handle
virtual void* GetBufferHandle() const = 0;
///
/// Gets buffer size (in bytes)
///
/// Size of the buffer in bytes
virtual uint32 GetBufferSize() const = 0;
};
///
/// Vertex Shader program.
///
class GPUShaderProgramVS : public GPUShaderProgram
{
public:
///
/// Gets input layout description handle (platform dependent)
///
/// Input layout
virtual void* GetInputLayout() const = 0;
///
/// Gets input layout description size (in bytes)
///
/// Input layout description size in bytes
virtual byte GetInputLayoutSize() const = 0;
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Vertex;
}
};
///
/// Geometry Shader program.
///
class GPUShaderProgramGS : public GPUShaderProgram
{
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Geometry;
}
};
///
/// Hull Shader program.
///
class GPUShaderProgramHS : public GPUShaderProgram
{
protected:
int32 _controlPointsCount;
public:
///
/// Gets the input control points count (valid range: 1-32).
///
FORCE_INLINE int32 GetControlPointsCount() const
{
return _controlPointsCount;
}
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Hull;
}
};
///
/// Domain Shader program.
///
class GPUShaderProgramDS : public GPUShaderProgram
{
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Domain;
}
};
///
/// Pixel Shader program.
///
class GPUShaderProgramPS : public GPUShaderProgram
{
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Pixel;
}
};
///
/// Compute Shader program.
///
class GPUShaderProgramCS : public GPUShaderProgram
{
public:
// [GPUShaderProgram]
ShaderStage GetStage() const override
{
return ShaderStage::Compute;
}
};