wined3d: Use shader_sm1_read_opcode() in shader_trace_init().

This commit is contained in:
Henri Verbeet 2009-04-27 09:37:14 +02:00 committed by Alexandre Julliard
parent 2b07565d6e
commit 15953b94b6
1 changed files with 101 additions and 111 deletions

View File

@ -1171,9 +1171,7 @@ static void shader_dump_ins_modifiers(const DWORD output)
void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table) void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table)
{ {
const DWORD* pToken = pFunction; const DWORD* pToken = pFunction;
const SHADER_OPCODE* curOpcode = NULL;
DWORD shader_version; DWORD shader_version;
DWORD opcode_token;
DWORD i; DWORD i;
TRACE("Parsing %p\n", pFunction); TRACE("Parsing %p\n", pFunction);
@ -1190,6 +1188,9 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
while (WINED3DVS_END() != *pToken) while (WINED3DVS_END() != *pToken)
{ {
struct wined3d_shader_instruction ins;
UINT param_size;
if (shader_is_comment(*pToken)) /* comment */ if (shader_is_comment(*pToken)) /* comment */
{ {
DWORD comment_len = (*pToken & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT; DWORD comment_len = (*pToken & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT;
@ -1198,19 +1199,16 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
pToken += comment_len; pToken += comment_len;
continue; continue;
} }
opcode_token = *pToken++;
curOpcode = shader_get_opcode(opcode_table, shader_version, opcode_token);
if (!curOpcode) shader_sm1_read_opcode(&pToken, &ins, &param_size, opcode_table, shader_version);
if (ins.handler_idx == WINED3DSIH_TABLE_SIZE)
{ {
int tokens_read; TRACE("Skipping unrecognized instruction.\n");
FIXME("Unrecognized opcode: token=0x%08x\n", opcode_token); pToken += param_size;
tokens_read = shader_skip_unrecognized(pToken, shader_version); continue;
pToken += tokens_read;
} }
else
{ if (ins.handler_idx == WINED3DSIH_DCL)
if (curOpcode->opcode == WINED3DSIO_DCL)
{ {
DWORD usage = *pToken; DWORD usage = *pToken;
DWORD param = *(pToken + 1); DWORD param = *(pToken + 1);
@ -1221,7 +1219,7 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
shader_dump_param(param, 0, 0, shader_version); shader_dump_param(param, 0, 0, shader_version);
pToken += 2; pToken += 2;
} }
else if (curOpcode->opcode == WINED3DSIO_DEF) else if (ins.handler_idx == WINED3DSIH_DEF)
{ {
unsigned int offset = shader_get_float_offset(*pToken); unsigned int offset = shader_get_float_offset(*pToken);
@ -1232,7 +1230,7 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
*(const float *)(pToken + 4)); *(const float *)(pToken + 4));
pToken += 5; pToken += 5;
} }
else if (curOpcode->opcode == WINED3DSIO_DEFI) else if (ins.handler_idx == WINED3DSIH_DEFI)
{ {
TRACE("defi i%u = %d, %d, %d, %d", *pToken & WINED3DSP_REGNUM_MASK, TRACE("defi i%u = %d, %d, %d, %d", *pToken & WINED3DSP_REGNUM_MASK,
*(pToken + 1), *(pToken + 1),
@ -1241,7 +1239,7 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
*(pToken + 4)); *(pToken + 4));
pToken += 5; pToken += 5;
} }
else if (curOpcode->opcode == WINED3DSIO_DEFB) else if (ins.handler_idx == WINED3DSIH_DEFB)
{ {
TRACE("defb b%u = %s", *pToken & WINED3DSP_REGNUM_MASK, TRACE("defb b%u = %s", *pToken & WINED3DSP_REGNUM_MASK,
*(pToken + 1)? "true": "false"); *(pToken + 1)? "true": "false");
@ -1254,26 +1252,22 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
/* Print out predication source token first - it follows /* Print out predication source token first - it follows
* the destination token. */ * the destination token. */
if (opcode_token & WINED3DSHADER_INSTRUCTION_PREDICATED) if (ins.predicate)
{ {
TRACE("("); TRACE("(");
shader_dump_param(*(pToken + 2), 0, 1, shader_version); shader_dump_param(*(pToken + 2), 0, 1, shader_version);
TRACE(") "); TRACE(") ");
} }
if (opcode_token & WINED3DSI_COISSUE)
{
/* PixWin marks instructions with the coissue flag with a '+' */ /* PixWin marks instructions with the coissue flag with a '+' */
TRACE("+"); if (ins.coissue) TRACE("+");
}
TRACE("%s", shader_opcode_names[curOpcode->handler_idx]); TRACE("%s", shader_opcode_names[ins.handler_idx]);
if (curOpcode->opcode == WINED3DSIO_IFC if (ins.handler_idx == WINED3DSIH_IFC
|| curOpcode->opcode == WINED3DSIO_BREAKC) || ins.handler_idx == WINED3DSIH_BREAKC)
{ {
DWORD op = (opcode_token & WINED3D_OPCODESPECIFICCONTROL_MASK) >> WINED3D_OPCODESPECIFICCONTROL_SHIFT; switch (ins.flags)
switch (op)
{ {
case COMPARISON_GT: TRACE("_gt"); break; case COMPARISON_GT: TRACE("_gt"); break;
case COMPARISON_EQ: TRACE("_eq"); break; case COMPARISON_EQ: TRACE("_eq"); break;
@ -1281,18 +1275,18 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
case COMPARISON_LT: TRACE("_lt"); break; case COMPARISON_LT: TRACE("_lt"); break;
case COMPARISON_NE: TRACE("_ne"); break; case COMPARISON_NE: TRACE("_ne"); break;
case COMPARISON_LE: TRACE("_le"); break; case COMPARISON_LE: TRACE("_le"); break;
default: TRACE("_(%u)", op); default: TRACE("_(%u)", ins.flags);
} }
} }
else if (curOpcode->opcode == WINED3DSIO_TEX else if (ins.handler_idx == WINED3DSIH_TEX
&& shader_version >= WINED3DPS_VERSION(2,0) && shader_version >= WINED3DPS_VERSION(2,0)
&& (opcode_token & (WINED3DSI_TEXLD_PROJECT << WINED3D_OPCODESPECIFICCONTROL_SHIFT))) && (ins.flags & WINED3DSI_TEXLD_PROJECT))
{ {
TRACE("p"); TRACE("p");
} }
/* Destination token */ /* Destination token */
if (curOpcode->dst_token) if (ins.dst_count)
{ {
tokens_read = shader_get_param(pToken, shader_version, &param, &addr_token); tokens_read = shader_get_param(pToken, shader_version, &param, &addr_token);
pToken += tokens_read; pToken += tokens_read;
@ -1303,13 +1297,10 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
} }
/* Predication token - already printed out, just skip it */ /* Predication token - already printed out, just skip it */
if (opcode_token & WINED3DSHADER_INSTRUCTION_PREDICATED) if (ins.predicate) ++pToken;
{
pToken++;
}
/* Other source tokens */ /* Other source tokens */
for (i = curOpcode->dst_token; i < curOpcode->num_params; ++i) for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i)
{ {
tokens_read = shader_get_param(pToken, shader_version, &param, &addr_token); tokens_read = shader_get_param(pToken, shader_version, &param, &addr_token);
pToken += tokens_read; pToken += tokens_read;
@ -1320,7 +1311,6 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
} }
TRACE("\n"); TRACE("\n");
} }
}
} }
void shader_cleanup(IWineD3DBaseShader *iface) void shader_cleanup(IWineD3DBaseShader *iface)