diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 1a9781e3e16..c9281745b1a 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 0d253a429ba..d1c8a4bb0a6 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 b7aa84d43a6..aab56cdc331 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 */