Henri Verbeet : wined3d: Add an initial shader_sm4_read_dst_param() implementation.
Alexandre Julliard
julliard at winehq.org
Wed May 6 10:33:15 CDT 2009
Module: wine
Branch: master
Commit: 7f9cde5a31af9bd682f3b3e6b35024fdc822b58f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f9cde5a31af9bd682f3b3e6b35024fdc822b58f
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed May 6 10:05:46 2009 +0200
wined3d: Add an initial shader_sm4_read_dst_param() implementation.
---
dlls/wined3d/shader_sm4.c | 42 ++++++++++++++++++++++++++++++++++++++++--
1 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 99b6523..cdfaa08 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -28,11 +28,31 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
#define WINED3D_SM4_OPCODE_MASK 0xff
+#define WINED3D_SM4_REGISTER_TYPE_SHIFT 12
+#define WINED3D_SM4_REGISTER_TYPE_MASK (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
+
+#define WINED3D_SM4_WRITEMASK_SHIFT 4
+#define WINED3D_SM4_WRITEMASK_MASK (0xf << WINED3D_SM4_WRITEMASK_SHIFT)
+
+enum wined3d_sm4_register_type
+{
+ WINED3D_SM4_RT_TEMP = 0x0,
+ WINED3D_SM4_RT_INPUT = 0x1,
+ WINED3D_SM4_RT_OUTPUT = 0x2,
+};
+
struct wined3d_sm4_data
{
const DWORD *end;
};
+static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] =
+{
+ /* WINED3D_SM4_RT_TEMP */ WINED3DSPR_TEMP,
+ /* WINED3D_SM4_RT_INPUT */ WINED3DSPR_INPUT,
+ /* WINED3D_SM4_RT_OUTPUT */ WINED3DSPR_OUTPUT,
+};
+
static void *shader_sm4_init(const DWORD *byte_code)
{
struct wined3d_sm4_data *priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv));
@@ -88,8 +108,26 @@ static void shader_sm4_read_src_param(const DWORD **ptr, struct wined3d_shader_s
static void shader_sm4_read_dst_param(const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
struct wined3d_shader_src_param *dst_rel_addr, DWORD shader_version)
{
- FIXME("ptr %p, dst_param %p, dst_rel_addr %p, shader_version %#x stub!\n",
- ptr, dst_param, dst_rel_addr, shader_version);
+ DWORD token = *(*ptr)++;
+ UINT register_idx = *(*ptr)++;
+ enum wined3d_sm4_register_type register_type;
+
+ register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
+ if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
+ {
+ FIXME("Unhandled register type %#x\n", register_type);
+ dst_param->register_type = WINED3DSPR_TEMP;
+ }
+ else
+ {
+ dst_param->register_type = register_type_table[register_type];
+ }
+
+ dst_param->register_idx = register_idx;
+ dst_param->write_mask = (token & WINED3D_SM4_WRITEMASK_MASK) >> WINED3D_SM4_WRITEMASK_SHIFT;
+ dst_param->modifiers = 0;
+ dst_param->shift = 0;
+ dst_param->rel_addr = NULL;
}
static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_semantic *semantic)
More information about the wine-cvs
mailing list