[dx8-18] Warcraft3 working ...

Raphaël Junqueira fenix at club-internet.fr
Sun May 11 06:16:46 CDT 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,

  I just seen that alexandre has comitted my d3d8-17 patch :)

  Now the good news: 
  - with this patch Warcraft3 is working well now (only minors dinput problems 
remains) ;)
  - Max Payne begin to launch (it crash after)
  - more d3d samples works

Changelog:
 - Surface pool init fixes
 - minor indent and traces fixes
 - fix locking/unlocking/dirty behavior (dirtify on lock) + optimisations 
(only copy when dirty)
 - fix IDirect3DDevice8::Clear behavior (problem seen after an 
locking/unlocking code error)
 - begin to fix volume and cube textures management

Todo:
 - split traces into many debug channels (we have too many traces)
 - understand cube textures 
 - fixing vertex shaders
 - beginning of split into d3d8/d3dcore
 - HW vertex shaders
 - HW rendering surface / swapchain support (on d3dcore with GLX 1.3 support)

Regards,
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+vjEep7NA3AmQTU4RAk2vAJ40zL4bu68Dp+SBJi7/rePXQAwmfQCfV6aV
E9+obOj7OxIauFrvItZVMrM=
=hbUI
-----END PGP SIGNATURE-----
-------------- next part --------------
? d3d8_18.patch.tgz
Index: cubetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v
retrieving revision 1.4
diff -u -r1.4 cubetexture.c
--- cubetexture.c	12 Apr 2003 00:06:43 -0000	1.4
+++ cubetexture.c	11 May 2003 10:44:06 -0000
@@ -86,23 +86,28 @@
 }
 HRESULT  WINAPI        IDirect3DCubeTexture8Impl_SetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DCubeTexture8Impl_GetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DCubeTexture8Impl_FreePrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_SetPriority(LPDIRECT3DCUBETEXTURE8 iface, DWORD PriorityNew) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 DWORD    WINAPI        IDirect3DCubeTexture8Impl_GetPriority(LPDIRECT3DCUBETEXTURE8 iface) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 void     WINAPI        IDirect3DCubeTexture8Impl_PreLoad(LPDIRECT3DCUBETEXTURE8 iface) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
@@ -134,36 +139,62 @@
 }
 
 /* IDirect3DCubeTexture8 */
-HRESULT  WINAPI        IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE8 iface,UINT Level,D3DSURFACE_DESC *pDesc) {
+HRESULT  WINAPI        IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE8 iface, UINT Level, D3DSURFACE_DESC* pDesc) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     if (Level < This->levels) {
-        TRACE("(%p) Level (%d)\n", This, Level);
-        return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8)This->surfaces[Level], pDesc);
+        TRACE("(%p) level (%d)\n", This, Level);
+        return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8) This->surfaces[Level], pDesc);
     } else {
-        FIXME("(%p) Level (%d)\n", This, Level);
+        FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+        return D3DERR_INVALIDCALL;
     }
     return D3D_OK;
 }
-HRESULT  WINAPI        IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface8** ppCubeMapSurface) {
+HRESULT  WINAPI        IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface8** ppCubeMapSurface) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    TRACE("(%p) : returning %p\n", This, This->surfaces[FaceType][Level]);
-    *ppCubeMapSurface = (LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level];
-    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8)This->surfaces[FaceType][Level]);
+    if (Level < This->levels) {
+        *ppCubeMapSurface = (LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level];
+        IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppCubeMapSurface);
+	TRACE("(%p) -> faceType(%d) level(%d) returning surface@%p \n", This, FaceType, Level, This->surfaces[FaceType][Level]);
+    } else {
+        FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+        return D3DERR_INVALIDCALL;
+    }
     return D3D_OK;
 }
-HRESULT  WINAPI        IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) {
+HRESULT  WINAPI        IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    if (Level < This->levels) {
+      /**
+       * Not dirtified while Surfaces don't notify dirtification
+       * This->Dirty = TRUE;
+       */
+      hr = IDirect3DSurface8_LockRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level], pLockedRect, pRect, Flags);
+      TRACE("(%p) -> faceType(%d) level(%d) returning memory@%p success(%lu)\n", This, FaceType, Level, pLockedRect->pBits, hr);
+    } else {
+      FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+      return D3DERR_INVALIDCALL;
+    }
+    return hr;
 }
-HRESULT  WINAPI        IDirect3DCubeTexture8Impl_UnlockRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level) {
+HRESULT  WINAPI        IDirect3DCubeTexture8Impl_UnlockRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
-    This->Dirty = TRUE;
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    if (Level < This->levels) {
+      hr = IDirect3DSurface8_UnlockRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level]);
+      FIXME("(%p) -> faceType(%d) level(%d) success(%lu)\n", This, FaceType, Level, hr);
+    } else {
+      FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+      return D3DERR_INVALIDCALL;
+    }
+    return hr;
 }
-HRESULT  WINAPI        IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,CONST RECT* pDirtyRect) {
+HRESULT  WINAPI        IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect) {
     ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
     This->Dirty = TRUE;
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);
+    return D3D_OK;
 }
 
 
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.24
diff -u -r1.24 d3d8_private.h
--- d3d8_private.h	11 May 2003 03:35:27 -0000	1.24
+++ d3d8_private.h	11 May 2003 10:44:10 -0000
@@ -455,10 +455,13 @@
     DWORD                   ref;
 
     /* IDirect3DSwapChain8 fields */
+    IDirect3DSurface8Impl  *frontBuffer;
+    IDirect3DSurface8Impl  *backBuffer;
+    D3DPRESENT_PARAMETERS   PresentParms;
 };
 
 /* IUnknown: */
-extern HRESULT WINAPI IDirect3DSwapChain8Impl_QueryInterface(LPDIRECT3DSWAPCHAIN8 iface,REFIID refiid,LPVOID *obj);
+extern HRESULT WINAPI IDirect3DSwapChain8Impl_QueryInterface(LPDIRECT3DSWAPCHAIN8 iface, REFIID refiid, LPVOID *obj);
 extern ULONG WINAPI   IDirect3DSwapChain8Impl_AddRef(LPDIRECT3DSWAPCHAIN8 iface);
 extern ULONG WINAPI   IDirect3DSwapChain8Impl_Release(LPDIRECT3DSWAPCHAIN8 iface);
 
@@ -497,6 +500,7 @@
     BOOL                    lockable;
     BOOL                    locked;
     RECT                    lockedRect;
+    BOOL                    Dirty;
 };
 
 /* IUnknown: */
@@ -669,6 +673,8 @@
     D3DRESOURCETYPE         ResourceType;
 
     /* IDirect3DBaseTexture8 fields */
+    BOOL                    Dirty;
+
     /*
      *BOOL                    isManaged;
      *DWORD                   lod;
@@ -718,6 +724,7 @@
     D3DRESOURCETYPE         ResourceType;
 
     /* IDirect3DBaseTexture8 fields */
+    BOOL                    Dirty;
 
     /* IDirect3DCubeTexture8 fields */
     UINT                    edgeLength;
@@ -726,7 +733,6 @@
     D3DFORMAT               format;
 
     IDirect3DSurface8Impl  *surfaces[6][MAX_LEVELS];
-    BOOL                    Dirty;
 };
 
 /* IUnknown: */
@@ -779,6 +785,7 @@
     D3DRESOURCETYPE         ResourceType;
 
     /* IDirect3DBaseTexture8 fields */
+    BOOL                    Dirty;
 
     /* IDirect3DTexture8 fields */
     UINT                    width;
@@ -787,9 +794,7 @@
     DWORD                   usage;
     D3DFORMAT               format;
 
-    IDirect3DDevice8Impl   *device;
     IDirect3DSurface8Impl  *surfaces[MAX_LEVELS];
-    BOOL                    Dirty;
 };
 
 /* IUnknown: */
@@ -842,6 +847,7 @@
     D3DRESOURCETYPE         ResourceType;
 
     /* IDirect3DBaseTexture8 fields */
+    BOOL                    Dirty;
 
     /* IDirect3DVolumeTexture8 fields */
     UINT                    width;
@@ -852,7 +858,6 @@
     D3DFORMAT               format;
 
     IDirect3DVolume8Impl   *volumes[MAX_LEVELS];
-    BOOL                    Dirty;
 };
 
 /* IUnknown: */
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.48
diff -u -r1.48 device.c
--- device.c	11 May 2003 03:35:27 -0000	1.48
+++ device.c	11 May 2003 10:44:21 -0000
@@ -432,10 +432,15 @@
                                 }
                             }
                             break;
+			    
+			case D3DRTYPE_CUBETEXTURE:
+                            r = 0.0f; q = 0.0f; /* Avoid compiler warnings, need these vars later for other textures */
+                            FIXME("Unhandled texture type: D3DRTYPE_CUBETEXTURE\n");
+			    break;
 
                         default:
                             r = 0.0f; q = 0.0f; /* Avoid compiler warnings, need these vars later for other textures */
-                            FIXME("Unhandled texture type\n");
+                            FIXME("Unhandled texture type: %lu\n", IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) This->StateBlock->textures[textureNo]));
                         }
                     } else {
                         /* Note I have seen a program actually do this, so just hide it and continue */
@@ -1247,8 +1252,8 @@
     TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, BackBuffer, Type, *ppBackBuffer);
 
     if (BackBuffer > This->PresentParms.BackBufferCount - 1) {
-      FIXME("Only one backBuffer currently supported\n");
-      return D3DERR_INVALIDCALL;
+        FIXME("Only one backBuffer currently supported\n");
+        return D3DERR_INVALIDCALL;
     }
 
     /* Note inc ref on returned surface */
@@ -1282,7 +1287,8 @@
     TRACE("(%p) : W(%d) H(%d), Lvl(%d) Usage(%ld), Fmt(%d), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool);
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl));
     object->lpVtbl = &Direct3DTexture8_Vtbl;
-    object->Device = This; /* FIXME: AddRef(This) */
+    object->Device = This;
+    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
     object->ResourceType = D3DRTYPE_TEXTURE;
     object->ref = 1;
     object->width = Width;
@@ -1290,8 +1296,7 @@
     object->levels = Levels;
     object->usage = Usage;
     object->format = Format;
-    object->device = This;
-    /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
+
 
     /* Calculate levels for mip mapping */
     if (Levels == 0) {
@@ -1299,7 +1304,7 @@
         tmpW = Width;
         tmpH = Height;
         while (tmpW > 1 && tmpH > 1) {
-            tmpW = max(1,tmpW / 2);
+            tmpW = max(1, tmpW / 2);
             tmpH = max(1, tmpH / 2);
             object->levels++;
         }
@@ -1309,7 +1314,7 @@
     /* Generate all the surfaces */
     tmpW = Width;
     tmpH = Height;
-    for (i=0; i<object->levels; i++) 
+    for (i = 0; i < object->levels; i++) 
     {
         IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
         object->surfaces[i]->Container = (IUnknown*) object;
@@ -1322,7 +1327,7 @@
         tmpH = max(1, tmpH / 2);
     }
 
-    *ppTexture = (LPDIRECT3DTEXTURE8)object;
+    *ppTexture = (LPDIRECT3DTEXTURE8) object;
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture8** ppVolumeTexture) {
@@ -1371,7 +1376,7 @@
     tmpH = Height;
     tmpD = Depth;
 
-    for (i = 0; i< object->levels; i++) 
+    for (i = 0; i < object->levels; i++) 
     {
         IDirect3DVolume8Impl *volume;
 
@@ -1387,13 +1392,13 @@
 	/*IUnknown_AddRef(volume->Container);*/	
         volume->ref = 1;
 
-        volume->myDesc.Width = Width;
-        volume->myDesc.Height= Height;
-        volume->myDesc.Depth = Depth;
-        volume->myDesc.Format= Format;
-        volume->myDesc.Type  = D3DRTYPE_VOLUME;
-        volume->myDesc.Pool  = Pool;
-        volume->myDesc.Usage = Usage;
+        volume->myDesc.Width  = Width;
+        volume->myDesc.Height = Height;
+        volume->myDesc.Depth  = Depth;
+        volume->myDesc.Format = Format;
+        volume->myDesc.Type   = D3DRTYPE_VOLUME;
+        volume->myDesc.Pool   = Pool;
+        volume->myDesc.Usage  = Usage;
         volume->bytesPerPixel   = bytesPerPixel(Format);
         volume->myDesc.Size     = (Width * volume->bytesPerPixel) * Height * Depth;
         volume->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, volume->myDesc.Size);
@@ -1401,15 +1406,15 @@
         TRACE("(%p) : Volume at w(%d) h(%d) d(%d) fmt(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Depth, Format, 
                   volume, volume->allocatedMemory, volume->myDesc.Size);
 
-        tmpW = max(1,tmpW / 2);
+        tmpW = max(1, tmpW / 2);
         tmpH = max(1, tmpH / 2);
         tmpD = max(1, tmpD / 2);
     }
 
-    *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8)object;
+    *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object;
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture8** ppCubeTexture) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture) {
 
     IDirect3DCubeTexture8Impl *object;
     ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1435,7 +1440,7 @@
         object->levels++;
         tmpW = EdgeLength;
         while (tmpW > 1) {
-            tmpW = max(1,tmpW / 2);
+            tmpW = max(1, tmpW / 2);
             object->levels++;
         }
         TRACE("Calculated levels = %d\n", object->levels);
@@ -1446,12 +1451,12 @@
     for (i = 0; i < object->levels; i++) 
     {
         /* Create the 6 faces */
-        for (j = 0;j < 6; j++) {
+        for (j = 0; j < 6; j++) {
            IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
            object->surfaces[j][i]->Container = (IUnknown*) object;
 	   /*IUnknown_AddRef(object->surfaces[j][i]->Container);*/
            object->surfaces[j][i]->myDesc.Usage = Usage;
-           object->surfaces[j][i]->myDesc.Pool = Pool ;
+           object->surfaces[j][i]->myDesc.Pool = Pool;
 
            TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[j][i], object->surfaces[j][i]->allocatedMemory);
            tmpW = max(1, tmpW / 2);
@@ -1518,8 +1523,12 @@
     IDirect3DSurface8Impl *object;
 
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-
+    
     object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+    if (NULL == object) {
+      *ppSurface = NULL;
+      return D3DERR_OUTOFVIDEOMEMORY;
+    }
     *ppSurface = (LPDIRECT3DSURFACE8) object;
     object->lpVtbl = &Direct3DSurface8_Vtbl;
     object->Device = This;
@@ -1534,7 +1543,7 @@
     object->myDesc.Format = Format;
     object->myDesc.Type = D3DRTYPE_SURFACE;
     object->myDesc.Usage = D3DUSAGE_RENDERTARGET;
-    object->myDesc.Pool = D3DPOOL_MANAGED;
+    object->myDesc.Pool = D3DPOOL_DEFAULT;
     object->myDesc.MultiSampleType = MultiSample;
     object->bytesPerPixel = bytesPerPixel(Format);
     object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
@@ -1551,6 +1560,10 @@
     ICOM_THIS(IDirect3DDevice8Impl,iface);
 
     object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+    if (NULL == object) {
+      *ppSurface = NULL;
+      return D3DERR_OUTOFVIDEOMEMORY;
+    }
     *ppSurface = (LPDIRECT3DSURFACE8) object;
     object->lpVtbl = &Direct3DSurface8_Vtbl;
     object->Device = This;
@@ -1565,7 +1578,7 @@
     object->myDesc.Format = Format;
     object->myDesc.Type = D3DRTYPE_SURFACE;
     object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL;
-    object->myDesc.Pool = D3DPOOL_MANAGED;
+    object->myDesc.Pool = D3DPOOL_DEFAULT;
     object->myDesc.MultiSampleType = MultiSample;
     object->bytesPerPixel = bytesPerPixel(Format);
     object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
@@ -1727,9 +1740,10 @@
 
     return D3D_OK;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture,IDirect3DBaseTexture8* pDestinationTexture) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);
+    return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
     HRESULT hr;
@@ -1775,9 +1789,15 @@
     hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface);
     return hr;
 }
-HRESULT  WINAPI  IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget,IDirect3DSurface8* pNewZStencil) {
+HRESULT  WINAPI  IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget, IDirect3DSurface8* pNewZStencil) {
     ICOM_THIS(IDirect3DDevice8Impl,iface);
-    FIXME("(%p) : invalid stub expect crash\n", This);
+
+    if ((IDirect3DSurface8Impl*) pRenderTarget == This->frontBuffer && (IDirect3DSurface8Impl*) pNewZStencil == This->depthStencilBuffer) {
+      TRACE("Trying to do a NOP SetRenderTarget operation\n");
+      return D3D_OK;
+    }
+    
+    FIXME("(%p) : invalid stub expect crash newRender@%p newZStencil@%p\n", This, pRenderTarget, pNewZStencil);
 
     return D3D_OK;
 }
@@ -1797,8 +1817,8 @@
     TRACE("(%p)->(%p)\n", This, ppZStencilSurface);
     
     /* Note inc ref on returned surface */
-    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8)This->depthStencilBuffer);
-    *ppZStencilSurface = (LPDIRECT3DSURFACE8)This->depthStencilBuffer;
+    *ppZStencilSurface = (LPDIRECT3DSURFACE8) This->depthStencilBuffer;
+    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppZStencilSurface);
 
     return D3D_OK;
 }
@@ -1831,6 +1851,11 @@
       render target does not have an attached depth buffer. Similarly, if you specify the D3DCLEAR_STENCIL flag
       when the depth-buffer format does not contain stencil buffer information, this method fails. */
     GLbitfield glMask = 0;
+    GLboolean old_ztest;
+    GLfloat old_z_clear_value;
+    GLint   old_stencil_clear_value;
+    GLfloat old_color_clear_value[4];
+
     int i;
     CONST D3DRECT   *curRect;
 
@@ -1858,13 +1883,17 @@
         }
 
         /* Clear the whole screen */
-        if (Flags & D3DCLEAR_STENCIL) {
+        if (Flags & D3DCLEAR_STENCIL) {	
+	    glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
             glClearStencil(Stencil);
             checkGLcall("glClearStencil");
             glMask = glMask | GL_STENCIL_BUFFER_BIT;
         }
 
         if (Flags & D3DCLEAR_ZBUFFER) {
+	    glGetBooleanv(GL_DEPTH_WRITEMASK, &old_ztest);
+	    glDepthMask(GL_TRUE); 
+	    glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
             glClearDepth(Z);
             checkGLcall("glClearDepth");
             glMask = glMask | GL_DEPTH_BUFFER_BIT;
@@ -1872,8 +1901,11 @@
 
         if (Flags & D3DCLEAR_TARGET) {
             TRACE("Clearing screen with glClear to color %lx\n", Color);
-            glClearColor(((Color >> 16) & 0xFF) / 255.0, ((Color >>  8) & 0xFF) / 255.0,
-                         ((Color >>  0) & 0xFF) / 255.0, ((Color >> 24) & 0xFF) / 255.0);
+	    glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
+            glClearColor(((Color >> 16) & 0xFF) / 255.0, 
+			 ((Color >>  8) & 0xFF) / 255.0,
+                         ((Color >>  0) & 0xFF) / 255.0, 
+			 ((Color >> 24) & 0xFF) / 255.0);
             checkGLcall("glClearColor");
             glMask = glMask | GL_COLOR_BUFFER_BIT;
         }
@@ -1881,6 +1913,20 @@
         glClear(glMask);
         checkGLcall("glClear");
 
+	if (Flags & D3DCLEAR_STENCIL) {
+	  glClearStencil(old_stencil_clear_value);
+	}    
+	if (Flags & D3DCLEAR_ZBUFFER) {
+	  glDepthMask(old_ztest);
+	  glClearDepth(old_z_clear_value);
+	}
+	if (Flags & D3DCLEAR_TARGET) {
+	  glClearColor(old_color_clear_value[0], 
+		       old_color_clear_value[1],
+		       old_color_clear_value[2], 
+		       old_color_clear_value[3]);
+	}
+
         if (curRect) curRect = curRect + sizeof(D3DRECT);
     }
 
@@ -3615,14 +3661,14 @@
 
                 case D3DTOP_SELECTARG1                :
 		    {
+		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
+		        DWORD dwValue = 0;
+			GLenum source;
+			GLenum operand;			
                         FIXME("see if D3DTOP_SELECTARG1 behavior is correct now!\n");
                         glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
 			checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
 #if 0 /* don't seem to do anything */			
-		        BOOL  isAlphaOp = (Type == D3DTSS_ALPHAOP);
-		        DWORD dwValue = 0;
-			GLenum source;
-			GLenum operand;
 			dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
 			GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
 			if (isAlphaOp) {
Index: surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.7
diff -u -r1.7 surface.c
--- surface.c	11 May 2003 03:35:27 -0000	1.7
+++ surface.c	11 May 2003 10:44:26 -0000
@@ -31,8 +31,8 @@
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
 /* trace: */
-#if 1
-# define VTRACE(A) FIXME A
+#if 0
+# define VTRACE(A) TRACE A
 #else 
 # define VTRACE(A) 
 #endif
@@ -85,15 +85,18 @@
 }
 HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
     ICOM_THIS(IDirect3DSurface8Impl,iface);
@@ -118,7 +121,9 @@
     return D3D_OK;
 }
 HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DSurface8Impl,iface);
+  
     /* fixme: should we really lock as such? */
 
     if (FALSE == This->lockable) {
@@ -126,7 +131,7 @@
       return D3DERR_INVALIDCALL;
     }
 
-    TRACE("(%p) : rect=%p, output prect=%p, allMem=%p\n", This, pRect, pLockedRect, This->allocatedMemory);
+    TRACE("(%p) : rect@%p flags(%08x), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory);
 
     pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width;  /* Bytes / row */    
     
@@ -146,7 +151,6 @@
     }
 
 
-
     if (0 == This->myDesc.Usage) { /* classic surface */
 
       /* Nothing to do ;) */
@@ -227,6 +231,37 @@
       FIXME("unsupported locking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
     }
 
+    if (Flags & (D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY)) {
+      /* Dont dirtify */
+    } else {
+      /**
+       * Dirtify on lock
+       * as seen in msdn docs
+       */
+      This->Dirty = TRUE;
+      /** Dirtify Container if needed */
+      if (NULL != This->Container) {
+	IDirect3DBaseTexture8* cont = NULL;
+	hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
+	
+	if (SUCCEEDED(hr) && NULL != cont) {
+	  /* Now setup the texture appropraitly */
+	  D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType(cont);
+	  if (containerType == D3DRTYPE_TEXTURE) {
+            IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont;
+            pTexture->Dirty = TRUE;
+	  } else if (containerType == D3DRTYPE_CUBETEXTURE) {
+            IDirect3DCubeTexture8Impl* pTexture = (IDirect3DCubeTexture8Impl*) cont;
+            pTexture->Dirty = TRUE;
+	  } else {
+            FIXME("Set dirty on container type %d\n", containerType);
+	  }
+	  IDirect3DBaseTexture8_Release(cont);
+	  cont = NULL;
+	}
+      }
+    }
+
     TRACE("returning pBits=%p, pitch=%d\n", pLockedRect->pBits, pLockedRect->Pitch);
 
     This->locked = TRUE;
@@ -241,10 +276,17 @@
       return D3DERR_INVALIDCALL;
     }
 
-    TRACE("(%p) : stub\n", This);
+    TRACE("(%p) : see if behavior is correct\n", This);
+
+    if (FALSE == This->Dirty) {
+      TRACE("(%p) : Not Dirtified so nothing to do, return now\n", This);
+      goto unlock_end;
+    }
 
     if (0 == This->myDesc.Usage) { /* classic surface */
+#if 0
       if (This->Container) {
+	HRESULT hr;
 	IDirect3DBaseTexture8* cont = NULL;
 	hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
 	
@@ -252,18 +294,19 @@
 	  /* Now setup the texture appropraitly */
 	  int containerType = IDirect3DBaseTexture8Impl_GetType(cont);
 	  if (containerType == D3DRTYPE_TEXTURE) {
-            IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont;
-            pTexture->Dirty = TRUE;
+	    IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont;
+	    pTexture->Dirty = TRUE;
 	  } else if (containerType == D3DRTYPE_CUBETEXTURE) {
-            IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont;
-            pTexture->Dirty = TRUE;
+	    IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont;
+	    pTexture->Dirty = TRUE;
 	  } else {
-            FIXME("Set dirty on container type %d\n", containerType);
+	    FIXME("Set dirty on container type %d\n", containerType);
 	  }
 	  IDirect3DBaseTexture8_Release(cont);
 	  cont = NULL;
 	}
       }
+#endif
     } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
 
       if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
@@ -336,6 +379,8 @@
     } else {
       FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
     }
+
+unlock_end:
     This->locked = FALSE;
     return D3D_OK;
 }
Index: texture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/texture.c,v
retrieving revision 1.6
diff -u -r1.6 texture.c
--- texture.c	8 May 2003 03:49:04 -0000	1.6
+++ texture.c	11 May 2003 10:44:27 -0000
@@ -192,30 +192,36 @@
 HRESULT  WINAPI        IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level,IDirect3DSurface8** ppSurfaceLevel) {
     ICOM_THIS(IDirect3DTexture8Impl,iface);
     *ppSurfaceLevel = (LPDIRECT3DSURFACE8)This->surfaces[Level];
-    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8)This->surfaces[Level]);
+    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) This->surfaces[Level]);
     TRACE("(%p) : returning %p for level %d\n", This, *ppSurfaceLevel, Level);
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DTexture8Impl,iface);
     TRACE("(%p) Level (%d)\n", This, Level);
     if (Level < This->levels) {
-        return IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)This->surfaces[Level], pLockedRect, pRect, Flags);
+      /**
+       * Not dirtified while Surfaces don't notify dirtification
+       * This->Dirty = TRUE;
+       */
+      hr = IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->surfaces[Level], pLockedRect, pRect, Flags);
+      TRACE("(%p) Level (%d) success(%lu)\n", This, Level, hr);
     } else {
         FIXME("Levels seems too high?!!\n");
     }
-    return D3D_OK;
+    return hr;
 }
 HRESULT  WINAPI        IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface, UINT Level) {
     ICOM_THIS(IDirect3DTexture8Impl,iface);
-    This->Dirty = TRUE;
     TRACE("(%p) : stub\n", This);
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect) {
     ICOM_THIS(IDirect3DTexture8Impl,iface);
     This->Dirty = TRUE;
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 
 
Index: volume.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volume.c,v
retrieving revision 1.5
diff -u -r1.5 volume.c
--- volume.c	11 May 2003 03:35:27 -0000	1.5
+++ volume.c	11 May 2003 10:44:27 -0000
@@ -77,15 +77,18 @@
 }
 HRESULT WINAPI IDirect3DVolume8Impl_SetPrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DVolume8Impl_GetPrivateData(LPDIRECT3DVOLUME8 iface, REFGUID  refguid, void* pData, DWORD* pSizeOfData) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 HRESULT WINAPI IDirect3DVolume8Impl_FreePrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 
 HRESULT WINAPI IDirect3DVolume8Impl_GetContainer(LPDIRECT3DVOLUME8 iface, REFIID riid, void** ppContainer) {
@@ -101,7 +104,7 @@
     memcpy(pDesc, &This->myDesc, sizeof(D3DVOLUME_DESC));
     return D3D_OK;
 }
-HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox, DWORD Flags) {
+HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
     FIXME("(%p) : pBox=%p stub\n", This, pBox);    
 
@@ -120,23 +123,45 @@
             (pLockedVolume->RowPitch * pBox->Top) + 
             (pBox->Left * This->bytesPerPixel);
     }
-    TRACE("returning pBits=%p, rpitch=%d, spitch=%d\n", pLockedVolume->pBits, pLockedVolume->RowPitch, pLockedVolume->SlicePitch);
+    
+    if (Flags & (D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY)) {
+      /* Dont dirtify */
+    } else {
+      /**
+       * Dirtify on lock
+       * as seen in msdn docs
+       */
+      /**  Dirtify Container if needed */
+      if (NULL != This->Container) {
+        IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container;	
+        D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
+        if (containerType == D3DRTYPE_VOLUMETEXTURE) {
+	  IDirect3DBaseTexture8Impl* pTexture = (IDirect3DBaseTexture8Impl*) cont;
+	  pTexture->Dirty = TRUE;
+        } else {
+	  FIXME("Set dirty on container type %d\n", containerType);
+        }
+      }
+    }
+
+    TRACE("returning memory@%p rpitch(%d) spitch(%d)\n", pLockedVolume->pBits, pLockedVolume->RowPitch, pLockedVolume->SlicePitch);
     return D3D_OK;
 }
 HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) {
     ICOM_THIS(IDirect3DVolume8Impl,iface);
     TRACE("(%p) : stub\n", This);
+#if 0
     if (This->Container) {
         IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container;
-
-        int containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
+        D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
         if (containerType == D3DRTYPE_VOLUMETEXTURE) {
-            IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont;
+            IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont;
             pTexture->Dirty = TRUE;
         } else {
             FIXME("Set dirty on container type %d\n", containerType);
         }
     }
+#endif
     return D3D_OK;
 }
 
Index: volumetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v
retrieving revision 1.6
diff -u -r1.6 volumetexture.c
--- volumetexture.c	11 May 2003 03:35:27 -0000	1.6
+++ volumetexture.c	11 May 2003 10:44:28 -0000
@@ -141,33 +141,50 @@
     }
     return D3D_OK;
 }
-HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,IDirect3DVolume8** ppVolumeLevel) {
+HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, IDirect3DVolume8** ppVolumeLevel) {
     ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
-    IDirect3DVolume8Impl_AddRef((LPDIRECT3DVOLUME8)This->volumes[Level]);
-    *ppVolumeLevel = (LPDIRECT3DVOLUME8)This->volumes[Level];
-    TRACE("(%p) : returning %p for level %d\n", This, *ppVolumeLevel, Level);
+    if (Level < This->levels) {
+      *ppVolumeLevel = (LPDIRECT3DVOLUME8)This->volumes[Level];
+      IDirect3DVolume8Impl_AddRef((LPDIRECT3DVOLUME8) *ppVolumeLevel);
+      TRACE("(%p) -> level(%d) returning volume@%p\n", This, Level, *ppVolumeLevel);
+    } else {
+      FIXME("(%p) Level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+      return D3DERR_INVALIDCALL;
+    }
     return D3D_OK;
+
 }
-HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) {
+HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) {
+    HRESULT hr;
     ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
-    TRACE("(%p) Level (%d)\n", This, Level);
     if (Level < This->levels) {
-        return IDirect3DVolume8Impl_LockBox((LPDIRECT3DVOLUME8)This->volumes[Level], pLockedVolume, pBox, Flags);
+      /**
+       * Not dirtified while Surfaces don't notify dirtification
+       * This->Dirty = TRUE;
+       */
+      hr = IDirect3DVolume8Impl_LockBox((LPDIRECT3DVOLUME8) This->volumes[Level], pLockedVolume, pBox, Flags);
+      TRACE("(%p) Level (%d) success(%lu)\n", This, Level, hr);
     } else {
-        FIXME("Volume Levels seems too high?!!\n");
+      FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+      return D3DERR_INVALIDCALL;
     }
-    return D3D_OK;
+    return hr;
 }
 HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level) {
     ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
-    This->Dirty = TRUE;
-    TRACE("(%p) : stub\n", This);
+    if (Level < This->levels) {
+      TRACE("(%p) level(%d) stub\n", This, Level);
+    } else {
+      FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels);
+      return D3DERR_INVALIDCALL;
+    }
     return D3D_OK;
 }
 HRESULT  WINAPI        IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX* pDirtyBox) {
     ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
     This->Dirty = TRUE;
-    FIXME("(%p) : stub\n", This);    return D3D_OK;
+    FIXME("(%p) : stub\n", This);    
+    return D3D_OK;
 }
 
 


More information about the wine-patches mailing list