Skip to content

Commit 22e9918

Browse files
committed
Bug: Unable to perform vector arithmetic when one side has multi-value expression.
E.g. vec2(1, 2) + vec2(3, 4) works vec2(1, 2) + vec2(1. + 2., 4) fails
1 parent b6f23da commit 22e9918

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

ShaderShrinker/Shrinker.Parser/Optimizations/PerformArithmeticExtension.cs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -323,34 +323,38 @@ public static bool PerformArithmetic(this SyntaxNode rootNode)
323323
{
324324
// Find the second vector.
325325
var rhsVectorNode = symbolNode.Next;
326-
if (rhsVectorNode?.Token is TypeToken t && t.IsVector())
327-
{
328-
var rhsVectorBrackets = rhsVectorNode.Next as RoundBracketSyntaxNode;
329-
if (IsSafeToPerformMath(vectorNode, symbol, rhsVectorNode))
330-
{
331-
// Ensure both brackets have the same number of elements.
332-
var lhsCsv = brackets.GetCsv().ToList();
333-
var rhsCsv = rhsVectorBrackets.GetCsv().ToList();
334-
while (lhsCsv.Count < rhsCsv.Count)
335-
lhsCsv.Add(new[] { lhsCsv.First().Single().Clone() });
336-
while (rhsCsv.Count < lhsCsv.Count)
337-
rhsCsv.Add(new[] { rhsCsv.First().Single().Clone() });
338-
339-
// Perform math on each bracketed value.
340-
var newCsv =
341-
lhsCsv
342-
.Select((o, i) => DoNodeMath(o.Single(), symbolNode, rhsCsv[i].Single()))
343-
.Select(o => new GenericSyntaxNode(FloatToken.From(o, MaxDp).AsIntIfPossible()));
344-
345-
// Replace bracket content and sum.
346-
brackets.ReplaceWith(new RoundBracketSyntaxNode(newCsv.ToCsv()));
347-
symbolNode.Remove();
348-
rhsVectorNode.Remove();
349-
rhsVectorBrackets.Remove();
326+
if (rhsVectorNode?.Token is not TypeToken t || !t.IsVector())
327+
continue;
328+
329+
var rhsVectorBrackets = rhsVectorNode.Next as RoundBracketSyntaxNode;
330+
if (!IsSafeToPerformMath(vectorNode, symbol, rhsVectorNode))
331+
continue;
332+
333+
// Ensure both brackets have the same number of elements.
334+
var lhsCsv = brackets.GetCsv().ToList();
335+
var rhsCsv = rhsVectorBrackets.GetCsv().ToList();
336+
while (lhsCsv.Count < rhsCsv.Count)
337+
lhsCsv.Add(new[] { lhsCsv.First().Single().Clone() });
338+
while (rhsCsv.Count < lhsCsv.Count)
339+
rhsCsv.Add(new[] { rhsCsv.First().Single().Clone() });
340+
341+
// Don't yet support 'vecN(f) * vecN(a * b, ...)'
342+
if (lhsCsv.Any(o => o.Count > 1) || rhsCsv.Any(o => o.Count > 1))
343+
continue;
344+
345+
// Perform math on each bracketed value.
346+
var newCsv =
347+
lhsCsv
348+
.Select((o, i) => DoNodeMath(o.Single(), symbolNode, rhsCsv[i].Single()))
349+
.Select(o => new GenericSyntaxNode(FloatToken.From(o, MaxDp).AsIntIfPossible()));
350+
351+
// Replace bracket content and sum.
352+
brackets.ReplaceWith(new RoundBracketSyntaxNode(newCsv.ToCsv()));
353+
symbolNode.Remove();
354+
rhsVectorNode.Remove();
355+
rhsVectorBrackets.Remove();
350356

351-
didChange = true;
352-
}
353-
}
357+
didChange = true;
354358
}
355359
}
356360
}

ShaderShrinker/UnitTests/VectorArithmeticTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,8 @@ public void CheckArithmeticWithVectorAndVector(
417417
"vec2 f = vec2(3, 4) + vec2(5);",
418418
"vec2 f = vec2(3) + vec2(4, 5);",
419419
"vec2 v = vec2(1, 2), f = v * vec2(1.1, 2.2) + vec2(6, 7);",
420-
"vec2 v = vec2(1, 2), f = vec2(1.1, 2.2) + vec2(6, 7) * v;")] string code,
420+
"vec2 v = vec2(1, 2), f = vec2(1.1, 2.2) + vec2(6, 7) * v;",
421+
"vec2 f = vec2(3, 4) + vec2(1. * 2., 3);")] string code,
421422
[Values("vec2 f = vec2(2.1, 4.2);",
422423
"vec2 f = vec2(8.1, 11.2);",
423424
"vec2 f = vec2(7.1, 9.2);",
@@ -436,7 +437,8 @@ public void CheckArithmeticWithVectorAndVector(
436437
"vec2 f = vec2(8, 9);",
437438
"vec2 f = vec2(7, 8);",
438439
"vec2 v = vec2(1, 2), f = v * vec2(1.1, 2.2) + vec2(6, 7);",
439-
"vec2 v = vec2(1, 2), f = vec2(1.1, 2.2) + vec2(6, 7) * v;")] string expected)
440+
"vec2 v = vec2(1, 2), f = vec2(1.1, 2.2) + vec2(6, 7) * v;",
441+
"vec2 f = vec2(5, 7);")] string expected)
440442
{
441443
var lexer = new Lexer();
442444
lexer.Load(code);

0 commit comments

Comments
 (0)