From b27ae021b3c52d6fc1bf918098219160dedefa5f Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Sat, 10 Mar 2007 19:02:16 -0700 Subject: wined3d: Allow SetCursorProperties on existing cursor --- dlls/wined3d/device.c | 8 +------- dlls/wined3d/texture.c | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0998eec..0339e8d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5207,13 +5207,6 @@ static HRESULT WINAPI IWineD3DDeviceIm TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot); /* some basic validation checks */ - if(This->cursorTexture) { - ENTER_GL(); - glDeleteTextures(1, &This->cursorTexture); - LEAVE_GL(); - This->cursorTexture = 0; - } - if(pCursorBitmap) { /* MSDN: Cursor must be A8R8G8B8 */ if (WINED3DFMT_A8R8G8B8 != pSur->resource.format) { @@ -5243,6 +5236,7 @@ static HRESULT WINAPI IWineD3DDeviceIm This->cursorWidth = pSur->currentDesc.Width; This->cursorHeight = pSur->currentDesc.Height; pSur->glDescription.textureName = 0; /* Prevent the texture from being changed or deleted */ + /* NOTE: It is also important to keep the texture between SetCursorProperties calls */ } This->xHotSpot = XHotSpot; diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index e9a78cc..4c5cdd5 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -95,6 +95,7 @@ static void WINAPI IWineD3DTextureImpl_P /* Override the IWineD3DResource PreLoad method */ unsigned int i; + BOOL loadPerformed = FALSE; BOOL setGlTextureDesc = FALSE; IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; @@ -104,22 +105,26 @@ static void WINAPI IWineD3DTextureImpl_P IWineD3DTexture_BindTexture(iface); ENTER_GL(); - /* If were dirty then reload the surfaces */ - if(This->baseTexture.dirty) { - for (i = 0; i < This->baseTexture.levels; i++) { - if(setGlTextureDesc) + for (i = 0; i < This->baseTexture.levels; i++) { + IWineD3DSurfaceImpl *pSur = (IWineD3DSurfaceImpl *) This->surfaces[i]; + + /* If a texture is dirty, or a surface is forcing a load, then reload the surface */ + if (This->baseTexture.dirty || pSur->Flags & SFLAG_FORCELOAD) + { + if(setGlTextureDesc || pSur->Flags & SFLAG_FORCELOAD) IWineD3DSurface_SetGlTextureDesc(This->surfaces[i], This->baseTexture.textureName, IWineD3DTexture_GetTextureDimensions(iface)); IWineD3DSurface_LoadTexture(This->surfaces[i]); + loadPerformed = TRUE; } - - /* No longer dirty */ - This->baseTexture.dirty = FALSE; - } else { - TRACE("(%p) Texture not dirty, nothing to do\n" , iface); } + + /* No longer dirty */ + This->baseTexture.dirty = FALSE; LEAVE_GL(); + if(!loadPerformed) + TRACE("(%p) Texture not dirty, nothing to do\n" , iface); return ; } -- 1.4.1