wined3d: Store the destination relative addressing token as a struct wined3d_shader_src_param.
Henri Verbeet
hverbeet at codeweavers.com
Fri Apr 17 02:46:56 CDT 2009
---
dlls/wined3d/arb_program_shader.c | 29 +++++++++++++++--------------
dlls/wined3d/baseshader.c | 24 +++++++++++++++++-------
dlls/wined3d/glsl_shader.c | 3 ++-
dlls/wined3d/vertexshader.c | 3 +--
dlls/wined3d/wined3d_private.h | 3 +--
5 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index a7a79c1..4be1a1f 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -10,6 +10,7 @@
* Copyright 2006 Jason Green
* Copyright 2006 Henri Verbeet
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
+ * Copyright 2009 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -577,7 +578,7 @@ static void shader_arb_add_dst_param(const struct wined3d_shader_instruction *in
strcat(str, " ");
shader_arb_get_register_name(ins->ctx->shader, wined3d_dst->register_type,
- wined3d_dst->register_idx, wined3d_dst->has_rel_addr, register_name, &is_color);
+ wined3d_dst->register_idx, !!wined3d_dst->rel_addr, register_name, &is_color);
strcat(str, register_name);
shader_arb_get_write_mask(ins, wined3d_dst, write_mask);
@@ -814,7 +815,7 @@ static void pshader_hw_bem(const struct wined3d_shader_instruction *ins)
}
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
strcat(dst_name, dst_wmask);
@@ -849,7 +850,7 @@ static void pshader_hw_cnd(const struct wined3d_shader_instruction *ins)
/* Handle output register */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
/* Generate input register names (with modifiers) */
@@ -885,7 +886,7 @@ static void pshader_hw_cmp(const struct wined3d_shader_instruction *ins)
/* Handle output register */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
/* Generate input register names (with modifiers) */
@@ -914,7 +915,7 @@ static void pshader_hw_dp2add(const struct wined3d_shader_instruction *ins)
BOOL is_color;
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
pshader_gen_input_modifier_line(ins->ctx->shader, buffer, ins->src[0].token, 0, src_name[0]);
@@ -1016,7 +1017,7 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
/* Handle output register */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, output_rname, &is_color);
+ dst->register_idx, !!dst->rel_addr, output_rname, &is_color);
strcpy(operands[0], output_rname);
shader_arb_get_write_mask(ins, dst, output_wmask);
strcat(operands[0], output_wmask);
@@ -1108,7 +1109,7 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins)
* but >= 2.0 honors it(undocumented, but tested by the d3d9 testsuit)
*/
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, reg_dest, &is_color);
+ dst->register_idx, !!dst->rel_addr, reg_dest, &is_color);
if (shader_version >= WINED3DPS_VERSION(2,0))
{
@@ -1140,7 +1141,7 @@ static void pshader_hw_tex(const struct wined3d_shader_instruction *ins)
/* All versions have a destination register */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, reg_dest, &is_color);
+ dst->register_idx, !!dst->rel_addr, reg_dest, &is_color);
/* 1.0-1.3: Use destination register as coordinate source.
1.4+: Use provided coordinate source register. */
@@ -1269,7 +1270,7 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins)
reg_dest_code = dst->register_idx;
/* Can directly use the name because texbem is only valid for <= 1.3 shaders */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, reg_coord, &is_color);
+ dst->register_idx, !!dst->rel_addr, reg_coord, &is_color);
for(i = 0; i < This->numbumpenvmatconsts; i++) {
if (This->bumpenvmatconst[i].const_num != WINED3D_CONST_NUM_UNUSED
@@ -1478,7 +1479,7 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
* here
*/
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
/* According to the msdn, the source register(must be r5) is unusable after
* the texdepth instruction, so we're free to modify it
@@ -1526,7 +1527,7 @@ static void pshader_hw_texdp3(const struct wined3d_shader_instruction *ins)
/* Handle output register */
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_str, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_str, &is_color);
shader_arb_get_write_mask(ins, dst, dst_mask);
pshader_gen_input_modifier_line(ins->ctx->shader, buffer, ins->src[0].token, 0, src0);
@@ -1547,7 +1548,7 @@ static void pshader_hw_texm3x3(const struct wined3d_shader_instruction *ins)
BOOL is_color;
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_str, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_str, &is_color);
shader_arb_get_write_mask(ins, dst, dst_mask);
pshader_gen_input_modifier_line(ins->ctx->shader, buffer, ins->src[0].token, 0, src0);
@@ -1681,7 +1682,7 @@ static void shader_hw_nrm(const struct wined3d_shader_instruction *ins)
BOOL is_color;
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
pshader_gen_input_modifier_line(ins->ctx->shader, buffer, ins->src[0].token, 0, src_name);
@@ -1711,7 +1712,7 @@ static void shader_hw_sincos(const struct wined3d_shader_instruction *ins)
BOOL is_color;
shader_arb_get_register_name(ins->ctx->shader, dst->register_type,
- dst->register_idx, dst->has_rel_addr, dst_name, &is_color);
+ dst->register_idx, !!dst->rel_addr, dst_name, &is_color);
shader_arb_get_write_mask(ins, dst, dst_wmask);
pshader_gen_input_modifier_line(ins->ctx->shader, buffer, ins->src[0].token, 0, src_name);
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 154354b..0d41fdc 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -227,7 +227,8 @@ static void shader_delete_constant_list(struct list* clist) {
list_init(clist);
}
-static void shader_parse_dst_param(DWORD param, DWORD addr_param, struct wined3d_shader_dst_param *dst)
+static void shader_parse_dst_param(DWORD param, const struct wined3d_shader_src_param *rel_addr,
+ struct wined3d_shader_dst_param *dst)
{
dst->register_type = ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
| ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
@@ -235,8 +236,7 @@ static void shader_parse_dst_param(DWORD param, DWORD addr_param, struct wined3d
dst->write_mask = param & WINED3DSP_WRITEMASK_ALL;
dst->modifiers = param & WINED3DSP_DSTMOD_MASK;
dst->shift = (param & WINED3DSP_DSTSHIFT_MASK) >> WINED3DSP_DSTSHIFT_SHIFT;
- dst->has_rel_addr = param & WINED3DSHADER_ADDRMODE_RELATIVE;
- dst->addr_token = addr_param;
+ dst->rel_addr = rel_addr;
}
static void shader_parse_src_param(DWORD param, const struct wined3d_shader_src_param *rel_addr,
@@ -327,7 +327,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m
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, 0, &semantics_in[regnum].reg);
+ shader_parse_dst_param(param, NULL, &semantics_in[regnum].reg);
/* Vshader: mark 3.0 output registers used, save token */
} else if (WINED3DSPR_OUTPUT == regtype) {
@@ -335,7 +335,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m
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, 0, &semantics_out[regnum].reg);
+ shader_parse_dst_param(param, NULL, &semantics_out[regnum].reg);
if (usage & (WINED3DDECLUSAGE_FOG << WINED3DSP_DCL_USAGE_SHIFT))
reg_maps->fog = 1;
@@ -817,6 +817,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER* buffer,
DWORD shader_version = reg_maps->shader_version;
struct wined3d_shader_src_param src_rel_addr[4];
struct wined3d_shader_src_param src_param[4];
+ struct wined3d_shader_src_param dst_rel_addr;
struct wined3d_shader_dst_param dst_param;
struct wined3d_shader_instruction ins;
struct wined3d_shader_context ctx;
@@ -898,9 +899,18 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER* buffer,
ins.dst_count = curOpcode->dst_token ? 1 : 0;
if (ins.dst_count)
{
- DWORD param, addr_param = 0;
+ DWORD param, addr_param;
pToken += shader_get_param(pToken, shader_version, ¶m, &addr_param);
- shader_parse_dst_param(param, addr_param, &dst_param);
+
+ if (param & WINED3DSHADER_ADDRMODE_RELATIVE)
+ {
+ shader_parse_src_param(addr_param, NULL, &dst_rel_addr);
+ shader_parse_dst_param(param, &dst_rel_addr, &dst_param);
+ }
+ else
+ {
+ shader_parse_dst_param(param, NULL, &dst_param);
+ }
}
/* Predication token */
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 8c4548a..429695b 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1295,7 +1295,8 @@ static DWORD shader_glsl_add_dst_param(const struct wined3d_shader_instruction *
glsl_dst->reg_name[0] = '\0';
shader_glsl_get_register_name(wined3d_dst->register_type, wined3d_dst->register_idx,
- wined3d_dst->has_rel_addr, wined3d_dst->addr_token, glsl_dst->reg_name, &is_color, ins);
+ !!wined3d_dst->rel_addr, wined3d_dst->rel_addr ? wined3d_dst->rel_addr->token : 0,
+ glsl_dst->reg_name, &is_color, ins);
return shader_glsl_get_write_mask(wined3d_dst, glsl_dst->mask_str);
}
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index fdd8cd8..fab0dca 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -181,8 +181,7 @@ static void vshader_set_input(
This->semantics_in[regnum].reg.write_mask = WINED3DSP_WRITEMASK_ALL;
This->semantics_in[regnum].reg.modifiers = 0;
This->semantics_in[regnum].reg.shift = 0;
- This->semantics_in[regnum].reg.has_rel_addr = FALSE;
- This->semantics_in[regnum].reg.addr_token = 0;
+ This->semantics_in[regnum].reg.rel_addr = NULL;
}
static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2) {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9f18219..09f7821 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -458,8 +458,7 @@ struct wined3d_shader_dst_param
DWORD write_mask;
DWORD modifiers;
DWORD shift;
- BOOL has_rel_addr;
- DWORD addr_token;
+ const struct wined3d_shader_src_param *rel_addr;
};
struct wined3d_shader_src_param
--
1.6.0.6
--------------090701080306080001080800--
More information about the wine-patches
mailing list