Module: wine Branch: master Commit: 3baeaa2b886eff05c4589df60c9cc8e8bd76ed41 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3baeaa2b886eff05c4589df60c...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Sun Oct 14 18:40:34 2012 +0200
wined3d: Recognise SM4 scalar swizzles.
---
dlls/wined3d/shader_sm4.c | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index 3def9d8..9b52bd7 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -51,6 +51,9 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode); #define WINED3D_SM4_REGISTER_TYPE_SHIFT 12 #define WINED3D_SM4_REGISTER_TYPE_MASK (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
+#define WINED3D_SM4_SWIZZLE_TYPE_SHIFT 2 +#define WINED3D_SM4_SWIZZLE_TYPE_MASK (0x3 << WINED3D_SM4_SWIZZLE_TYPE_SHIFT) + #define WINED3D_SM4_IMMCONST_TYPE_SHIFT 0 #define WINED3D_SM4_IMMCONST_TYPE_MASK (0x3 << WINED3D_SM4_IMMCONST_TYPE_SHIFT)
@@ -147,6 +150,12 @@ enum wined3d_sm4_input_primitive_type WINED3D_SM4_INPUT_PT_TRIANGLEADJ = 0x7, };
+enum wined3d_sm4_swizzle_type +{ + WINED3D_SM4_SWIZZLE_VEC4 = 0x1, + WINED3D_SM4_SWIZZLE_SCALAR = 0x2, +}; + enum wined3d_sm4_immconst_type { WINED3D_SM4_IMMCONST_SCALAR = 0x1, @@ -609,7 +618,24 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD } else { - src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT; + enum wined3d_sm4_swizzle_type swizzle_type = + (token & WINED3D_SM4_SWIZZLE_TYPE_MASK) >> WINED3D_SM4_SWIZZLE_TYPE_SHIFT; + + switch (swizzle_type) + { + case WINED3D_SM4_SWIZZLE_SCALAR: + src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT; + src_param->swizzle = (src_param->swizzle & 0x3) * 0x55; + break; + + case WINED3D_SM4_SWIZZLE_VEC4: + src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT; + break; + + default: + FIXME("Unhandled swizzle type %#x.\n", swizzle_type); + break; + } }
map_register(priv, &src_param->reg);