[PATCH 2/3] wined3d: Add type information to shader registers.
Henri Verbeet
hverbeet at codeweavers.com
Tue Sep 4 13:15:09 CDT 2012
---
dlls/wined3d/shader.c | 44 +++++++++++-
dlls/wined3d/shader_sm1.c | 17 ++++--
dlls/wined3d/shader_sm4.c | 141 ++++++++++++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 10 +++
4 files changed, 149 insertions(+), 63 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index d19b575..7e282aa 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -992,13 +992,49 @@ static void shader_dump_register(const struct wined3d_shader_register *reg,
switch (reg->immconst_type)
{
case WINED3D_IMMCONST_SCALAR:
- TRACE("%.8e", *(const float *)reg->immconst_data);
+ switch (reg->data_type)
+ {
+ case WINED3D_DATA_FLOAT:
+ TRACE("%.8e", *(const float *)reg->immconst_data);
+ break;
+ case WINED3D_DATA_INT:
+ TRACE("%d", reg->immconst_data[0]);
+ break;
+ case WINED3D_DATA_RESOURCE:
+ case WINED3D_DATA_SAMPLER:
+ case WINED3D_DATA_UINT:
+ TRACE("%u", reg->immconst_data[0]);
+ break;
+ default:
+ TRACE("<unhandled data type %#x>", reg->data_type);
+ break;
+ }
break;
case WINED3D_IMMCONST_VEC4:
- TRACE("%.8e, %.8e, %.8e, %.8e",
- *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
- *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
+ switch (reg->data_type)
+ {
+ case WINED3D_DATA_FLOAT:
+ TRACE("%.8e, %.8e, %.8e, %.8e",
+ *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1],
+ *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]);
+ break;
+ case WINED3D_DATA_INT:
+ TRACE("%d, %d, %d, %d",
+ reg->immconst_data[0], reg->immconst_data[1],
+ reg->immconst_data[2], reg->immconst_data[3]);
+ break;
+ case WINED3D_DATA_RESOURCE:
+ case WINED3D_DATA_SAMPLER:
+ case WINED3D_DATA_UINT:
+ TRACE("%u, %u, %u, %u",
+ reg->immconst_data[0], reg->immconst_data[1],
+ reg->immconst_data[2], reg->immconst_data[3]);
+ break;
+ default:
+ TRACE("<unhandled data type %#x>\n", reg->data_type);
+ break;
+ }
break;
default:
diff --git a/dlls/wined3d/shader_sm1.c b/dlls/wined3d/shader_sm1.c
index bba65dd..8721d7e 100644
--- a/dlls/wined3d/shader_sm1.c
+++ b/dlls/wined3d/shader_sm1.c
@@ -447,6 +447,7 @@ static void shader_parse_src_param(DWORD param, const struct wined3d_shader_src_
{
src->reg.type = ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
| ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
+ src->reg.data_type = WINED3D_DATA_FLOAT;
src->reg.idx = param & WINED3DSP_REGNUM_MASK;
src->reg.array_idx = ~0U;
src->swizzle = (param & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT;
@@ -459,6 +460,7 @@ static void shader_parse_dst_param(DWORD param, const struct wined3d_shader_src_
{
dst->reg.type = ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
| ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
+ dst->reg.data_type = WINED3D_DATA_FLOAT;
dst->reg.idx = param & WINED3DSP_REGNUM_MASK;
dst->reg.array_idx = ~0U;
dst->write_mask = (param & WINED3D_SM1_WRITEMASK_MASK) >> WINED3D_SM1_WRITEMASK_SHIFT;
@@ -621,10 +623,11 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_se
}
static void shader_sm1_read_immconst(const DWORD **ptr, struct wined3d_shader_src_param *src_param,
- enum wined3d_immconst_type type)
+ enum wined3d_immconst_type type, enum wined3d_data_type data_type)
{
UINT count = type == WINED3D_IMMCONST_VEC4 ? 4 : 1;
src_param->reg.type = WINED3DSPR_IMMCONST;
+ src_param->reg.data_type = data_type;
src_param->reg.idx = ~0U;
src_param->reg.array_idx = ~0U;
src_param->reg.rel_addr = NULL;
@@ -669,16 +672,20 @@ static void shader_sm1_read_instruction(void *data, const DWORD **ptr, struct wi
{
shader_sm1_read_semantic(&p, &ins->semantic);
}
- else if (ins->handler_idx == WINED3DSIH_DEF
- || ins->handler_idx == WINED3DSIH_DEFI)
+ else if (ins->handler_idx == WINED3DSIH_DEF)
{
shader_sm1_read_dst_param(priv, &p, &priv->dst_param, &priv->dst_rel_addr);
- shader_sm1_read_immconst(&p, &priv->src_param[0], WINED3D_IMMCONST_VEC4);
+ shader_sm1_read_immconst(&p, &priv->src_param[0], WINED3D_IMMCONST_VEC4, WINED3D_DATA_FLOAT);
+ }
+ else if (ins->handler_idx == WINED3DSIH_DEFI)
+ {
+ shader_sm1_read_dst_param(priv, &p, &priv->dst_param, &priv->dst_rel_addr);
+ shader_sm1_read_immconst(&p, &priv->src_param[0], WINED3D_IMMCONST_VEC4, WINED3D_DATA_INT);
}
else if (ins->handler_idx == WINED3DSIH_DEFB)
{
shader_sm1_read_dst_param(priv, &p, &priv->dst_param, &priv->dst_rel_addr);
- shader_sm1_read_immconst(&p, &priv->src_param[0], WINED3D_IMMCONST_SCALAR);
+ shader_sm1_read_immconst(&p, &priv->src_param[0], WINED3D_IMMCONST_SCALAR, WINED3D_DATA_UINT);
}
else
{
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 778c924..17dc5e9 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -133,8 +133,8 @@ struct wined3d_sm4_opcode_info
{
enum wined3d_sm4_opcode opcode;
enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx;
- UINT dst_count;
- UINT src_count;
+ const char *dst_info;
+ const char *src_info;
};
struct sysval_map
@@ -144,54 +144,61 @@ struct sysval_map
UINT register_idx;
};
+/*
+ * F -> WINED3D_DATA_FLOAT
+ * I -> WINED3D_DATA_INT
+ * R -> WINED3D_DATA_RESOURCE
+ * S -> WINED3D_DATA_SAMPLER
+ * U -> WINED3D_DATA_UINT
+ */
static const struct wined3d_sm4_opcode_info opcode_table[] =
{
- {WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, 1, 2},
- {WINED3D_SM4_OP_AND, WINED3DSIH_AND, 1, 2},
- {WINED3D_SM4_OP_BREAK, WINED3DSIH_BREAK, 0, 0},
- {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP, 0, 1},
- {WINED3D_SM4_OP_CUT, WINED3DSIH_CUT, 0, 0},
- {WINED3D_SM4_OP_DERIV_RTX, WINED3DSIH_DSX, 1, 1},
- {WINED3D_SM4_OP_DERIV_RTY, WINED3DSIH_DSY, 1, 1},
- {WINED3D_SM4_OP_DIV, WINED3DSIH_DIV, 1, 2},
- {WINED3D_SM4_OP_DP3, WINED3DSIH_DP3, 1, 2},
- {WINED3D_SM4_OP_DP4, WINED3DSIH_DP4, 1, 2},
- {WINED3D_SM4_OP_EMIT, WINED3DSIH_EMIT, 0, 0},
- {WINED3D_SM4_OP_ENDIF, WINED3DSIH_ENDIF, 0, 0},
- {WINED3D_SM4_OP_ENDLOOP, WINED3DSIH_ENDLOOP, 0, 0},
- {WINED3D_SM4_OP_EQ, WINED3DSIH_EQ, 1, 2},
- {WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1},
- {WINED3D_SM4_OP_FRC, WINED3DSIH_FRC, 1, 1},
- {WINED3D_SM4_OP_FTOI, WINED3DSIH_FTOI, 1, 1},
- {WINED3D_SM4_OP_GE, WINED3DSIH_GE, 1, 2},
- {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, 1, 2},
- {WINED3D_SM4_OP_IF, WINED3DSIH_IF, 0, 1},
- {WINED3D_SM4_OP_IEQ, WINED3DSIH_IEQ, 1, 2},
- {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, 1, 2},
- {WINED3D_SM4_OP_IMUL, WINED3DSIH_IMUL, 2, 2},
- {WINED3D_SM4_OP_ITOF, WINED3DSIH_ITOF, 1, 1},
- {WINED3D_SM4_OP_LD, WINED3DSIH_LD, 1, 2},
- {WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, 1, 1},
- {WINED3D_SM4_OP_LOOP, WINED3DSIH_LOOP, 0, 0},
- {WINED3D_SM4_OP_LT, WINED3DSIH_LT, 1, 2},
- {WINED3D_SM4_OP_MAD, WINED3DSIH_MAD, 1, 3},
- {WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, 1, 2},
- {WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, 1, 2},
- {WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, 1, 1},
- {WINED3D_SM4_OP_MOVC, WINED3DSIH_MOVC, 1, 3},
- {WINED3D_SM4_OP_MUL, WINED3DSIH_MUL, 1, 2},
- {WINED3D_SM4_OP_RET, WINED3DSIH_RET, 0, 0},
- {WINED3D_SM4_OP_ROUND_NI, WINED3DSIH_ROUND_NI, 1, 1},
- {WINED3D_SM4_OP_RSQ, WINED3DSIH_RSQ, 1, 1},
- {WINED3D_SM4_OP_SAMPLE, WINED3DSIH_SAMPLE, 1, 3},
- {WINED3D_SM4_OP_SAMPLE_LOD, WINED3DSIH_SAMPLE_LOD, 1, 4},
- {WINED3D_SM4_OP_SAMPLE_GRAD,WINED3DSIH_SAMPLE_GRAD, 1, 5},
- {WINED3D_SM4_OP_SQRT, WINED3DSIH_SQRT, 1, 1},
- {WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, 2, 1},
- {WINED3D_SM4_OP_UDIV, WINED3DSIH_UDIV, 2, 2},
- {WINED3D_SM4_OP_USHR, WINED3DSIH_USHR, 1, 2},
- {WINED3D_SM4_OP_UTOF, WINED3DSIH_UTOF, 1, 1},
- {WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, 1, 2},
+ {WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, "F", "FF"},
+ {WINED3D_SM4_OP_AND, WINED3DSIH_AND, "U", "UU"},
+ {WINED3D_SM4_OP_BREAK, WINED3DSIH_BREAK, "", ""},
+ {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP, "", "U"},
+ {WINED3D_SM4_OP_CUT, WINED3DSIH_CUT, "", ""},
+ {WINED3D_SM4_OP_DERIV_RTX, WINED3DSIH_DSX, "F", "F"},
+ {WINED3D_SM4_OP_DERIV_RTY, WINED3DSIH_DSY, "F", "F"},
+ {WINED3D_SM4_OP_DIV, WINED3DSIH_DIV, "F", "FF"},
+ {WINED3D_SM4_OP_DP3, WINED3DSIH_DP3, "F", "FF"},
+ {WINED3D_SM4_OP_DP4, WINED3DSIH_DP4, "F", "FF"},
+ {WINED3D_SM4_OP_EMIT, WINED3DSIH_EMIT, "", ""},
+ {WINED3D_SM4_OP_ENDIF, WINED3DSIH_ENDIF, "", ""},
+ {WINED3D_SM4_OP_ENDLOOP, WINED3DSIH_ENDLOOP, "", ""},
+ {WINED3D_SM4_OP_EQ, WINED3DSIH_EQ, "U", "FF"},
+ {WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, "F", "F"},
+ {WINED3D_SM4_OP_FRC, WINED3DSIH_FRC, "F", "F"},
+ {WINED3D_SM4_OP_FTOI, WINED3DSIH_FTOI, "I", "F"},
+ {WINED3D_SM4_OP_GE, WINED3DSIH_GE, "U", "FF"},
+ {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, "I", "II"},
+ {WINED3D_SM4_OP_IF, WINED3DSIH_IF, "", "U"},
+ {WINED3D_SM4_OP_IEQ, WINED3DSIH_IEQ, "U", "II"},
+ {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, "U", "II"},
+ {WINED3D_SM4_OP_IMUL, WINED3DSIH_IMUL, "II", "II"},
+ {WINED3D_SM4_OP_ITOF, WINED3DSIH_ITOF, "F", "I"},
+ {WINED3D_SM4_OP_LD, WINED3DSIH_LD, "U", "FR"},
+ {WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, "F", "F"},
+ {WINED3D_SM4_OP_LOOP, WINED3DSIH_LOOP, "", ""},
+ {WINED3D_SM4_OP_LT, WINED3DSIH_LT, "U", "FF"},
+ {WINED3D_SM4_OP_MAD, WINED3DSIH_MAD, "F", "FFF"},
+ {WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, "F", "FF"},
+ {WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, "F", "FF"},
+ {WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, "F", "F"},
+ {WINED3D_SM4_OP_MOVC, WINED3DSIH_MOVC, "F", "UFF"},
+ {WINED3D_SM4_OP_MUL, WINED3DSIH_MUL, "F", "FF"},
+ {WINED3D_SM4_OP_RET, WINED3DSIH_RET, "", ""},
+ {WINED3D_SM4_OP_ROUND_NI, WINED3DSIH_ROUND_NI, "F", "F"},
+ {WINED3D_SM4_OP_RSQ, WINED3DSIH_RSQ, "F", "F"},
+ {WINED3D_SM4_OP_SAMPLE, WINED3DSIH_SAMPLE, "U", "FRS"},
+ {WINED3D_SM4_OP_SAMPLE_LOD, WINED3DSIH_SAMPLE_LOD, "U", "FRSF"},
+ {WINED3D_SM4_OP_SAMPLE_GRAD,WINED3DSIH_SAMPLE_GRAD, "U", "FRSFF"},
+ {WINED3D_SM4_OP_SQRT, WINED3DSIH_SQRT, "F", "F"},
+ {WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, "FF", "F"},
+ {WINED3D_SM4_OP_UDIV, WINED3DSIH_UDIV, "UU", "UU"},
+ {WINED3D_SM4_OP_USHR, WINED3DSIH_USHR, "U", "UU"},
+ {WINED3D_SM4_OP_UTOF, WINED3DSIH_UTOF, "F", "U"},
+ {WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, "U", "UU"},
};
static const enum wined3d_shader_register_type register_type_table[] =
@@ -283,6 +290,26 @@ static void map_register(const struct wined3d_sm4_data *priv, struct wined3d_sha
}
}
+static enum wined3d_data_type map_data_type(char t)
+{
+ switch (t)
+ {
+ case 'F':
+ return WINED3D_DATA_FLOAT;
+ case 'I':
+ return WINED3D_DATA_INT;
+ case 'R':
+ return WINED3D_DATA_RESOURCE;
+ case 'S':
+ return WINED3D_DATA_SAMPLER;
+ case 'U':
+ return WINED3D_DATA_UINT;
+ default:
+ ERR("Invalid data type '%c'.\n", t);
+ return WINED3D_DATA_FLOAT;
+ }
+}
+
static void *shader_sm4_init(const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
{
struct wined3d_sm4_data *priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv));
@@ -339,7 +366,8 @@ static void shader_sm4_read_header(void *data, const DWORD **ptr, struct wined3d
}
static void shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
- struct wined3d_shader_src_param *src_param, struct wined3d_shader_src_param *src_rel_addr)
+ enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param,
+ struct wined3d_shader_src_param *src_rel_addr)
{
DWORD token = *(*ptr)++;
enum wined3d_sm4_register_type register_type;
@@ -355,6 +383,7 @@ static void shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
{
src_param->reg.type = register_type_table[register_type];
}
+ src_param->reg.data_type = data_type;
if (token & WINED3D_SM4_REGISTER_MODIFIER)
{
@@ -430,7 +459,8 @@ static void shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
}
static void shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
- struct wined3d_shader_dst_param *dst_param, struct wined3d_shader_src_param *dst_rel_addr)
+ enum wined3d_data_type data_type, struct wined3d_shader_dst_param *dst_param,
+ struct wined3d_shader_src_param *dst_rel_addr)
{
DWORD token = *(*ptr)++;
enum wined3d_sm4_register_type register_type;
@@ -446,6 +476,7 @@ static void shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD
{
dst_param->reg.type = register_type_table[register_type];
}
+ dst_param->reg.data_type = data_type;
order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
@@ -489,9 +520,9 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
ins->flags = 0;
ins->coissue = 0;
ins->predicate = NULL;
- ins->dst_count = opcode_info->dst_count;
+ ins->dst_count = strlen(opcode_info->dst_info);
ins->dst = priv->dst_param;
- ins->src_count = opcode_info->src_count;
+ ins->src_count = strlen(opcode_info->src_info);
ins->src = priv->src_param;
p = *ptr;
@@ -505,12 +536,14 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
for (i = 0; i < ins->dst_count; ++i)
{
- shader_sm4_read_dst_param(priv, &p, &priv->dst_param[i], &priv->dst_rel_addr[i]);
+ shader_sm4_read_dst_param(priv, &p, map_data_type(opcode_info->dst_info[i]),
+ &priv->dst_param[i], &priv->dst_rel_addr[i]);
}
for (i = 0; i < ins->src_count; ++i)
{
- shader_sm4_read_src_param(priv, &p, &priv->src_param[i], &priv->src_rel_addr[i]);
+ shader_sm4_read_src_param(priv, &p, map_data_type(opcode_info->src_info[i]),
+ &priv->src_param[i], &priv->src_rel_addr[i]);
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e0e8c0d..ead1a49 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -324,6 +324,15 @@ enum wined3d_shader_register_type
WINED3DSPR_RESOURCE,
};
+enum wined3d_data_type
+{
+ WINED3D_DATA_FLOAT,
+ WINED3D_DATA_INT,
+ WINED3D_DATA_RESOURCE,
+ WINED3D_DATA_SAMPLER,
+ WINED3D_DATA_UINT,
+};
+
enum wined3d_immconst_type
{
WINED3D_IMMCONST_SCALAR,
@@ -612,6 +621,7 @@ struct wined3d_shader_context
struct wined3d_shader_register
{
enum wined3d_shader_register_type type;
+ enum wined3d_data_type data_type;
UINT idx;
UINT array_idx;
const struct wined3d_shader_src_param *rel_addr;
--
1.7.8.6
More information about the wine-patches
mailing list