Add initial support for shader binding sets (WIP)
This commit is contained in:
@@ -29,7 +29,7 @@ namespace Nz
|
||||
|
||||
struct LangWriter::BindingAttribute
|
||||
{
|
||||
std::optional<unsigned int> bindingIndex;
|
||||
std::optional<UInt32> bindingIndex;
|
||||
|
||||
inline bool HasValue() const { return bindingIndex.has_value(); }
|
||||
};
|
||||
@@ -71,11 +71,18 @@ namespace Nz
|
||||
|
||||
struct LangWriter::LocationAttribute
|
||||
{
|
||||
std::optional<unsigned int> locationIndex;
|
||||
std::optional<UInt32> locationIndex;
|
||||
|
||||
inline bool HasValue() const { return locationIndex.has_value(); }
|
||||
};
|
||||
|
||||
struct LangWriter::SetAttribute
|
||||
{
|
||||
std::optional<UInt32> setIndex;
|
||||
|
||||
inline bool HasValue() const { return setIndex.has_value(); }
|
||||
};
|
||||
|
||||
struct LangWriter::State
|
||||
{
|
||||
const States* states = nullptr;
|
||||
@@ -87,7 +94,7 @@ namespace Nz
|
||||
unsigned int indentLevel = 0;
|
||||
};
|
||||
|
||||
std::string LangWriter::Generate(ShaderAst::StatementPtr& shader, const States& states)
|
||||
std::string LangWriter::Generate(ShaderAst::Statement& shader, const States& states)
|
||||
{
|
||||
State state;
|
||||
m_currentState = &state;
|
||||
@@ -220,8 +227,10 @@ namespace Nz
|
||||
if (!hasAnyAttribute)
|
||||
return;
|
||||
|
||||
bool first = true;
|
||||
|
||||
Append("[");
|
||||
(AppendAttribute(params), ...);
|
||||
AppendAttributesInternal(first, std::forward<Args>(params)...);
|
||||
Append("]");
|
||||
|
||||
if (appendLine)
|
||||
@@ -230,6 +239,27 @@ namespace Nz
|
||||
Append(" ");
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LangWriter::AppendAttributesInternal(bool& first, const T& param)
|
||||
{
|
||||
if (!param.HasValue())
|
||||
return;
|
||||
|
||||
if (!first)
|
||||
Append(", ");
|
||||
|
||||
first = false;
|
||||
|
||||
AppendAttribute(param);
|
||||
}
|
||||
|
||||
template<typename T1, typename T2, typename... Rest>
|
||||
void LangWriter::AppendAttributesInternal(bool& first, const T1& firstParam, const T2& secondParam, Rest&&... params)
|
||||
{
|
||||
AppendAttributesInternal(first, firstParam);
|
||||
AppendAttributesInternal(first, secondParam, std::forward<Rest>(params)...);
|
||||
}
|
||||
|
||||
void LangWriter::AppendAttribute(BindingAttribute binding)
|
||||
{
|
||||
if (!binding.HasValue())
|
||||
@@ -333,6 +363,14 @@ namespace Nz
|
||||
Append("location(", *location.locationIndex, ")");
|
||||
}
|
||||
|
||||
void LangWriter::AppendAttribute(SetAttribute set)
|
||||
{
|
||||
if (!set.HasValue())
|
||||
return;
|
||||
|
||||
Append("set(", *set.setIndex, ")");
|
||||
}
|
||||
|
||||
void LangWriter::AppendCommentSection(const std::string& section)
|
||||
{
|
||||
NazaraAssert(m_currentState, "This function should only be called while processing an AST");
|
||||
@@ -607,7 +645,7 @@ namespace Nz
|
||||
|
||||
first = false;
|
||||
|
||||
AppendAttributes(false, BindingAttribute{ externalVar.bindingIndex });
|
||||
AppendAttributes(false, SetAttribute{ externalVar.bindingSet }, BindingAttribute{ externalVar.bindingIndex });
|
||||
Append(externalVar.name, ": ", externalVar.type);
|
||||
|
||||
RegisterVariable(varIndex++, externalVar.name);
|
||||
|
||||
Reference in New Issue
Block a user