Skip to content
Snippets Groups Projects
Commit 0924f969 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard
Browse files

wined3d: Texture stages that reference NULL textures should just pass

through the result of the previous stage.
parent 70902595
No related branches found
No related tags found
No related merge requests found
......@@ -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.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment