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