[WINED3D 1/3] Share get_register_code()
Ivan Gyurdiev
ivg2 at cornell.edu
Fri Apr 28 03:57:24 CDT 2006
[I've started using Git, and those patches are against
Mike McCormack's temporary git tree, which incorporates
all relevant previously sent changes. ]
Move Roderick's new function for obtaining the register code into
wined3d_private.h, and use it in both pixel and vertex shaders. Again,
this function makes the way the register code is obtained consistent,
and makes extended registers visible everywhere by taking into account
the correct masks (using the high 2 bits).
---
dlls/wined3d/pixelshader.c | 16 ++++------------
dlls/wined3d/vertexshader.c | 25 ++++++++++---------------
dlls/wined3d/wined3d_private.h | 5 +++++
3 files changed, 19 insertions(+), 27 deletions(-)
6b5d7d874ef7ef1089bf42ca5780fedcc42b7e1d
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index cb14a83..d097242 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -732,7 +732,7 @@ inline static void get_register_name(con
static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2",
"oC3", "oDepth" };
DWORD reg = param & D3DSP_REGNUM_MASK;
- DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
+ DWORD regtype = shader_get_regtype(param);
switch (regtype) {
case D3DSPR_TEMP:
@@ -944,7 +944,7 @@ inline static void pshader_program_get_r
int i;
for (i = 0; i < curOpcode->num_params; ++i) {
- DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >>
D3DSP_REGTYPE_SHIFT);
+ DWORD regtype = shader_get_regtype(*pToken);
DWORD reg = (*pToken) & D3DSP_REGNUM_MASK;
if (D3DSPR_TEXTURE == regtype)
*texUsed |= (1 << reg);
@@ -1545,14 +1545,8 @@ inline static void pshader_program_dump_
static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2",
"oC3", "oDepth" };
static const char swizzle_reg_chars[] = "rgba";
- /* the unknown mask is for bits not yet accounted for by any other
mask... */
-#define UNKNOWN_MASK 0xC000
-
- /* for registeres about 7 we have to add on bits 11 and 12 to get
the correct register */
-#define EXTENDED_REG 0x1800
-
DWORD reg = param & D3DSP_REGNUM_MASK;
- DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT)
| ((param & EXTENDED_REG) >> 8);
+ DWORD regtype = shader_get_regtype(param);
if (input) {
if ( ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) ||
@@ -1668,9 +1662,7 @@ inline static void pshader_program_dump_
inline static void pshader_program_dump_decl_usage(
IWineD3DPixelShaderImpl *This, DWORD decl, DWORD param) {
- DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >>
D3DSP_REGTYPE_SHIFT) |
- ((param & D3DSP_REGTYPE_MASK2) >>
D3DSP_REGTYPE_SHIFT2);
-
+ DWORD regtype = shader_get_regtype(param);
TRACE("dcl_");
if (regtype == D3DSPR_SAMPLER) {
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 318af15..0d3b8d7 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -554,17 +554,12 @@ CONST SHADER_OPCODE IWineD3DVertexShader
{0, NULL, NULL, 0, NULL, 0, 0}
};
-inline static int vshader_program_get_regtype(const DWORD param) {
- return (((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) |
- ((param & D3DSP_REGTYPE_MASK2) >>
D3DSP_REGTYPE_SHIFT2));
-}
-
inline static void vshader_program_dump_param(const DWORD param, int
input) {
static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" };
static const char swizzle_reg_chars[] = "xyzw";
DWORD reg = param & D3DSP_REGNUM_MASK;
- DWORD regtype = vshader_program_get_regtype(param);
+ DWORD regtype = shader_get_regtype(param);
if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");
@@ -635,11 +630,11 @@ inline static void vshader_program_dump_
static const char swizzle_reg_chars[] = "xyzw";
DWORD reg = param & D3DSP_REGNUM_MASK;
- DWORD regtype = vshader_program_get_regtype(param);
+ DWORD regtype = shader_get_regtype(param);
if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");
- switch (regtype /*<< D3DSP_REGTYPE_SHIFT*/) {
+ switch (regtype) {
case D3DSPR_TEMP:
TRACE("r%lu", reg);
break;
@@ -718,7 +713,7 @@ inline static void vshader_program_dump_
inline static void vshader_program_dump_decl_usage(
IWineD3DVertexShaderImpl *This, DWORD decl, DWORD param) {
- DWORD regtype = vshader_program_get_regtype(param);
+ DWORD regtype = shader_get_regtype(param);
TRACE("dcl_");
@@ -864,7 +859,7 @@ inline static void vshader_program_add_p
static const char* hwrastout_reg_names[] = { "result.position",
"result.fogcoord", "result.pointsize" };
DWORD reg = param & D3DSP_REGNUM_MASK;
- DWORD regtype = vshader_program_get_regtype(param);
+ DWORD regtype = shader_get_regtype(param);
char tmpReg[255];
BOOL is_color = FALSE;
@@ -1236,7 +1231,7 @@ inline static VOID IWineD3DVertexShaderI
} else {
/* Check to see if and tmp or addressing redisters
are used */
if (curOpcode->num_params > 0) {
- regtype = vshader_program_get_regtype(*pToken);
+ regtype = shader_get_regtype(*pToken);
reg = ((*pToken) & D3DSP_REGNUM_MASK);
if (D3DSPR_ADDR == regtype &&
nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
if (D3DSPR_TEMP == regtype){
@@ -1245,7 +1240,7 @@ inline static VOID IWineD3DVertexShaderI
}
++pToken;
for (i = 1; i < curOpcode->num_params; ++i) {
- regtype = vshader_program_get_regtype(*pToken);
+ regtype = shader_get_regtype(*pToken);
reg = ((*pToken) & D3DSP_REGNUM_MASK);
if (D3DSPR_ADDR == regtype &&
nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
if (D3DSPR_TEMP == regtype){
@@ -1451,7 +1446,7 @@ inline static VOID IWineD3DVertexShaderI
continue;
case D3DSIO_MOV:
/* Address registers must be loaded with the ARL
instruction */
- if (vshader_program_get_regtype(*pToken) == D3DSPR_ADDR) {
+ if (shader_get_regtype(*pToken) == D3DSPR_ADDR) {
if (((*pToken) & D3DSP_REGNUM_MASK) <
nUseAddressRegister) {
strcpy(tmpLine, "ARL");
break;
@@ -1640,9 +1635,9 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_
/* TRACE(">> execting opcode: pos=%d opcode_name=%s
token=%08lX\n", pToken - vshader->function, curOpcode->name, *pToken); */
for (i = 0; i < curOpcode->num_params; ++i) {
DWORD reg = pToken[i] & D3DSP_REGNUM_MASK;
- DWORD regtype = vshader_program_get_regtype(pToken[i]);
+ DWORD regtype = shader_get_regtype(pToken[i]);
- switch (regtype /*<< D3DSP_REGTYPE_SHIFT*/) {
+ switch (regtype) {
case D3DSPR_TEMP:
/* TRACE("p[%d]=R[%d]\n", i, reg); */
p[i] = &R[reg];
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8e372e5..0be6398 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1216,6 +1216,11 @@ extern const SHADER_OPCODE* shader_get_o
IWineD3DBaseShader *iface,
const DWORD code);
+inline static int shader_get_regtype(const DWORD param) {
+ return (((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) |
+ ((param & D3DSP_REGTYPE_MASK2) >> D3DSP_REGTYPE_SHIFT2));
+}
+
/*****************************************************************************
* IDirect3DBaseShader implementation structure
*/
--
1.2.6
More information about the wine-patches
mailing list