Shader/Ast: Treat repeated swizzle as rvalue (cannot be assigned)

This commit is contained in:
Jérôme Leclercq 2022-01-02 22:02:46 +01:00
parent 4fe44339c5
commit b6e4a9470e
1 changed files with 24 additions and 2 deletions

View File

@ -84,11 +84,33 @@ namespace Nz::ShaderAst
void ShaderAstValueCategory::Visit(SwizzleExpression& node)
{
// Swizzling more than a component on a primitive produces a rvalue (a.xxxx cannot be assigned)
if (IsPrimitiveType(GetExpressionType(node)) && node.componentCount > 1)
// Swizzling more than a component on a primitive produces a rvalue (a.xxxx cannot be assigned)
m_expressionCategory = ExpressionCategory::RValue;
else
node.expression->Visit(*this);
{
bool isRVaLue = false;
std::array<bool, 4> used;
used.fill(false);
for (std::size_t i = 0; i < node.componentCount; ++i)
{
if (used[node.components[i]])
{
// Swizzling the same component multiple times produces a rvalue (a.xx cannot be assigned)
isRVaLue = true;
break;
}
used[node.components[i]] = true;
}
if (isRVaLue)
m_expressionCategory = ExpressionCategory::RValue;
else
node.expression->Visit(*this);
}
}
void ShaderAstValueCategory::Visit(VariableExpression& /*node*/)