Stefan Doesinger : wined3d: Implement vpos and vface.
Alexandre Julliard
julliard at winehq.org
Wed Jun 17 10:43:26 CDT 2009
Module: wine
Branch: master
Commit: 58c3a0c832cc15120e268bc33bb24ead0e703d63
URL: http://source.winehq.org/git/wine.git/?a=commit;h=58c3a0c832cc15120e268bc33bb24ead0e703d63
Author: Stefan Doesinger <stefan at 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 */
More information about the wine-cvs
mailing list