Module: wine Branch: refs/heads/master Commit: 744f3ae1c41273e7ec9cdef9b83005d8e1013153 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=744f3ae1c41273e7ec9cdef9...
Author: Ivan Gyurdiev ivg2@cornell.edu Date: Fri Apr 21 04:15:08 2006 -0400
wined3d: Improve/implement D3DSIO_TEX.
- unify per-version cases into a single sequence - make use of get_register_name() for the destination register - ignore destination write mask - it's only allowed on 2.0+ shaders, and only the default mask is allowed there (xyzw) - enable swizzle on texld 1.4 (it works together with dw/dz modifiers) - implement for shaders 2.0-3.0
---
dlls/wined3d/pixelshader.c | 61 ++++++++++++++++++++++++++++++++------------ 1 files changed, 45 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index 4a98bf5..d382ce0 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -706,7 +706,7 @@ CONST SHADER_OPCODE IWineD3DPixelShaderI {D3DSIO_TEXKILL, "texkill", "KIL", 1, pshader_texkill, D3DPS_VERSION(1,0), D3DPS_VERSION(3,0)}, {D3DSIO_TEX, "tex", "undefined", 1, pshader_tex, 0, D3DPS_VERSION(1,3)}, {D3DSIO_TEX, "texld", "undefined", 2, pshader_texld, D3DPS_VERSION(1,4), D3DPS_VERSION(1,4)}, - {D3DSIO_TEX, "texld", GLNAME_REQUIRE_GLSL, 3, pshader_texld, D3DPS_VERSION(2,0), -1}, + {D3DSIO_TEX, "texld", "undefined", 3, pshader_texld, D3DPS_VERSION(2,0), -1}, {D3DSIO_TEXBEM, "texbem", "undefined", 2, pshader_texbem, 0, D3DPS_VERSION(1,3)}, {D3DSIO_TEXBEML, "texbeml", GLNAME_REQUIRE_GLSL, 2, pshader_texbeml, D3DPS_VERSION(1,0), D3DPS_VERSION(1,3)}, {D3DSIO_TEXREG2AR,"texreg2ar","undefined", 2, pshader_texreg2ar, D3DPS_VERSION(1,1), D3DPS_VERSION(1,3)}, @@ -1249,23 +1249,52 @@ #endif break; case D3DSIO_TEX: { - char tmp[20]; - get_write_mask(*pToken, tmp); - if (version != 14) { - DWORD reg = *pToken & D3DSP_REGNUM_MASK; - sprintf(tmpLine,"TEX T%lu%s, T%lu, texture[%lu], 2D;\n", reg, tmp, reg, reg); - addline(&lineNum, pgmStr, &pgmLength, tmpLine); - ++pToken; - } else { - char reg2[20]; - DWORD reg1 = *pToken & D3DSP_REGNUM_MASK; - if (gen_input_modifier_line(*++pToken, 0, reg2, tmpLine, This->constants)) { + char reg_dest[20]; + char reg_coord[20]; + char reg_coord_swz[20] = ""; + DWORD reg_dest_code; + DWORD reg_sampler_code; + + /* All versions have a destination register */ + reg_dest_code = *pToken & D3DSP_REGNUM_MASK; + get_register_name(*pToken++, reg_dest, This->constants); + + /* 1.0-1.3: Use destination register as coordinate source. No modifiers. + 1.4: Use provided coordinate source register. _dw, _dz, swizzle allowed. + 2.0+: Use provided coordinate source register. No modifiers. + 3.0+: Use provided coordinate source register. Swizzle allowed */ + if (version < 14) + strcpy(reg_coord, reg_dest); + + else if (version == 14) { + if (gen_input_modifier_line(*pToken, 0, reg_coord, tmpLine, This->constants)) addline(&lineNum, pgmStr, &pgmLength, tmpLine); - } - sprintf(tmpLine,"TEX R%lu%s, %s, texture[%lu], 2D;\n", reg1, tmp, reg2, reg1); - addline(&lineNum, pgmStr, &pgmLength, tmpLine); - ++pToken; + get_input_register_swizzle(*pToken, reg_coord_swz); + pToken++; } + else if (version > 14 && version < 30) { + get_register_name(*pToken, reg_coord, This->constants); + pToken++; + } + else if (version >= 30) { + get_input_register_swizzle(*pToken, reg_coord_swz); + get_register_name(*pToken, reg_coord, This->constants); + pToken++; + } + + /* 1.0-1.4: Use destination register number as texture code. + 2.0+: Use provided sampler number as texure code. */ + if (version < 20) + reg_sampler_code = reg_dest_code; + + else { + reg_sampler_code = *pToken & D3DSP_REGNUM_MASK; + pToken++; + } + + sprintf(tmpLine, "TEX %s, %s%s, texture[%lu], 2D;\n", + reg_dest, reg_coord, reg_coord_swz, reg_sampler_code); + addline(&lineNum, pgmStr, &pgmLength, tmpLine); continue; } break;