H. Verbeet : wined3d: Texture stages that reference NULL textures should just pass

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 12 06:53:45 CDT 2006


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

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Wed Jul 12 00:44:03 2006 +0200

wined3d: Texture stages that reference NULL textures should just pass
through the result of the previous stage.

---

 dlls/wined3d/utils.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index a729344..8275953 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -653,6 +653,17 @@ typedef struct {
     GLenum component_usage[3];
 } tex_op_args;
 
+static BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) {
+    if (op == D3DTOP_DISABLE) return FALSE;
+    if (This->stateBlock->textures[stage]) return FALSE;
+
+    if (arg1 == D3DTA_TEXTURE && op != D3DTOP_SELECTARG2) return TRUE;
+    if (arg2 == D3DTA_TEXTURE && op != D3DTOP_SELECTARG1) return TRUE;
+    if (arg3 == D3DTA_TEXTURE && (op == D3DTOP_MULTIPLYADD || op == D3DTOP_LERP)) return TRUE;
+
+    return FALSE;
+}
+
 void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl*)iface;
     tex_op_args tex_op_args = {{0}, {0}, {0}};
@@ -662,6 +673,13 @@ void set_tex_op_nvrc(IWineD3DDevice *ifa
     TRACE("stage %d, is_alpha %d, op %s, arg1 %#lx, arg2 %#lx, arg3 %#lx, texture_idx %d\n",
             stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, texture_idx);
 
+    /* If a texture stage references an invalid texture unit the stage just
+     * passes through the result from the previous stage */
+    if (is_invalid_op(This, stage, op, arg1, arg2, arg3)) {
+        arg1 = D3DTA_CURRENT;
+        op = D3DTOP_SELECTARG1;
+    }
+
     get_src_and_opr_nvrc(stage, arg1, is_alpha, &tex_op_args.input[0],
             &tex_op_args.mapping[0], &tex_op_args.component_usage[0], texture_idx);
     get_src_and_opr_nvrc(stage, arg2, is_alpha, &tex_op_args.input[1],
@@ -1053,6 +1071,13 @@ #define GLINFO_LOCATION ((IWineD3DImpl *
                 scal_target = useext(GL_RGB_SCALE);
         }
 
+        /* If a texture stage references an invalid texture unit the stage just
+         * passes through the result from the previous stage */
+        if (is_invalid_op(This, Stage, op, arg1, arg2, arg3)) {
+            arg1 = D3DTA_CURRENT;
+            op = D3DTOP_SELECTARG1;
+        }
+
         /* From MSDN (WINED3DTSS_ALPHAARG1) :
            The default argument is D3DTA_TEXTURE. If no texture is set for this stage,
                    then the default argument is D3DTA_DIFFUSE.




More information about the wine-cvs mailing list