Commit 63d9cfcf authored by Lionel Ulmer's avatar Lionel Ulmer Committed by Alexandre Julliard

Fix some other multi-texturing problems.

parent 582f7d5d
...@@ -105,13 +105,13 @@ static DWORD d3ddevice_set_state_for_flush(IDirect3DDeviceImpl *d3d_dev, LPCRECT ...@@ -105,13 +105,13 @@ static DWORD d3ddevice_set_state_for_flush(IDirect3DDeviceImpl *d3d_dev, LPCRECT
IDirect3DDeviceGLImpl* gl_d3d_dev = (IDirect3DDeviceGLImpl*) d3d_dev; IDirect3DDeviceGLImpl* gl_d3d_dev = (IDirect3DDeviceGLImpl*) d3d_dev;
DWORD opt_bitmap = 0x00000000; DWORD opt_bitmap = 0x00000000;
if (gl_d3d_dev->current_bound_texture[1] != NULL) { if ((gl_d3d_dev->current_bound_texture[1] != NULL) &&
((d3d_dev->state_block.texture_stage_state[1][D3DTSS_COLOROP - 1] != D3DTOP_DISABLE))) {
if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE1_WINE) { if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE1_WINE) {
GL_extensions.glActiveTexture(GL_TEXTURE1_WINE); GL_extensions.glActiveTexture(GL_TEXTURE1_WINE);
gl_d3d_dev->current_active_tex_unit = GL_TEXTURE1_WINE; gl_d3d_dev->current_active_tex_unit = GL_TEXTURE1_WINE;
} }
/* 'unbound' texture level 1 in that case to disable multi-texturing */ /* Disable multi-texturing for level 1 to disable all others */
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
} }
if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE0_WINE) { if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE0_WINE) {
...@@ -196,7 +196,6 @@ static void d3ddevice_restore_state_after_flush(IDirect3DDeviceImpl *d3d_dev, DW ...@@ -196,7 +196,6 @@ static void d3ddevice_restore_state_after_flush(IDirect3DDeviceImpl *d3d_dev, DW
if (gl_d3d_dev->blending != 0) glEnable(GL_BLEND); if (gl_d3d_dev->blending != 0) glEnable(GL_BLEND);
if (gl_d3d_dev->fogging != 0) glEnable(GL_FOG); if (gl_d3d_dev->fogging != 0) glEnable(GL_FOG);
glDisable(GL_SCISSOR_TEST); glDisable(GL_SCISSOR_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, gl_d3d_dev->current_tex_env);
if (opt_bitmap & DEPTH_RANGE_BIT) { if (opt_bitmap & DEPTH_RANGE_BIT) {
glDepthRange(d3d_dev->active_viewport.dvMinZ, d3d_dev->active_viewport.dvMaxZ); glDepthRange(d3d_dev->active_viewport.dvMinZ, d3d_dev->active_viewport.dvMaxZ);
} }
...@@ -209,11 +208,27 @@ static void d3ddevice_restore_state_after_flush(IDirect3DDeviceImpl *d3d_dev, DW ...@@ -209,11 +208,27 @@ static void d3ddevice_restore_state_after_flush(IDirect3DDeviceImpl *d3d_dev, DW
d3d_dev->matrices_updated(d3d_dev, TEXMAT0_CHANGED); d3d_dev->matrices_updated(d3d_dev, TEXMAT0_CHANGED);
} }
/* This is a hack to prevent querying the current texture from GL. Basically, at the next if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE0_WINE) {
DrawPrimitive call, this will bind the correct texture to this stage. */ GL_extensions.glActiveTexture(GL_TEXTURE0_WINE);
gl_d3d_dev->current_active_tex_unit = GL_TEXTURE0_WINE;
}
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, gl_d3d_dev->current_tex_env);
/* Note that here we could directly re-bind the previous texture... But it would in some case be a spurious
bind if ever the game changes the texture just after.
So choose 0x00000001 to postpone the binding to the next time we draw something on screen. */
gl_d3d_dev->current_bound_texture[0] = (IDirectDrawSurfaceImpl *) 0x00000001; gl_d3d_dev->current_bound_texture[0] = (IDirectDrawSurfaceImpl *) 0x00000001;
gl_d3d_dev->current_bound_texture[1] = (IDirectDrawSurfaceImpl *) 0x00000000;
if (d3d_dev->state_block.texture_stage_state[0][D3DTSS_COLOROP - 1] == D3DTOP_DISABLE) glDisable(GL_TEXTURE_2D); if (d3d_dev->state_block.texture_stage_state[0][D3DTSS_COLOROP - 1] == D3DTOP_DISABLE) glDisable(GL_TEXTURE_2D);
/* And re-enabled if needed texture level 1 */
if ((gl_d3d_dev->current_bound_texture[1] != NULL) &&
(d3d_dev->state_block.texture_stage_state[1][D3DTSS_COLOROP - 1] != D3DTOP_DISABLE)) {
if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE1_WINE) {
GL_extensions.glActiveTexture(GL_TEXTURE1_WINE);
gl_d3d_dev->current_active_tex_unit = GL_TEXTURE1_WINE;
}
glEnable(GL_TEXTURE_2D);
}
} }
/* retrieve the X drawable to use on a given DC */ /* retrieve the X drawable to use on a given DC */
...@@ -1332,7 +1347,7 @@ static void draw_primitive_strided(IDirect3DDeviceImpl *This, ...@@ -1332,7 +1347,7 @@ static void draw_primitive_strided(IDirect3DDeviceImpl *This,
/* Compute the number of active texture stages and set the various texture parameters */ /* Compute the number of active texture stages and set the various texture parameters */
num_active_stages = draw_primitive_handle_textures(This); num_active_stages = draw_primitive_handle_textures(This);
/* And restore to handle '0' in the case we use glTexCorrd calls */ /* And restore to handle '0' in the case we use glTexCoord calls */
if (glThis->current_active_tex_unit != GL_TEXTURE0_WINE) { if (glThis->current_active_tex_unit != GL_TEXTURE0_WINE) {
GL_extensions.glActiveTexture(GL_TEXTURE0_WINE); GL_extensions.glActiveTexture(GL_TEXTURE0_WINE);
glThis->current_active_tex_unit = GL_TEXTURE0_WINE; glThis->current_active_tex_unit = GL_TEXTURE0_WINE;
...@@ -1909,14 +1924,16 @@ GL_IDirect3DDeviceImpl_7_3T_SetTextureStageState(LPDIRECT3DDEVICE7 iface, ...@@ -1909,14 +1924,16 @@ GL_IDirect3DDeviceImpl_7_3T_SetTextureStageState(LPDIRECT3DDEVICE7 iface,
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
TRACE(" disabling 2D texturing.\n"); TRACE(" disabling 2D texturing.\n");
} else { } else {
/* Re-enable texturing */ /* Re-enable texturing only if COLOROP was not already disabled... */
if (This->current_texture[0] != NULL) { if ((glThis->current_bound_texture[dwStage] != NULL) &&
(This->state_block.texture_stage_state[dwStage][D3DTSS_COLOROP - 1] != D3DTOP_DISABLE)) {
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
TRACE(" enabling 2D texturing.\n"); TRACE(" enabling 2D texturing.\n");
} }
/* Re-Enable GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT */ /* Re-Enable GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT */
if (dwState != D3DTOP_DISABLE) { if ((dwState != D3DTOP_DISABLE) &&
(This->state_block.texture_stage_state[dwStage][D3DTSS_COLOROP - 1] != D3DTOP_DISABLE)) {
if (glThis->current_tex_env != GL_COMBINE_EXT) { if (glThis->current_tex_env != GL_COMBINE_EXT) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glThis->current_tex_env = GL_COMBINE_EXT; glThis->current_tex_env = GL_COMBINE_EXT;
...@@ -2153,6 +2170,10 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This) ...@@ -2153,6 +2170,10 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
IDirectDrawSurfaceImpl *surf_ptr = This->current_texture[stage]; IDirectDrawSurfaceImpl *surf_ptr = This->current_texture[stage];
GLenum unit; GLenum unit;
/* If this stage is disabled, no need to go further... */
if (This->state_block.texture_stage_state[stage][D3DTSS_COLOROP - 1] == D3DTOP_DISABLE)
break;
/* First check if we need to bind any other texture for this stage */ /* First check if we need to bind any other texture for this stage */
if (This->current_texture[stage] != glThis->current_bound_texture[stage]) { if (This->current_texture[stage] != glThis->current_bound_texture[stage]) {
if (This->current_texture[stage] == NULL) { if (This->current_texture[stage] == NULL) {
...@@ -2164,10 +2185,7 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This) ...@@ -2164,10 +2185,7 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
glThis->current_active_tex_unit = unit; glThis->current_active_tex_unit = unit;
} }
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
if (stage == 0) {
glDisable(GL_TEXTURE_2D);
}
} else { } else {
GLenum tex_name = ((IDirect3DTextureGLImpl *) surf_ptr->tex_private)->tex_name; GLenum tex_name = ((IDirect3DTextureGLImpl *) surf_ptr->tex_private)->tex_name;
......
...@@ -446,7 +446,7 @@ HRESULT direct3d_create(IDirectDrawImpl *This) ...@@ -446,7 +446,7 @@ HRESULT direct3d_create(IDirectDrawImpl *This)
This->d3d_private = globject; This->d3d_private = globject;
TRACE(" creating Mesa private storage at %p.\n", globject); TRACE(" creating OpenGL private storage at %p.\n", globject);
return D3D_OK; return D3D_OK;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment