This fixes the most glaring corruptions when DungeonSiege abruptly decides at the middle of one level to activate multi-texturing. Lionel Changelog: - fix graphical corruption on surface lock when multi-texturing is active -- Lionel Ulmer - http://www.bbrox.org/
--- dlls/ddraw_CVS/d3ddevice/mesa.c Mon Nov 10 19:42:20 2003 +++ dlls/ddraw/d3ddevice/mesa.c Sat Nov 15 15:45:00 2003 @@ -105,10 +105,22 @@ IDirect3DDeviceGLImpl* gl_d3d_dev = (IDirect3DDeviceGLImpl*) d3d_dev; DWORD opt_bitmap = 0x00000000; + if (gl_d3d_dev->current_bound_texture[1] != NULL) { + 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; + } + /* 'unbound' texture level 1 in that case to disable multi-texturing */ + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + } if (gl_d3d_dev->current_active_tex_unit != GL_TEXTURE0_WINE) { GL_extensions.glActiveTexture(GL_TEXTURE0_WINE); gl_d3d_dev->current_active_tex_unit = GL_TEXTURE0_WINE; } + if ((gl_d3d_dev->current_bound_texture[0] == NULL) || + (d3d_dev->state_block.texture_stage_state[0][D3DTSS_COLOROP - 1] == D3DTOP_DISABLE)) + glEnable(GL_TEXTURE_2D); if (gl_d3d_dev->unlock_tex == 0) { glGenTextures(1, &gl_d3d_dev->unlock_tex); glBindTexture(GL_TEXTURE_2D, gl_d3d_dev->unlock_tex); @@ -132,18 +144,6 @@ } if (gl_d3d_dev->depth_test != FALSE) glDisable(GL_DEPTH_TEST); - if ((gl_d3d_dev->current_bound_texture[0] == NULL) || - (d3d_dev->state_block.texture_stage_state[0][D3DTSS_COLOROP - 1] == D3DTOP_DISABLE)) - glEnable(GL_TEXTURE_2D); - if (gl_d3d_dev->current_bound_texture[1] != NULL) { - 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; - } - /* 'unbound' texture level 1 in that case to disable multi-texturing */ - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); - } glEnable(GL_SCISSOR_TEST); if ((d3d_dev->active_viewport.dvMinZ != 0.0) || (d3d_dev->active_viewport.dvMaxZ != 1.0)) { --- dlls/ddraw_CVS/mesa.c Mon Nov 10 19:42:20 2003 +++ dlls/ddraw/mesa.c Sat Nov 15 13:29:51 2003 @@ -907,6 +907,8 @@ } glPixelStorei(GL_UNPACK_ROW_LENGTH, current_storage_width); + TRACE(" initialized texture upload for level %d with conversion %d.\n", current_level, convert_type); + return DD_OK; } @@ -933,8 +935,6 @@ /* Used when converting stuff */ line_increase = src_d->u1.lPitch - (width * bpp); - TRACE(" uploading texture to memory using conversion %d.\n", convert_type); - switch (convert_type) { case CONVERT_PALETTED: { IDirectDrawPaletteImpl* pal = current_surface->palette;