From bc7426ceb02849e690cacc155c832f874fd86760 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 9 Jun 2020 13:01:54 +0200 Subject: [PATCH] vkd3d-shader: Fix modifier handling. This is a set of flags, so we should treat it as such. Signed-off-by: Philip Rebohle --- libs/vkd3d-shader/dxbc.c | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 53ef2beb..2ba534bb 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -1538,30 +1538,19 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr } m = *(*ptr)++; - switch (m) + switch (m & 0xc0) { - case 0x41: - *modifier = VKD3DSPSM_NEG; - break; - - case 0x81: - *modifier = VKD3DSPSM_ABS; - break; - - case 0xc1: - *modifier = VKD3DSPSM_ABSNEG; - break; - - case 0x20001: - param->modifier = VKD3DSPRM_NONUNIFORM; - *modifier = VKD3DSPSM_NONE; - break; - - default: - FIXME("Skipping modifier 0x%08x.\n", m); - *modifier = VKD3DSPSM_NONE; - break; + case 0x00: *modifier = VKD3DSPSM_NONE; break; + case 0x40: *modifier = VKD3DSPSM_NEG; break; + case 0x80: *modifier = VKD3DSPSM_ABS; break; + case 0xc0: *modifier = VKD3DSPSM_ABSNEG; break; } + + if (m & 0x20000) + param->modifier = VKD3DSPRM_NONUNIFORM; + + if ((m &= ~(0x200c1))) + FIXME("Skipping modifier 0x%08x.\n", m); } else {