wined3d: Use shader_sm1_read_dst_param() and shader_sm1_read_src_param() in shader_get_registers_used().
Henri Verbeet
hverbeet at codeweavers.com
Tue Apr 28 02:53:28 CDT 2009
---
dlls/wined3d/baseshader.c | 39 +++++++++++++++++++++++----------------
1 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 21c99fc..d565fb3 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -763,36 +763,43 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m
}
/* This will loop over all the registers and try to
- * make a bitmask of the ones we're interested in.
+ * make a bitmask of the ones we're interested in.
*
- * Relative addressing tokens are ignored, but that's
- * okay, since we'll catch any address registers when
+ * Relative addressing tokens are ignored, but that's
+ * okay, since we'll catch any address registers when
* they are initialized (required by spec) */
- limit = ins.dst_count + ins.src_count + (ins.predicate ? 1 : 0);
-
- for (i = 0; i < limit; ++i) {
-
- DWORD param, addr_token, reg, regtype;
- pToken += shader_get_param(pToken, shader_version, ¶m, &addr_token);
+ if (ins.dst_count)
+ {
+ struct wined3d_shader_dst_param dst_param;
+ struct wined3d_shader_src_param dst_rel_addr;
- regtype = shader_get_regtype(param);
- reg = param & WINED3DSP_REGNUM_MASK;
+ shader_sm1_read_dst_param(&pToken, &dst_param, &dst_rel_addr, shader_version);
/* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
* is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
* shaders because TECRDOUT isn't used in them, but future register types might cause issues */
- if (regtype == WINED3DSPR_TEXCRDOUT && i == 0 /* Only look at writes */
- && !pshader && WINED3DSHADER_VERSION_MAJOR(shader_version) < 3)
+ if (!pshader && WINED3DSHADER_VERSION_MAJOR(shader_version) < 3
+ && dst_param.register_type == WINED3DSPR_TEXCRDOUT)
{
- reg_maps->texcoord_mask[reg] |= shader_get_writemask(param);
+ reg_maps->texcoord_mask[dst_param.register_type] |= dst_param.write_mask;
}
else
{
- shader_record_register_usage(This, reg_maps, regtype, reg,
- param & WINED3DSHADER_ADDRMODE_RELATIVE, pshader);
+ shader_record_register_usage(This, reg_maps, dst_param.register_type,
+ dst_param.register_idx, !!dst_param.rel_addr, pshader);
}
}
+
+ limit = ins.src_count + (ins.predicate ? 1 : 0);
+ for (i = 0; i < limit; ++i)
+ {
+ struct wined3d_shader_src_param src_param, src_rel_addr;
+
+ shader_sm1_read_src_param(&pToken, &src_param, &src_rel_addr, shader_version);
+ shader_record_register_usage(This, reg_maps, src_param.register_type,
+ src_param.register_idx, !!src_param.rel_addr, pshader);
+ }
}
}
++pToken;
--
1.6.0.6
--------------000707050707020205020408--
More information about the wine-patches
mailing list