Stefan Dösinger : wined3d: Implement dsy in ARB.

Alexandre Julliard julliard at winehq.org
Wed Jun 10 10:16:58 CDT 2009


Module: wine
Branch: master
Commit: 258d99d289dc2c2c7d6e9cca77e7cbf0d1c3fdba
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=258d99d289dc2c2c7d6e9cca77e7cbf0d1c3fdba

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Wed Jun 10 00:09:40 2009 -0700

wined3d: Implement dsy in ARB.

---

 dlls/wined3d/arb_program_shader.c |   45 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 44 insertions(+), 1 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 1acea74..ac7ced4 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -103,6 +103,7 @@ struct arb_ps_compiled_shader
     struct stb_const_desc           luminanceconst[MAX_TEXTURES];
     UINT                            int_consts[MAX_CONST_I];
     char                            num_int_consts;
+    UINT                            ycorrection;
 };
 
 struct arb_vs_compile_args
@@ -321,6 +322,22 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl)
             GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->int_consts[i], val));
         }
     }
+
+    if(gl_shader->ycorrection != WINED3D_CONST_NUM_UNUSED)
+    {
+        /* ycorrection.x: Backbuffer height(onscreen) or 0(offscreen).
+         * ycorrection.y: -1.0(onscreen), 1.0(offscreen)
+         * ycorrection.z: 1.0
+         * ycorrection.w: 0.0
+         */
+        float val[4];
+        val[0] = deviceImpl->render_offscreen ? 0.0 : ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height;
+        val[1] = deviceImpl->render_offscreen ? 1.0 : -1.0;
+        val[2] = 1.0;
+        val[3] = 0.0;
+        GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->ycorrection, val));
+        checkGLcall("y correction loading\n");
+    }
 }
 
 static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl)
@@ -2027,6 +2044,22 @@ static void shader_hw_sgn(const struct wined3d_shader_instruction *ins)
     }
 }
 
+static void shader_hw_dsy(const struct wined3d_shader_instruction *ins)
+{
+    SHADER_BUFFER *buffer = ins->ctx->buffer;
+    char src[50];
+    char dst[50];
+    char dst_name[50];
+    BOOL is_color;
+
+    shader_arb_get_dst_param(ins, &ins->dst[0], dst);
+    shader_arb_get_src_param(ins, &ins->src[0], 0, src);
+    shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
+
+    shader_addline(buffer, "DDY %s, %s;\n", dst, src);
+    shader_addline(buffer, "MUL%s %s, %s, ycorrection.y;\n", shader_arb_get_modifier(ins), dst, dst_name);
+}
+
 static void shader_hw_loop(const struct wined3d_shader_instruction *ins)
 {
     SHADER_BUFFER *buffer = ins->ctx->buffer;
@@ -2461,6 +2494,16 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This,
         }
     }
 
+    if(reg_maps->vpos || reg_maps->usesdsy)
+    {
+        compiled->ycorrection = next_local;
+        shader_addline(buffer, "PARAM ycorrection = program.local[%u];\n", next_local++);
+    }
+    else
+    {
+        compiled->ycorrection = WINED3D_CONST_NUM_UNUSED;
+    }
+
     /* Base Shader Body */
     shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx);
 
@@ -3105,7 +3148,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_DP4           */ shader_hw_map2gl,
     /* WINED3DSIH_DST           */ shader_hw_map2gl,
     /* WINED3DSIH_DSX           */ shader_hw_map2gl,
-    /* WINED3DSIH_DSY           */ NULL,
+    /* WINED3DSIH_DSY           */ shader_hw_dsy,
     /* WINED3DSIH_ELSE          */ NULL,
     /* WINED3DSIH_ENDIF         */ NULL,
     /* WINED3DSIH_ENDLOOP       */ shader_hw_endloop,




More information about the wine-cvs mailing list