-
Notifications
You must be signed in to change notification settings - Fork 180
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix output for matrix multiple in GLSL code (#228)
When Slang sees a matrix multiplication `M * v` in GLSL code it should (obviously) output GLSL code that also does `M * v`, but there was a bug introduced where the type-checker manages to resolve the operation and recognize it as a matrix-vector multiply, and then the code-generation logic says "oh, I'm generating output for GLSL, and that is reversed from HLSL/Slang, so I'd better reverse these operands!" and outputs `v * M`... which isn't what we want. I've fixed the problem in an expedient way, by having the front-end resolve the operation to what it believes is an intrinsic multiply operation, rather than a matrix-vector operation. If we ever support cross compilation *from* GLSL (unlikely), we've need to fix this up so that we have both real matrix-vector multiplies and "reversed" multiplies where the operands folow the GLSL convention). I've added two tests here to confirm the fix. The one under `tests/bugs` catches the actual issue described above, and confirms the fix. The other one under `tests/cross-compile` is just to make sure that we *do* properly reverse the operands to a matrix-vector product when converting from Slang to GLSL.
- Loading branch information
Tim Foley
authored
Oct 23, 2017
1 parent
624d122
commit ab64cf2
Showing
5 changed files
with
73 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
//TEST:COMPARE_GLSL:-profile glsl_fragment_450 -no-checking | ||
// matrix-mult.glsl | ||
#version 450 | ||
|
||
// Confirm that we don't exchange the operands | ||
// to a matrix-vector multiply when we recognize | ||
// one in "raw" GLSL code. | ||
|
||
#ifdef __SLANG__ | ||
__import empty; | ||
#endif | ||
|
||
layout(binding = 0) | ||
uniform C | ||
{ | ||
mat4x4 m; | ||
}; | ||
|
||
layout(location = 0) | ||
in vec4 v; | ||
|
||
layout(location = 0) | ||
out vec4 r; | ||
|
||
void main() | ||
{ | ||
r = m * v; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
//TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly | ||
|
||
// Confirm that order of arguments to matrix-vector | ||
// multiplication gets reversed when generating GLSL. | ||
|
||
cbuffer C | ||
{ | ||
float4x3 m; | ||
}; | ||
|
||
float4 main(float3 v) : SV_Target | ||
{ | ||
return mul(m, v); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
//TEST_IGNORE_FILE: | ||
|
||
layout(binding = 0) | ||
uniform C | ||
{ | ||
mat4x3 m; | ||
}; | ||
|
||
vec4 main_(vec3 v) | ||
{ | ||
return v * m; | ||
} | ||
|
||
layout(location = 0) | ||
in vec3 SLANG_in_v; | ||
|
||
layout(location = 0) | ||
out vec4 SLANG_out_main_result; | ||
|
||
void main() | ||
{ | ||
vec3 v = SLANG_in_v; | ||
vec4 main_result = main_(v); | ||
SLANG_out_main_result = main_result; | ||
} |