Module: wine Branch: master Commit: 6eb43e35c994820cfb7e0119e51ed60a88d19ca9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6eb43e35c994820cfb7e0119e5...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon May 4 09:49:27 2009 +0200
wined3d: Get rid of the remaining WINED3DSP_REGNUM_MASK usage.
---
dlls/wined3d/baseshader.c | 119 +++++++++++++++++++++++---------------------- 1 files changed, 61 insertions(+), 58 deletions(-)
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 9bdad17..f627ec0 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -724,21 +724,24 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m else if (ins.handler_idx == WINED3DSIH_LOOP || ins.handler_idx == WINED3DSIH_REP) { - DWORD reg; + struct wined3d_shader_src_param src, rel_addr;
- if(ins.handler_idx == WINED3DSIH_LOOP) { - reg = pToken[1]; - } else { - reg = pToken[0]; + shader_sm1_read_src_param(&pToken, &src, &rel_addr, shader_version); + + /* Rep and Loop always use an integer constant for the control parameters */ + if (ins.handler_idx == WINED3DSIH_REP) + { + reg_maps->integer_constants |= 1 << src.register_idx; + } + else + { + shader_sm1_read_src_param(&pToken, &src, &rel_addr, shader_version); + reg_maps->integer_constants |= 1 << src.register_idx; }
cur_loop_depth++; if(cur_loop_depth > max_loop_depth) max_loop_depth = cur_loop_depth; - pToken += param_size; - - /* Rep and Loop always use an integer constant for the control parameters */ - reg_maps->integer_constants |= (1 << (reg & WINED3DSP_REGNUM_MASK)); } else if (ins.handler_idx == WINED3DSIH_ENDLOOP || ins.handler_idx == WINED3DSIH_ENDREP) @@ -748,62 +751,16 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m /* For subroutine prototypes */ else if (ins.handler_idx == WINED3DSIH_LABEL) { + struct wined3d_shader_src_param src, rel_addr;
- DWORD snum = *pToken & WINED3DSP_REGNUM_MASK; - reg_maps->labels[snum] = 1; - pToken += param_size; + shader_sm1_read_src_param(&pToken, &src, &rel_addr, shader_version); + reg_maps->labels[src.register_idx] = 1; } /* Set texture, address, temporary registers */ else { int i, limit;
- /* Declare 1.X samplers implicitly, based on the destination reg. number */ - if (WINED3DSHADER_VERSION_MAJOR(shader_version) == 1 - && pshader /* Filter different instructions with the same enum values in VS */ - && (ins.handler_idx == WINED3DSIH_TEX - || ins.handler_idx == WINED3DSIH_TEXBEM - || ins.handler_idx == WINED3DSIH_TEXBEML - || ins.handler_idx == WINED3DSIH_TEXDP3TEX - || ins.handler_idx == WINED3DSIH_TEXM3x2TEX - || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC - || ins.handler_idx == WINED3DSIH_TEXM3x3TEX - || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC - || ins.handler_idx == WINED3DSIH_TEXREG2AR - || ins.handler_idx == WINED3DSIH_TEXREG2GB - || ins.handler_idx == WINED3DSIH_TEXREG2RGB)) - { - /* Fake sampler usage, only set reserved bit and ttype */ - DWORD sampler_code = *pToken & WINED3DSP_REGNUM_MASK; - - TRACE("Setting fake 2D sampler for 1.x pixelshader\n"); - reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D; - - /* texbem is only valid with < 1.4 pixel shaders */ - if (ins.handler_idx == WINED3DSIH_TEXBEM - || ins.handler_idx == WINED3DSIH_TEXBEML) - { - reg_maps->bumpmat[sampler_code] = TRUE; - if (ins.handler_idx == WINED3DSIH_TEXBEML) - { - reg_maps->luminanceparams[sampler_code] = TRUE; - } - } - } - if (ins.handler_idx == WINED3DSIH_NRM) - { - reg_maps->usesnrm = 1; - } - else if (pshader && ins.handler_idx == WINED3DSIH_BEM) - { - DWORD regnum = *pToken & WINED3DSP_REGNUM_MASK; - reg_maps->bumpmat[regnum] = TRUE; - } - else if (ins.handler_idx == WINED3DSIH_DSY) - { - reg_maps->usesdsy = 1; - } - /* This will loop over all the registers and try to * make a bitmask of the ones we're interested in. * @@ -831,6 +788,52 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m shader_record_register_usage(This, reg_maps, dst_param.register_type, dst_param.register_idx, !!dst_param.rel_addr, pshader); } + + /* Declare 1.X samplers implicitly, based on the destination reg. number */ + if (WINED3DSHADER_VERSION_MAJOR(shader_version) == 1 + && pshader /* Filter different instructions with the same enum values in VS */ + && (ins.handler_idx == WINED3DSIH_TEX + || ins.handler_idx == WINED3DSIH_TEXBEM + || ins.handler_idx == WINED3DSIH_TEXBEML + || ins.handler_idx == WINED3DSIH_TEXDP3TEX + || ins.handler_idx == WINED3DSIH_TEXM3x2TEX + || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC + || ins.handler_idx == WINED3DSIH_TEXM3x3TEX + || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC + || ins.handler_idx == WINED3DSIH_TEXREG2AR + || ins.handler_idx == WINED3DSIH_TEXREG2GB + || ins.handler_idx == WINED3DSIH_TEXREG2RGB)) + { + /* Fake sampler usage, only set reserved bit and ttype */ + DWORD sampler_code = dst_param.register_idx; + + TRACE("Setting fake 2D sampler for 1.x pixelshader\n"); + reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D; + + /* texbem is only valid with < 1.4 pixel shaders */ + if (ins.handler_idx == WINED3DSIH_TEXBEM + || ins.handler_idx == WINED3DSIH_TEXBEML) + { + reg_maps->bumpmat[sampler_code] = TRUE; + if (ins.handler_idx == WINED3DSIH_TEXBEML) + { + reg_maps->luminanceparams[sampler_code] = TRUE; + } + } + } + else if (pshader && ins.handler_idx == WINED3DSIH_BEM) + { + reg_maps->bumpmat[dst_param.register_idx] = TRUE; + } + } + + if (ins.handler_idx == WINED3DSIH_NRM) + { + reg_maps->usesnrm = 1; + } + else if (ins.handler_idx == WINED3DSIH_DSY) + { + reg_maps->usesdsy = 1; }
limit = ins.src_count + (ins.predicate ? 1 : 0);