wined3d: Introduce shader_sm1_read_semantic().
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 5d91c5b..d8035b7 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -262,6 +262,17 @@
}
}
+static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_semantic *semantic)
+{
+ DWORD usage_token = *(*ptr)++;
+ DWORD dst_token = *(*ptr)++;
+
+ semantic->usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
+ semantic->usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
+ semantic->sampler_type = usage_token & WINED3DSP_TEXTURETYPE_MASK;
+ shader_parse_dst_param(dst_token, NULL, &semantic->reg);
+}
+
static const char *shader_opcode_names[] =
{
/* WINED3DSIH_ABS */ "abs",
@@ -601,39 +612,36 @@
/* Handle declarations */
if (ins.handler_idx == WINED3DSIH_DCL)
{
- DWORD usage = *pToken++;
- DWORD param = *pToken++;
- DWORD regtype = shader_get_regtype(param);
- unsigned int regnum = param & WINED3DSP_REGNUM_MASK;
+ struct wined3d_shader_semantic semantic;
- /* Vshader: mark attributes used
- Pshader: mark 3.0 input registers used, save token */
- if (WINED3DSPR_INPUT == regtype) {
+ shader_sm1_read_semantic(&pToken, &semantic);
- if (!pshader)
- reg_maps->attributes[regnum] = 1;
- else
- reg_maps->packed_input[regnum] = 1;
+ switch (semantic.reg.register_type)
+ {
+ /* Vshader: mark attributes used
+ * Pshader: mark 3.0 input registers used, save token */
+ case WINED3DSPR_INPUT:
+ if (!pshader) reg_maps->attributes[semantic.reg.register_idx] = 1;
+ else reg_maps->packed_input[semantic.reg.register_idx] = 1;
+ semantics_in[semantic.reg.register_idx] = semantic;
+ break;
- semantics_in[regnum].usage = (usage & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
- semantics_in[regnum].usage_idx =
- (usage & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
- shader_parse_dst_param(param, NULL, &semantics_in[regnum].reg);
+ /* Vshader: mark 3.0 output registers used, save token */
+ case WINED3DSPR_OUTPUT:
+ reg_maps->packed_output[semantic.reg.register_idx] = 1;
+ semantics_out[semantic.reg.register_idx] = semantic;
+ if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1;
+ break;
- /* Vshader: mark 3.0 output registers used, save token */
- } else if (WINED3DSPR_OUTPUT == regtype) {
- reg_maps->packed_output[regnum] = 1;
- semantics_out[regnum].usage = (usage & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
- semantics_out[regnum].usage_idx =
- (usage & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
- shader_parse_dst_param(param, NULL, &semantics_out[regnum].reg);
+ /* Save sampler usage token */
+ case WINED3DSPR_SAMPLER:
+ reg_maps->sampler_type[semantic.reg.register_idx] = semantic.sampler_type;
+ break;
- if (usage & (WINED3DDECLUSAGE_FOG << WINED3DSP_DCL_USAGE_SHIFT))
- reg_maps->fog = 1;
-
- /* Save sampler usage token */
- } else if (WINED3DSPR_SAMPLER == regtype)
- reg_maps->sampler_type[regnum] = usage & WINED3DSP_TEXTURETYPE_MASK;
+ default:
+ TRACE("Not recording DCL register type %#x.\n", semantic.reg.register_type);
+ break;
+ }
}
else if (ins.handler_idx == WINED3DSIH_DEF)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b6d5152..16512cc 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -482,6 +482,7 @@
{
WINED3DDECLUSAGE usage;
UINT usage_idx;
+ WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
struct wined3d_shader_dst_param reg;
};