H. Verbeet : wined3d: Call SetGlTextureDesc() from BindTexture() rather than from PreLoad().

Alexandre Julliard julliard at winehq.org
Thu Jan 3 06:43:39 CST 2008


Module: wine
Branch: master
Commit: 2820ecc5fe34b7746979e0b3d8719f83672c311a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2820ecc5fe34b7746979e0b3d8719f83672c311a

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Wed Jan  2 19:52:05 2008 +0100

wined3d: Call SetGlTextureDesc() from BindTexture() rather than from PreLoad().

---

 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) {




More information about the wine-cvs mailing list