Henri Verbeet : wined3d: A volume's container is always a volume texture.

Alexandre Julliard julliard at winehq.org
Tue Aug 17 11:31:10 CDT 2010


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Aug 16 20:00:24 2010 +0200

wined3d: A volume's container is always a volume texture.

---

 dlls/wined3d/volume.c          |   39 +++++++++------------------------------
 dlls/wined3d/volumetexture.c   |    2 +-
 dlls/wined3d/wined3d_private.h |    4 ++--
 3 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 0d9b82d..9b82fab 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -30,7 +30,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
 static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
     IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
     const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
-    IWineD3DVolumeTexture *texture;
     DWORD active_sampler;
 
     /* We don't need a specific texture unit, but after binding the texture the current unit is dirty.
@@ -60,12 +59,7 @@ static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
         IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_SAMPLER(active_sampler));
     }
 
-    if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DVolumeTexture, (void **)&texture))) {
-        IWineD3DVolumeTexture_BindTexture(texture, FALSE);
-        IWineD3DVolumeTexture_Release(texture);
-    } else {
-        ERR("Volume should be part of a volume texture\n");
-    }
+    IWineD3DVolumeTexture_BindTexture((IWineD3DVolumeTexture *)This->container, FALSE);
 }
 
 void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box)
@@ -93,7 +87,7 @@ void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box)
     }
 }
 
-void volume_set_container(IWineD3DVolumeImpl *volume, IWineD3DBase *container)
+void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container)
 {
     TRACE("volume %p, container %p.\n", volume, container);
 
@@ -207,7 +201,7 @@ static HRESULT WINAPI IWineD3DVolumeImpl_GetContainer(IWineD3DVolume *iface, REF
     }
 
     TRACE("Relaying to QueryInterface\n");
-    return IUnknown_QueryInterface(This->container, riid, ppContainer);
+    return IUnknown_QueryInterface((IWineD3DVolumeTexture *)This->container, riid, ppContainer);
 }
 
 static HRESULT WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DVOLUME_DESC* pDesc) {
@@ -265,27 +259,12 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DL
 
     if (Flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)) {
       /* Don't dirtify */
-    } else {
-      /**
-       * Dirtify on lock
-       * as seen in msdn docs
-       */
-      volume_add_dirty_box(iface, &This->lockedBox);
-
-      /**  Dirtify Container if needed */
-      if (NULL != This->container) {
-
-        IWineD3DVolumeTexture *cont = (IWineD3DVolumeTexture*) This->container;
-        WINED3DRESOURCETYPE containerType = IWineD3DBaseTexture_GetType((IWineD3DBaseTexture *) cont);
-
-        if (containerType == WINED3DRTYPE_VOLUMETEXTURE) {
-          IWineD3DBaseTextureImpl* pTexture = (IWineD3DBaseTextureImpl*) cont;
-          pTexture->baseTexture.texture_rgb.dirty = TRUE;
-          pTexture->baseTexture.texture_srgb.dirty = TRUE;
-        } else {
-          FIXME("Set dirty on container type %d\n", containerType);
-        }
-      }
+    }
+    else
+    {
+        volume_add_dirty_box(iface, &This->lockedBox);
+        This->container->baseTexture.texture_rgb.dirty = TRUE;
+        This->container->baseTexture.texture_srgb.dirty = TRUE;
     }
 
     This->locked = TRUE;
diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c
index 648f381..b1f7ae6 100644
--- a/dlls/wined3d/volumetexture.c
+++ b/dlls/wined3d/volumetexture.c
@@ -466,7 +466,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
         }
 
         /* Set its container to this texture. */
-        volume_set_container((IWineD3DVolumeImpl *)volume, (IWineD3DBase *)texture);
+        volume_set_container((IWineD3DVolumeImpl *)volume, texture);
         texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)volume;
 
         /* Calculate the next mipmap level. */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c7e3025..7f59d24 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1923,7 +1923,7 @@ typedef struct IWineD3DVolumeImpl
 
     /* WineD3DVolume Information */
     WINED3DVOLUMET_DESC      currentDesc;
-    IWineD3DBase            *container;
+    struct IWineD3DVolumeTextureImpl *container;
     BOOL                    lockable;
     BOOL                    locked;
     WINED3DBOX              lockedBox;
@@ -1935,7 +1935,7 @@ void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) DE
 HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width,
         UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool,
         IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
-void volume_set_container(IWineD3DVolumeImpl *volume, IWineD3DBase *container) DECLSPEC_HIDDEN;
+void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container) DECLSPEC_HIDDEN;
 
 /*****************************************************************************
  * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl)




More information about the wine-cvs mailing list