=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Accept multiple instruction modifiers in SM4+ shaders.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Apr 22 09:55:15 CDT 2016
Module: wine
Branch: master
Commit: 807c4514d05223266916ae58cc41ed18f998683b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=807c4514d05223266916ae58cc41ed18f998683b
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Apr 22 11:18:44 2016 +0200
wined3d: Accept multiple instruction modifiers in SM4+ shaders.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/shader_sm4.c | 66 +++++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 31 deletions(-)
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 5933626..35e6659 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -1146,11 +1146,42 @@ static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD
return TRUE;
}
+static void shader_sm4_read_instruction_modifier(DWORD modifier, struct wined3d_shader_instruction *ins)
+{
+ static const DWORD recognized_bits = WINED3D_SM4_INSTRUCTION_MODIFIER
+ | WINED3D_SM4_MODIFIER_AOFFIMMI
+ | WINED3D_SM4_AOFFIMMI_U_MASK
+ | WINED3D_SM4_AOFFIMMI_V_MASK
+ | WINED3D_SM4_AOFFIMMI_W_MASK;
+
+ if (modifier & ~recognized_bits)
+ {
+ FIXME("Unhandled modifier 0x%08x.\n", modifier);
+ }
+ else
+ {
+ /* Bit fields are used for sign extension */
+ struct
+ {
+ int u : 4;
+ int v : 4;
+ int w : 4;
+ }
+ aoffimmi;
+ aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
+ aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
+ aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
+ ins->texel_offset.u = aoffimmi.u;
+ ins->texel_offset.v = aoffimmi.v;
+ ins->texel_offset.w = aoffimmi.w;
+ }
+}
+
static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins)
{
const struct wined3d_sm4_opcode_info *opcode_info;
+ DWORD opcode_token, opcode, previous_token;
struct wined3d_sm4_data *priv = data;
- DWORD opcode_token, opcode;
unsigned int i, len;
const DWORD *p;
@@ -1195,36 +1226,9 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
p = *ptr;
*ptr += len;
- if (opcode_token & WINED3D_SM4_INSTRUCTION_MODIFIER)
- {
- static const DWORD recognized_bits = WINED3D_SM4_MODIFIER_AOFFIMMI
- | WINED3D_SM4_AOFFIMMI_U_MASK
- | WINED3D_SM4_AOFFIMMI_V_MASK
- | WINED3D_SM4_AOFFIMMI_W_MASK;
- DWORD modifier = *p++;
- /* Bit fields are used for sign extension */
- struct
- {
- int u : 4;
- int v : 4;
- int w : 4;
- }
- aoffimmi;
-
- if (modifier & ~recognized_bits)
- {
- FIXME("Skipping modifier 0x%08x.\n", modifier);
- }
- else
- {
- aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
- aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
- aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
- ins->texel_offset.u = aoffimmi.u;
- ins->texel_offset.v = aoffimmi.v;
- ins->texel_offset.w = aoffimmi.w;
- }
- }
+ previous_token = opcode_token;
+ while (previous_token & WINED3D_SM4_INSTRUCTION_MODIFIER)
+ shader_sm4_read_instruction_modifier(previous_token = *p++, ins);
if (opcode_info->read_opcode_func)
{
More information about the wine-cvs
mailing list