Module: vkd3d
Branch: master
Commit: b5c067b41a173e2ab252d5a3588f807c3ade5b2a
URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/b5c067b41a173e2ab252d5a3588f8…
Author: Conor McCarthy <cmccarthy(a)codeweavers.com>
Date: Wed Dec 6 12:37:38 2023 +1000
vkd3d-shader/ir: Do not merge signature elements which have different interpolation modes.
Regression in signature normalisation, however the old code was not
correct either because it would apply the interpolation mode to all
components. Found in an Assassin's Creed: Valhalla shader.
---
libs/vkd3d-shader/ir.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c
index acdb660e..710811c6 100644
--- a/libs/vkd3d-shader/ir.c
+++ b/libs/vkd3d-shader/ir.c
@@ -777,8 +777,9 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map
f = &elements[j];
/* Merge different components of the same register unless sysvals are different,
- * or it will be relative-addressed. */
+ * interpolation modes are different, or it will be relative-addressed. */
if (f->register_index != e->register_index || f->sysval_semantic != e->sysval_semantic
+ || f->interpolation_mode != e->interpolation_mode
|| range_map_get_register_count(range_map, f->register_index, f->mask) > 1)
break;