From 0924f969d11a95df55e673496131a802d3f446be Mon Sep 17 00:00:00 2001 From: "H. Verbeet" Date: Wed, 12 Jul 2006 00:44:03 +0200 Subject: [PATCH] wined3d: Texture stages that reference NULL textures should just pass through the result of the previous stage. --- dlls/wined3d/utils.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index a7293441482..8275953aac7 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 *iface, BOOL is_alpha, int stage, D3DTEXTURE 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 @@ void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, 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.