Module: wine Branch: master Commit: 58c3a0c832cc15120e268bc33bb24ead0e703d63 URL: http://source.winehq.org/git/wine.git/?a=commit;h=58c3a0c832cc15120e268bc33b...
Author: Stefan Doesinger stefan@codeweavers.com Date: Wed Jun 17 07:39:09 2009 +0200
wined3d: Implement vpos and vface.
---
dlls/wined3d/arb_program_shader.c | 29 ++++++++++++++++++++++++++++- dlls/wined3d/baseshader.c | 1 + dlls/wined3d/wined3d_private.h | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 1a9781e..c928174 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -806,6 +806,21 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction sprintf(register_name, "I%u", reg->idx); break;
+ case WINED3DSPR_MISCTYPE: + if(reg->idx == 0) + { + sprintf(register_name, "vpos"); + } + else if(reg->idx == 1) + { + sprintf(register_name, "fragment.facing.x"); + } + else + { + FIXME("Unknown MISCTYPE register index %u\n", reg->idx); + } + break; + default: FIXME("Unhandled register type %#x[%u]\n", reg->type, reg->idx); sprintf(register_name, "unrecognized_register[%u]", reg->idx); @@ -2626,7 +2641,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, * So enable the best we can get. */ if(reg_maps->usesdsx || reg_maps->usesdsy || reg_maps->loop_depth > 0 || reg_maps->usestexldd || - reg_maps->usestexldl) + reg_maps->usestexldl || reg_maps->usesfacing) { want_nv_prog = TRUE; } @@ -2760,6 +2775,18 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, { compiled->ycorrection = next_local; shader_addline(buffer, "PARAM ycorrection = program.local[%u];\n", next_local++); + + if(reg_maps->vpos) + { + shader_addline(buffer, "TEMP vpos;\n"); + /* ycorrection.x: Backbuffer height(onscreen) or 0(offscreen). + * ycorrection.y: -1.0(onscreen), 1.0(offscreen) + * ycorrection.z: 1.0 + * ycorrection.w: 0.0 + */ + shader_addline(buffer, "MAD vpos, fragment.position, ycorrection.zyww, ycorrection.wxww;\n"); + shader_addline(buffer, "FLR vpos.xy, vpos;\n"); + } } else { diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 0d253a4..d1c8a4b 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -287,6 +287,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh
case WINED3DSPR_MISCTYPE: if (pshader && reg->idx == 0) reg_maps->vpos = 1; + if (pshader && reg->idx == 1) reg_maps->usesfacing = 1; break;
case WINED3DSPR_CONST: diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b7aa84d..aab56cd 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -629,7 +629,7 @@ typedef struct shader_reg_maps
WINED3DSAMPLER_TEXTURE_TYPE sampler_type[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)]; BOOL bumpmat[MAX_TEXTURES], luminanceparams[MAX_TEXTURES]; - char usesnrm, vpos, usesdsx, usesdsy, usestexldd, usesmova, usestexldl; + char usesnrm, vpos, usesdsx, usesdsy, usestexldd, usesmova, usestexldl, usesfacing; char usesrelconstF;
/* Whether or not loops are used in this shader, and nesting depth */