wined3d: Use shader_get_param() in trace pass, reg. count pass, generation pass.
Change the trace pass, the register counting pass, and the hw
generator pass to take into account the new get_params() function. For
hw generation, store the address tokens into the SHADER_OPCODE_ARG
structure, so they're available to generator functions.
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index abf5019..f69f0ab 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -4,6 +4,7 @@
* Copyright 2002-2003 Jason Edmeades
* Copyright 2002-2003 Raphael Junqueira
* Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -214,13 +215,17 @@
int i;
for (i = 0; i < curOpcode->num_params; ++i) {
- DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
- DWORD reg = (*pToken) & D3DSP_REGNUM_MASK;
+
+ DWORD param, addr_token, reg, regtype;
+ pToken += shader_get_param(iface, pToken, ¶m, &addr_token);
+
+ regtype = (param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT;
+ reg = param & D3DSP_REGNUM_MASK;
+
if (D3DSPR_TEXTURE == regtype)
*texUsed |= (1 << reg);
if (D3DSPR_TEMP == regtype)
*tempsUsed |= (1 << reg);
- ++pToken;
}
}
}
@@ -563,12 +568,33 @@
hw_arg.shader = iface;
hw_arg.opcode = curOpcode;
hw_arg.buffer = buffer;
- if (curOpcode->num_params > 0) {
- hw_arg.dst = *pToken;
- /* FIXME: this does not account for relative address tokens */
- for (i = 1; i < curOpcode->num_params; i++)
- hw_arg.src[i-1] = *(pToken + i);
+ if (curOpcode->num_params > 0) {
+
+ DWORD param, addr_token = 0;
+
+ /* DCL instruction has usage dst parameter, not register */
+ if (curOpcode->opcode == D3DSIO_DCL)
+ param = *pToken++;
+ else
+ pToken += shader_get_param(iface, pToken, ¶m, &addr_token);
+
+ hw_arg.dst = param;
+ hw_arg.dst_addr = addr_token;
+
+ for (i = 1; i < curOpcode->num_params; i++) {
+ /* DEF* instructions have constant src parameters, not registers */
+ if (curOpcode->opcode == D3DSIO_DEF ||
+ curOpcode->opcode == D3DSIO_DEFI ||
+ curOpcode->opcode == D3DSIO_DEFB) {
+ param = *pToken++;
+
+ } else
+ pToken += shader_get_param(iface, pToken, ¶m, &addr_token);
+
+ hw_arg.src[i-1] = param;
+ hw_arg.src_addr[i-1] = addr_token;
+ }
}
/* Call appropriate function for output target */
@@ -577,8 +603,6 @@
else
curOpcode->hw_fct(&hw_arg);
- pToken += curOpcode->num_params;
-
} else {
/* Unless we encounter a no-op command, this opcode is unrecognized */
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index 4c109e2..afee2fd 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -4,6 +4,7 @@
* Copyright 2002-2003 Jason Edmeades
* Copyright 2002-2003 Raphael Junqueira
* Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1448,18 +1449,31 @@
++pToken;
++len;
} else {
+
+ DWORD param, addr_token;
+ int tokens_read;
+
TRACE("%s", curOpcode->name);
if (curOpcode->num_params > 0) {
- shader_dump_ins_modifiers(*pToken);
+
+ tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+ pToken, ¶m, &addr_token);
+ pToken += tokens_read;
+ len += tokens_read;
+
+ shader_dump_ins_modifiers(param);
TRACE(" ");
- shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0);
- ++pToken;
- ++len;
+ shader_dump_param((IWineD3DBaseShader*) This, param, 0);
+
for (i = 1; i < curOpcode->num_params; ++i) {
+
+ tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+ pToken, ¶m, &addr_token);
+ pToken += tokens_read;
+ len += tokens_read;
+
TRACE(", ");
- shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1);
- ++pToken;
- ++len;
+ shader_dump_param((IWineD3DBaseShader*) This, param, 1);
}
}
}
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index fc68c71..9b46866 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -4,6 +4,7 @@
* Copyright 2002-2003 Jason Edmeades
* Copyright 2002-2003 Raphael Junqueira
* Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1570,18 +1571,31 @@
++pToken;
++len;
} else {
+
+ DWORD param, addr_token;
+ int tokens_read;
+
TRACE("%s", curOpcode->name);
if (curOpcode->num_params > 0) {
- shader_dump_ins_modifiers(*pToken);
+
+ tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+ pToken, ¶m, &addr_token);
+ pToken += tokens_read;
+ len += tokens_read;
+
+ shader_dump_ins_modifiers(param);
TRACE(" ");
- shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0);
- ++pToken;
- ++len;
+ shader_dump_param((IWineD3DBaseShader*) This, param, 0);
+
for (i = 1; i < curOpcode->num_params; ++i) {
+
+ tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+ pToken, ¶m, &addr_token);
+ pToken += tokens_read;
+ len += tokens_read;
+
TRACE(", ");
- shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1);
- ++pToken;
- ++len;
+ shader_dump_param((IWineD3DBaseShader*) This, param, 1);
}
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 34d512e..1227b3f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1295,7 +1295,9 @@
IWineD3DBaseShader* shader;
CONST SHADER_OPCODE* opcode;
DWORD dst;
+ DWORD dst_addr;
DWORD src[4];
+ DWORD src_addr[4];
SHADER_BUFFER* buffer;
} SHADER_OPCODE_ARG;