Stefan Doesinger : wined3d: Implement D3DSPDM_PARTIALPRECISION support.

Alexandre Julliard julliard at winehq.org
Wed Jun 17 10:43:27 CDT 2009


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

Author: Stefan Doesinger <stefan at codeweavers.com>
Date:   Thu May 28 19:42:24 2009 +0200

wined3d: Implement D3DSPDM_PARTIALPRECISION support.

---

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

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index b39732d..80bb563 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -913,30 +913,38 @@ static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, DWORD d
 static const char *shader_arb_get_modifier(const struct wined3d_shader_instruction *ins)
 {
     DWORD mod;
-    const char *ret = "";
+    struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
     if (!ins->dst_count) return "";
 
     mod = ins->dst[0].modifiers;
-    if(mod & WINED3DSPDM_SATURATE)
-    {
-        ret = "_SAT";
-        mod &= ~WINED3DSPDM_SATURATE;
-    }
-    if(mod & WINED3DSPDM_PARTIALPRECISION)
-    {
-        FIXME("Unhandled modifier WINED3DSPDM_PARTIALPRECISION\n");
-        mod &= ~WINED3DSPDM_PARTIALPRECISION;
-    }
+
+    /* Silently ignore PARTIALPRECISION if its not supported */
+    if(priv->target_version == ARB) mod &= ~WINED3DSPDM_PARTIALPRECISION;
+
     if(mod & WINED3DSPDM_MSAMPCENTROID)
     {
         FIXME("Unhandled modifier WINED3DSPDM_MSAMPCENTROID\n");
         mod &= ~WINED3DSPDM_MSAMPCENTROID;
     }
-    if(mod)
+
+    switch(mod)
     {
-        FIXME("Unknown modifiers 0x%08x\n", mod);
+        case WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION:
+            return "H_SAT";
+
+        case WINED3DSPDM_SATURATE:
+            return "_SAT";
+
+        case WINED3DSPDM_PARTIALPRECISION:
+            return "H";
+
+        case 0:
+            return "";
+
+        default:
+            FIXME("Unknown modifiers 0x%08x\n", mod);
+            return "";
     }
-    return ret;
 }
 
 #define TEX_PROJ        0x1
@@ -953,7 +961,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
     struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
-    const char *mod = shader_arb_get_modifier(ins);
+    const char *mod;
 
     switch(sampler_type) {
         case WINED3DSTT_1D:
@@ -989,6 +997,12 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
             tex_type = "";
     }
 
+    /* TEX, TXL, TXD and TXP do not support the "H" modifier,
+     * so don't use shader_arb_get_modifier
+     */
+    if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) mod = "_SAT";
+    else mod = "";
+
     if (flags & TEX_DERIV)
     {
         if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivates\n");




More information about the wine-cvs mailing list