--- dlls/wined3d/cubetexture.c | 21 +++++++++++++++------ dlls/wined3d/texture.c | 19 +++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c index e99ab38..5d16733 100644 --- a/dlls/wined3d/cubetexture.c +++ b/dlls/wined3d/cubetexture.c @@ -102,7 +102,6 @@ static DWORD WINAPI IWineD3DCubeTextureImpl_GetPriority(IWineD3DCubeTexture *ifa static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) { /* Override the IWineD3DResource Preload method */ unsigned int i,j; - BOOL setGlTextureDesc = FALSE; IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; BOOL srgb_mode = This->baseTexture.is_srgb; @@ -110,8 +109,6 @@ static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) { TRACE("(%p) : About to load texture: dirtified(%d)\n", This, This->baseTexture.dirty); - if (This->baseTexture.textureName == 0) setGlTextureDesc = TRUE; - /* We only have to activate a context for gl when we're not drawing. In most cases PreLoad will be called during draw * and a context was activated at the beginning of drawPrimitive */ @@ -132,8 +129,6 @@ static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) { if (This->baseTexture.dirty) { for (i = 0; i < This->baseTexture.levels; i++) { for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z ; j++) { - if(setGlTextureDesc) - IWineD3DSurface_SetGlTextureDesc(This->surfaces[j][i], This->baseTexture.textureName, cube_targets[j]); IWineD3DSurface_LoadTexture(This->surfaces[j][i], srgb_mode); } } @@ -210,8 +205,22 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_GetDirty(IWineD3DCubeTexture *iface) static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *iface) { IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; + BOOL set_gl_texture_desc = This->baseTexture.textureName == 0; + HRESULT hr; + TRACE("(%p) : relay to BaseTexture\n", This); - return IWineD3DBaseTextureImpl_BindTexture((IWineD3DBaseTexture *)iface); + + hr = IWineD3DBaseTextureImpl_BindTexture((IWineD3DBaseTexture *)iface); + if (set_gl_texture_desc && SUCCEEDED(hr)) { + UINT i, j; + for (i = 0; i < This->baseTexture.levels; ++i) { + for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j) { + IWineD3DSurface_SetGlTextureDesc(This->surfaces[j][i], This->baseTexture.textureName, cube_targets[j]); + } + } + } + + return hr; } static HRESULT WINAPI IWineD3DCubeTextureImpl_UnBindTexture(IWineD3DCubeTexture *iface) { diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index c96d35d..3c3fc89 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -95,7 +95,6 @@ static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface) { /* Override the IWineD3DResource PreLoad method */ unsigned int i; - BOOL setGlTextureDesc = FALSE; IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; BOOL srgb_mode = This->baseTexture.is_srgb; @@ -103,8 +102,6 @@ static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface) { TRACE("(%p) : About to load texture\n", This); - if (This->baseTexture.textureName == 0) setGlTextureDesc = TRUE; - if(!device->isInDraw) { /* ActivateContext sets isInDraw to TRUE when loading a pbuffer into a texture, thus no danger of * recursive calls @@ -121,8 +118,6 @@ static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface) { /* If the texture is marked dirty or the srgb sampler setting has changed since the last load then reload the surfaces */ if (This->baseTexture.dirty) { for (i = 0; i < This->baseTexture.levels; i++) { - if(setGlTextureDesc) - IWineD3DSurface_SetGlTextureDesc(This->surfaces[i], This->baseTexture.textureName, IWineD3DTexture_GetTextureDimensions(iface)); IWineD3DSurface_LoadTexture(This->surfaces[i], srgb_mode); } } else if (srgb_was_toggled) { @@ -193,8 +188,20 @@ static BOOL WINAPI IWineD3DTextureImpl_GetDirty(IWineD3DTexture *iface) { static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; + BOOL set_gl_texture_desc = This->baseTexture.textureName == 0; + HRESULT hr; + TRACE("(%p) : relay to BaseTexture\n", This); - return IWineD3DBaseTextureImpl_BindTexture((IWineD3DBaseTexture *)iface); + + hr = IWineD3DBaseTextureImpl_BindTexture((IWineD3DBaseTexture *)iface); + if (set_gl_texture_desc && SUCCEEDED(hr)) { + UINT i; + for (i = 0; i < This->baseTexture.levels; ++i) { + IWineD3DSurface_SetGlTextureDesc(This->surfaces[i], This->baseTexture.textureName, IWineD3DTexture_GetTextureDimensions(iface)); + } + } + + return hr; } static HRESULT WINAPI IWineD3DTextureImpl_UnBindTexture(IWineD3DTexture *iface) {