Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2020-10-14 16:51:49 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2020-10-27 14:07:09 +0300
commite47561a28b388361b71f71b3c33dae2da9505f28 (patch)
treedf17a5feccc0a83c524a8400872931bb9a16b0b5 /reference/shaders
parent5ae9153a782698e26a39660cb4fcb02ac424c859 (diff)
GLSL: Support a workaround for loading row-major matrices.
On AMD Windows OpenGL, it has been reported that we need to load matrices via a wrapper function.
Diffstat (limited to 'reference/shaders')
-rw-r--r--reference/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag4
-rw-r--r--reference/shaders/frag/ubo-load-row-major-workaround.frag48
-rw-r--r--reference/shaders/legacy/vert/transpose.legacy.vert10
-rw-r--r--reference/shaders/vert/read-from-row-major-array.vert4
4 files changed, 60 insertions, 6 deletions
diff --git a/reference/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag b/reference/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag
index e1edccff..4302113d 100644
--- a/reference/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag
+++ b/reference/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag
@@ -10,6 +10,8 @@ layout(binding = 0, std140) uniform Foo
layout(location = 0) in vec3 fragWorld;
layout(location = 0) out int _entryPointOutput;
+mat4 SPIRV_Cross_workaround_load_row_major(mat4 wrap) { return wrap; }
+
mat4 GetClip2TexMatrix()
{
if (_11.test == 0)
@@ -23,7 +25,7 @@ int GetCascade(vec3 fragWorldPosition)
{
for (uint cascadeIndex = 0u; cascadeIndex < _11.shadowCascadesNum; cascadeIndex++)
{
- mat4 worldToShadowMap = GetClip2TexMatrix() * _11.lightVP[cascadeIndex];
+ mat4 worldToShadowMap = GetClip2TexMatrix() * SPIRV_Cross_workaround_load_row_major(_11.lightVP[cascadeIndex]);
vec4 fragShadowMapPos = worldToShadowMap * vec4(fragWorldPosition, 1.0);
if ((((fragShadowMapPos.z >= 0.0) && (fragShadowMapPos.z <= 1.0)) && (max(fragShadowMapPos.x, fragShadowMapPos.y) <= 1.0)) && (min(fragShadowMapPos.x, fragShadowMapPos.y) >= 0.0))
{
diff --git a/reference/shaders/frag/ubo-load-row-major-workaround.frag b/reference/shaders/frag/ubo-load-row-major-workaround.frag
new file mode 100644
index 00000000..95b0eda7
--- /dev/null
+++ b/reference/shaders/frag/ubo-load-row-major-workaround.frag
@@ -0,0 +1,48 @@
+#version 450
+
+struct RowMajor
+{
+ mat4 B;
+};
+
+struct NestedRowMajor
+{
+ RowMajor rm;
+};
+
+layout(binding = 2, std140) uniform UBO3
+{
+ layout(row_major) NestedRowMajor rm2;
+} _17;
+
+layout(binding = 1, std140) uniform UBO2
+{
+ layout(row_major) RowMajor rm;
+} _35;
+
+layout(binding = 0, std140) uniform UBO
+{
+ layout(row_major) mat4 A;
+ mat4 C;
+} _42;
+
+layout(binding = 3, std140) uniform UBONoWorkaround
+{
+ mat4 D;
+} _56;
+
+layout(location = 0) out vec4 FragColor;
+layout(location = 0) in vec4 Clip;
+
+NestedRowMajor SPIRV_Cross_workaround_load_row_major(NestedRowMajor wrap) { return wrap; }
+mat4 SPIRV_Cross_workaround_load_row_major(mat4 wrap) { return wrap; }
+
+void main()
+{
+ NestedRowMajor rm2_loaded;
+ rm2_loaded.rm.B = SPIRV_Cross_workaround_load_row_major(_17.rm2).rm.B;
+ FragColor = (((rm2_loaded.rm.B * SPIRV_Cross_workaround_load_row_major(_35.rm.B)) * SPIRV_Cross_workaround_load_row_major(_42.A)) * SPIRV_Cross_workaround_load_row_major(_42.C)) * Clip;
+ FragColor += (_56.D * Clip);
+ FragColor += (_42.A[1] * Clip);
+}
+
diff --git a/reference/shaders/legacy/vert/transpose.legacy.vert b/reference/shaders/legacy/vert/transpose.legacy.vert
index c73d1a11..2683d172 100644
--- a/reference/shaders/legacy/vert/transpose.legacy.vert
+++ b/reference/shaders/legacy/vert/transpose.legacy.vert
@@ -11,12 +11,14 @@ uniform Buffer _13;
attribute vec4 Position;
+mat4 SPIRV_Cross_workaround_load_row_major(mat4 wrap) { return wrap; }
+
void main()
{
- vec4 c0 = _13.M * (Position * _13.MVPRowMajor);
- vec4 c1 = _13.M * (_13.MVPColMajor * Position);
- vec4 c2 = _13.M * (_13.MVPRowMajor * Position);
- vec4 c3 = _13.M * (Position * _13.MVPColMajor);
+ vec4 c0 = SPIRV_Cross_workaround_load_row_major(_13.M) * (Position * _13.MVPRowMajor);
+ vec4 c1 = SPIRV_Cross_workaround_load_row_major(_13.M) * (SPIRV_Cross_workaround_load_row_major(_13.MVPColMajor) * Position);
+ vec4 c2 = SPIRV_Cross_workaround_load_row_major(_13.M) * (_13.MVPRowMajor * Position);
+ vec4 c3 = SPIRV_Cross_workaround_load_row_major(_13.M) * (Position * SPIRV_Cross_workaround_load_row_major(_13.MVPColMajor));
gl_Position = ((c0 + c1) + c2) + c3;
}
diff --git a/reference/shaders/vert/read-from-row-major-array.vert b/reference/shaders/vert/read-from-row-major-array.vert
index 1c950f3f..3b77687f 100644
--- a/reference/shaders/vert/read-from-row-major-array.vert
+++ b/reference/shaders/vert/read-from-row-major-array.vert
@@ -8,6 +8,8 @@ layout(binding = 0, std140) uniform Block
layout(location = 0) in vec4 a_position;
layout(location = 0) out mediump float v_vtxResult;
+mat2x3 SPIRV_Cross_workaround_load_row_major(mat2x3 wrap) { return wrap; }
+
mediump float compare_float(float a, float b)
{
return float(abs(a - b) < 0.0500000007450580596923828125);
@@ -37,7 +39,7 @@ void main()
{
gl_Position = a_position;
mediump float result = 1.0;
- mat2x3 param = _104.var[0][0];
+ mat2x3 param = SPIRV_Cross_workaround_load_row_major(_104.var[0][0]);
mat2x3 param_1 = mat2x3(vec3(2.0, 6.0, -6.0), vec3(0.0, 5.0, 5.0));
result *= compare_mat2x3(param, param_1);
v_vtxResult = result;