diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-10-14 16:51:49 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-10-27 14:07:09 +0300 |
commit | e47561a28b388361b71f71b3c33dae2da9505f28 (patch) | |
tree | df17a5feccc0a83c524a8400872931bb9a16b0b5 /reference/shaders | |
parent | 5ae9153a782698e26a39660cb4fcb02ac424c859 (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')
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; |