Commit 8c6ee8df authored by Ivan Gyurdiev's avatar Ivan Gyurdiev Committed by Alexandre Julliard

wined3d: Mark instructions without a destination token.

There are a total of 17 instructions without a destination token. Of those 9 have num_params != 0, which means that we will not process any of them correctly, because we assume the first token (if present) is a destination token. Those are basically all the flow control instructions, which we plan to support very soon. They have source tokens, and no destination. Add a flag that marks them up to the ins table. Use this flag in the trace pass, and generation pass.
parent 14a52e5c
......@@ -867,30 +867,35 @@ void shader_generate_main(
hw_arg.opcode = curOpcode;
if (curOpcode->num_params > 0) {
/* Destination token */
if (curOpcode->dst_token) {
DWORD param, addr_token = 0;
pToken += shader_get_param(iface, pToken, &param, &addr_token);
hw_arg.dst = param;
hw_arg.dst_addr = addr_token;
}
if (opcode_token & D3DSHADER_INSTRUCTION_PREDICATED)
hw_arg.predicate = *pToken++;
/* Predication token */
if (opcode_token & D3DSHADER_INSTRUCTION_PREDICATED)
hw_arg.predicate = *pToken++;
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++;
/* Other source tokens */
for (i = curOpcode->dst_token; i < curOpcode->num_params; i++) {
} else
pToken += shader_get_param(iface, pToken, &param, &addr_token);
DWORD param, addr_token = 0;
hw_arg.src[i-1] = param;
hw_arg.src_addr[i-1] = addr_token;
}
/* 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, &param, &addr_token);
hw_arg.src[i-1] = param;
hw_arg.src_addr[i-1] = addr_token;
}
/* Call appropriate function for output target */
......@@ -1052,7 +1057,9 @@ void shader_trace_init(
}
TRACE("%s", curOpcode->name);
if (curOpcode->num_params > 0) {
/* Destination token */
if (curOpcode->dst_token) {
/* Destination token */
tokens_read = shader_get_param(iface, pToken, &param, &addr_token);
......@@ -1062,22 +1069,23 @@ void shader_trace_init(
shader_dump_ins_modifiers(param);
TRACE(" ");
shader_dump_param(iface, param, addr_token, 0);
}
/* Predication token - already printed out, just skip it */
if (opcode_token & D3DSHADER_INSTRUCTION_PREDICATED) {
pToken++;
len++;
}
/* Other source tokens */
for (i = curOpcode->dst_token; i < curOpcode->num_params; ++i) {
tokens_read = shader_get_param(iface, pToken, &param, &addr_token);
pToken += tokens_read;
len += tokens_read;
/* Predication token - already printed out, just skip it */
if (opcode_token & D3DSHADER_INSTRUCTION_PREDICATED) {
pToken++;
len++;
}
/* Other source tokens */
for (i = 1; i < curOpcode->num_params; ++i) {
tokens_read = shader_get_param(iface, pToken, &param, &addr_token);
pToken += tokens_read;
len += tokens_read;
TRACE(", ");
shader_dump_param(iface, param, addr_token, 1);
}
TRACE((i == 0)? " " : ", ");
shader_dump_param(iface, param, addr_token, 1);
}
}
TRACE("\n");
......
......@@ -1290,6 +1290,7 @@ typedef struct SHADER_OPCODE {
unsigned int opcode;
const char* name;
const char* glname;
char dst_token;
CONST UINT num_params;
shader_fct_t soft_fct;
SHADER_HANDLER hw_fct;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment