Module: wine Branch: master Commit: 2f96220b3e76b28bd1baa4f1d17cdbcea57617f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f96220b3e76b28bd1baa4f1d1...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu Feb 15 13:50:59 2007 +0100
6/10: WineD3D: rsq and rcp instructions may need a default swizzle in arb.
ARB shaders need a swizzle for the RSQ and RCP instructions, while d3d shaders do not. The DirectX sdk says that the x component is used if no swizzle is given.
---
dlls/wined3d/arb_program_shader.c | 21 +++++++++++++++++++++ dlls/wined3d/vertexshader.c | 4 ++-- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 4742447..083c812 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -881,6 +881,27 @@ void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg) { } }
+void vshader_hw_rsq_rcp(SHADER_OPCODE_ARG* arg) { + CONST SHADER_OPCODE* curOpcode = arg->opcode; + SHADER_BUFFER* buffer = arg->buffer; + DWORD dst = arg->dst; + DWORD src = arg->src[0]; + DWORD swizzle = (src & WINED3DSP_SWIZZLE_MASK) >> WINED3DSP_SWIZZLE_SHIFT; + + char tmpLine[256]; + + strcpy(tmpLine, curOpcode->glname); /* Opcode */ + vshader_program_add_param(arg, dst, FALSE, tmpLine); /* Destination */ + strcat(tmpLine, ","); + vshader_program_add_param(arg, src, TRUE, tmpLine); + if ((WINED3DSP_NOSWIZZLE >> WINED3DSP_SWIZZLE_SHIFT) == swizzle) { + /* Dx sdk says .x is used if no swizzle is given */ + strcat(tmpLine, ".x"); + } + + shader_addline(buffer, "%s;\n", tmpLine); +} + /* TODO: merge with pixel shader */ /* Map the opcode 1-to-1 to the GL code */ void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg) { diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index eeeb743..37c92f4 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -483,8 +483,8 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = { {WINED3DSIO_SUB, "sub", "SUB", 1, 3, vshader_sub, vshader_hw_map2gl, shader_glsl_arith, 0, 0}, {WINED3DSIO_MAD, "mad", "MAD", 1, 4, vshader_mad, vshader_hw_map2gl, shader_glsl_mad, 0, 0}, {WINED3DSIO_MUL, "mul", "MUL", 1, 3, vshader_mul, vshader_hw_map2gl, shader_glsl_arith, 0, 0}, - {WINED3DSIO_RCP, "rcp", "RCP", 1, 2, vshader_rcp, vshader_hw_map2gl, shader_glsl_rcp, 0, 0}, - {WINED3DSIO_RSQ, "rsq", "RSQ", 1, 2, vshader_rsq, vshader_hw_map2gl, shader_glsl_map2gl, 0, 0}, + {WINED3DSIO_RCP, "rcp", "RCP", 1, 2, vshader_rcp, vshader_hw_rsq_rcp,shader_glsl_rcp, 0, 0}, + {WINED3DSIO_RSQ, "rsq", "RSQ", 1, 2, vshader_rsq, vshader_hw_rsq_rcp,shader_glsl_map2gl, 0, 0}, {WINED3DSIO_DP3, "dp3", "DP3", 1, 3, vshader_dp3, vshader_hw_map2gl, shader_glsl_dot, 0, 0}, {WINED3DSIO_DP4, "dp4", "DP4", 1, 3, vshader_dp4, vshader_hw_map2gl, shader_glsl_dot, 0, 0}, {WINED3DSIO_MIN, "min", "MIN", 1, 3, vshader_min, vshader_hw_map2gl, shader_glsl_map2gl, 0, 0}, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 3a2ee8a..ba01c02 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1601,6 +1601,7 @@ extern void pshader_hw_texm3x3vspec(SHADER_OPCODE_ARG* arg); /* ARB vertex shader prototypes */ extern void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg); extern void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg); +extern void vshader_hw_rsq_rcp(SHADER_OPCODE_ARG* arg);
/* GLSL helper functions */ extern void shader_glsl_add_instruction_modifiers(SHADER_OPCODE_ARG *arg);