-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, Now cleaning the texture management code and add some usefull attributes for optimisations. Changelog: - cleaning of volume.c/volumtexture.c as done previously for surface.c/*texture.c (with add of lockable, locked and Dirty flags) - add of dirtyRect/dirtyBox for better dirtification management (not used yet, but huge optimisation can be possible now) - fix some debug traces (well it's better to use debug_d3dpool) - fix some stupid regression on point parameters (forgot to check extension on fillcaps) PS: it's possible to have multiple locks on surface/volumes ? Regards, Raphael -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2 (GNU/Linux) iD8DBQE+2/LBp7NA3AmQTU4RAuUDAJ4sJjRrFtLDr2vGaEToFu9JX4NZ6ACeIzNF idvJ5gl1FwbipkCyc8/d4gg= =WBzf -----END PGP SIGNATURE-----
diff -u /cvs-src/wine-pending/d3d8_49/basetexture.c dlls/d3d8/basetexture.c --- /cvs-src/wine-pending/d3d8_49/basetexture.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/basetexture.c 2003-06-03 01:22:37.000000000 +0200 @@ -123,21 +123,6 @@ return 0; } -BOOL WINAPI IDirect3DBaseTexture8Impl_IsDirty(LPDIRECT3DBASETEXTURE8 iface) { - ICOM_THIS(IDirect3DBaseTexture8Impl,iface); - return This->Dirty; -} - -BOOL WINAPI IDirect3DBaseTexture8Impl_SetDirty(LPDIRECT3DBASETEXTURE8 iface, BOOL dirty) { - BOOL old; - ICOM_THIS(IDirect3DBaseTexture8Impl,iface); - - old = This->Dirty; - This->Dirty = dirty; - return old; -} - - ICOM_VTABLE(IDirect3DBaseTexture8) Direct3DBaseTexture8_Vtbl = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE @@ -156,3 +141,17 @@ IDirect3DBaseTexture8Impl_GetLOD, IDirect3DBaseTexture8Impl_GetLevelCount, }; + +BOOL WINAPI IDirect3DBaseTexture8Impl_IsDirty(LPDIRECT3DBASETEXTURE8 iface) { + ICOM_THIS(IDirect3DBaseTexture8Impl,iface); + return This->Dirty; +} + +BOOL WINAPI IDirect3DBaseTexture8Impl_SetDirty(LPDIRECT3DBASETEXTURE8 iface, BOOL dirty) { + BOOL old; + ICOM_THIS(IDirect3DBaseTexture8Impl,iface); + + old = This->Dirty; + This->Dirty = dirty; + return old; +} diff -u /cvs-src/wine-pending/d3d8_49/cubetexture.c dlls/d3d8/cubetexture.c --- /cvs-src/wine-pending/d3d8_49/cubetexture.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/cubetexture.c 2003-06-03 01:55:12.000000000 +0200 @@ -175,28 +175,6 @@ for (j = 0; j < 6; j++) { IDirect3DSurface8Impl_LoadTexture((LPDIRECT3DSURFACE8) This->surfaces[j][i], cube_targets[j], i); #if 0 - TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, glFmt=%x, glType=%x, Mem=%p\n", - cube_targets[j], - i, - fmt2glintFmt(This->format), - This->surfaces[j][i]->myDesc.Width, - This->surfaces[j][i]->myDesc.Height, - 0, - fmt2glFmt(This->format), - fmt2glType(This->format), - This->surfaces[j][i]->allocatedMemory); - glTexImage2D(cube_targets[j], - i, - fmt2glintFmt(This->format), - This->surfaces[j][i]->myDesc.Width, - This->surfaces[j][i]->myDesc.Height, - 0, - fmt2glFmt(This->format), - fmt2glType(This->format), - This->surfaces[j][i]->allocatedMemory); - checkGLcall("glTexImage2D"); -#endif -#if 0 static int gen = 0; char buffer[4096]; snprintf(buffer, sizeof(buffer), "/tmp/cube%d_face%d_level%d_%d.png", This->surfaces[0][0]->textureName, j, i, ++gen); @@ -266,7 +244,7 @@ * Not dirtified while Surfaces don't notify dirtification * This->Dirty = TRUE; */ - hr = IDirect3DSurface8_LockRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level], pLockedRect, pRect, Flags); + hr = IDirect3DSurface8Impl_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); @@ -278,8 +256,8 @@ HRESULT hr; ICOM_THIS(IDirect3DCubeTexture8Impl,iface); 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); + hr = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level]); + TRACE("(%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; @@ -289,8 +267,8 @@ 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; + TRACE("(%p) : dirtyfication of faceType(%d) Level (0)\n", This, FaceType); + return IDirect3DSurface8Impl_AddDirtyRect((LPDIRECT3DSURFACE8) This->surfaces[FaceType][0], pDirtyRect); } Les sous-répertoires /cvs-src/wine-pending/d3d8_49/CVS et dlls/d3d8/CVS sont identiques. diff -u /cvs-src/wine-pending/d3d8_49/d3d8_private.h dlls/d3d8/d3d8_private.h --- /cvs-src/wine-pending/d3d8_49/d3d8_private.h 2003-06-03 02:44:22.000000000 +0200 +++ dlls/d3d8/d3d8_private.h 2003-06-03 01:31:50.000000000 +0200 @@ -495,6 +495,12 @@ BYTE *allocatedMemory; UINT textureName; UINT bytesPerPixel; + + BOOL lockable; + BOOL locked; + D3DBOX lockedBox; + D3DBOX dirtyBox; + BOOL Dirty; }; /* IUnknown: */ @@ -509,9 +515,12 @@ extern HRESULT WINAPI IDirect3DVolume8Impl_FreePrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid); extern HRESULT WINAPI IDirect3DVolume8Impl_GetContainer(LPDIRECT3DVOLUME8 iface, REFIID riid, void** ppContainer); extern HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DVOLUME_DESC* pDesc); -extern HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox, DWORD Flags); +extern HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags); extern HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface); +/* internal Interfaces */ +extern HRESULT WINAPI IDirect3DVolume8Impl_CleanDirtyBox(LPDIRECT3DVOLUME8 iface); +extern HRESULT WINAPI IDirect3DVolume8Impl_AddDirtyBox(LPDIRECT3DVOLUME8 iface, CONST D3DBOX* pDirtyBox); /* ------------------- */ /* IDirect3DSwapChain8 */ @@ -540,7 +549,6 @@ /* OpenGL/GLX related */ GLXContext swap_ctx; Drawable swap_drawable; - }; /* IUnknown: */ @@ -584,8 +592,8 @@ BOOL lockable; BOOL locked; RECT lockedRect; + RECT dirtyRect; BOOL Dirty; - }; /* IUnknown: */ @@ -606,7 +614,8 @@ /* internal Interfaces */ extern HRESULT WINAPI IDirect3DSurface8Impl_LoadTexture(LPDIRECT3DSURFACE8 iface, GLenum gl_target, GLenum gl_level); extern HRESULT WINAPI IDirect3DSurface8Impl_SaveSnapshot(LPDIRECT3DSURFACE8 iface, const char* filename); - +extern HRESULT WINAPI IDirect3DSurface8Impl_CleanDirtyRect(LPDIRECT3DSURFACE8 iface); +extern HRESULT WINAPI IDirect3DSurface8Impl_AddDirtyRect(LPDIRECT3DSURFACE8 iface, CONST RECT* pDirtyRect); /* ------------------ */ /* IDirect3DResource8 */ diff -u /cvs-src/wine-pending/d3d8_49/device.c dlls/d3d8/device.c --- /cvs-src/wine-pending/d3d8_49/device.c 2003-06-03 02:44:22.000000000 +0200 +++ dlls/d3d8/device.c 2003-06-03 02:13:03.000000000 +0200 @@ -1411,7 +1411,7 @@ ICOM_THIS(IDirect3DDevice8Impl,iface); /* Allocate the storage for it */ - TRACE("(%p) : W(%d) H(%d) D(%d), Lvl(%d) Usage(%ld), Fmt(%u,%s), Pool(%d)\n", This, Width, Height, Depth, Levels, Usage, Format, debug_d3dformat(Format), Pool); + TRACE("(%p) : W(%d) H(%d) D(%d), Lvl(%d) Usage(%ld), Fmt(%u,%s), Pool(%s)\n", This, Width, Height, Depth, Levels, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture8Impl)); object->lpVtbl = &Direct3DVolumeTexture8_Vtbl; object->ResourceType = D3DRTYPE_VOLUMETEXTURE; @@ -1470,6 +1470,12 @@ volume->myDesc.Size = (Width * volume->bytesPerPixel) * Height * Depth; volume->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, volume->myDesc.Size); + volume->lockable = TRUE; + volume->locked = FALSE; + memset(&volume->lockedBox, 0, sizeof(D3DBOX)); + volume->Dirty = FALSE; + IDirect3DVolume8Impl_CleanDirtyBox((LPDIRECT3DVOLUME8) volume); + TRACE("(%p) : Volume at w(%d) h(%d) d(%d) fmt(%u,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Depth, Format, debug_d3dformat(Format), volume, volume->allocatedMemory, volume->myDesc.Size); @@ -1491,7 +1497,7 @@ UINT tmpW; /* Allocate the storage for it */ - TRACE("(%p) : Len(%d), Lvl(%d) Usage(%ld), Fmt(%u,%s), Pool(%d)\n", This, EdgeLength, Levels, Usage, Format, debug_d3dformat(Format), Pool); + TRACE("(%p) : Len(%d), Lvl(%d) Usage(%ld), Fmt(%u,%s), Pool(%s)\n", This, EdgeLength, Levels, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DCubeTexture8Impl)); object->lpVtbl = &Direct3DCubeTexture8_Vtbl; object->ref = 1; @@ -1537,7 +1543,7 @@ } TRACE("(%p) : Iface@%p\n", This, object); - *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8)object; + *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8) object; return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) { @@ -1559,7 +1565,7 @@ TRACE("(%p) : Size=%d, Usage=%ld, FVF=%lx, Pool=%d - Memory@%p, Iface@%p\n", This, Size, Usage, FVF, Pool, object->allocatedMemory, object); - *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER8)object; + *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER8) object; return D3D_OK; } @@ -1586,7 +1592,7 @@ TRACE("(%p) : Iface@%p allocatedMem @ %p\n", This, object, object->allocatedMemory); - *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8)object; + *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8) object; return D3D_OK; } @@ -1618,7 +1624,9 @@ object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = Lockable; object->locked = FALSE; - + memset(&object->lockedRect, 0, sizeof(RECT)); + IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); + TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), Lockable, *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; } @@ -1651,7 +1659,9 @@ object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = (D3DFMT_D16_LOCKABLE == Format) ? TRUE : FALSE; object->locked = FALSE; - + memset(&object->lockedRect, 0, sizeof(RECT)); + IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); + TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; } @@ -1679,6 +1689,8 @@ object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = TRUE; object->locked = FALSE; + memset(&object->lockedRect, 0, sizeof(RECT)); + IDirect3DSurface8Impl_CleanDirtyRect((LPDIRECT3DSURFACE8) object); TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; diff -u /cvs-src/wine-pending/d3d8_49/directx.c dlls/d3d8/directx.c --- /cvs-src/wine-pending/d3d8_49/directx.c 2003-06-03 02:44:22.000000000 +0200 +++ dlls/d3d8/directx.c 2003-06-03 02:05:15.000000000 +0200 @@ -712,10 +712,12 @@ } else if (strcmp(ThisExtn, "GL_EXT_fog_coord") == 0) { FIXME(" FOUND: EXT Fog coord support\n"); This->gl_info.supported[EXT_FOG_COORD] = TRUE; - } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) { - /* handle paletted texture extensions */ + } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) { /* handle paletted texture extensions */ FIXME(" FOUND: EXT Paletted texture support\n"); This->gl_info.supported[EXT_PALETTED_TEXTURE] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_point_parameters") == 0) { + FIXME(" FOUND: EXT Point parameters support\n"); + This->gl_info.supported[EXT_POINT_PARAMETERS] = TRUE; } else if (strcmp(ThisExtn, "GL_EXT_secondary_color") == 0) { FIXME(" FOUND: EXT Secondary coord support\n"); This->gl_info.supported[EXT_SECONDARY_COLOR] = TRUE; diff -u /cvs-src/wine-pending/d3d8_49/surface.c dlls/d3d8/surface.c --- /cvs-src/wine-pending/d3d8_49/surface.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/surface.c 2003-06-03 01:34:37.000000000 +0200 @@ -235,7 +235,8 @@ * Dirtify on lock * as seen in msdn docs */ - This->Dirty = TRUE; + IDirect3DSurface8Impl_AddDirtyRect(iface, &This->lockedRect); + /** Dirtify Container if needed */ if (NULL != This->Container) { IDirect3DBaseTexture8* cont = NULL; @@ -348,7 +349,8 @@ vcheckGLcall("glRasterPos3iv"); LEAVE_GL(); - This->Dirty = FALSE; + /** restore clean dirty state */ + IDirect3DSurface8Impl_CleanDirtyRect(iface); } else { FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage); @@ -368,6 +370,7 @@ unlock_end: This->locked = FALSE; + memset(&This->lockedRect, 0, sizeof(RECT)); return D3D_OK; } @@ -583,3 +586,27 @@ fclose(f); return D3D_OK; } + +HRESULT WINAPI IDirect3DSurface8Impl_CleanDirtyRect(LPDIRECT3DSURFACE8 iface) { + ICOM_THIS(IDirect3DSurface8Impl,iface); + This->Dirty = FALSE; + This->dirtyRect.left = This->myDesc.Width; + This->dirtyRect.top = This->myDesc.Height; + This->dirtyRect.right = 0; + This->dirtyRect.bottom = 0; + return D3D_OK; +} + +/** + * Raphael: + * very stupid way to handle multiple dirty rects but it works :) + */ +extern HRESULT WINAPI IDirect3DSurface8Impl_AddDirtyRect(LPDIRECT3DSURFACE8 iface, CONST RECT* pDirtyRect) { + ICOM_THIS(IDirect3DSurface8Impl,iface); + This->Dirty = TRUE; + This->dirtyRect.left = min(This->dirtyRect.left, pDirtyRect->left); + This->dirtyRect.top = min(This->dirtyRect.top, pDirtyRect->top); + This->dirtyRect.right = max(This->dirtyRect.right, pDirtyRect->right); + This->dirtyRect.bottom = max(This->dirtyRect.bottom, pDirtyRect->bottom); + return D3D_OK; +} diff -u /cvs-src/wine-pending/d3d8_49/texture.c dlls/d3d8/texture.c --- /cvs-src/wine-pending/d3d8_49/texture.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/texture.c 2003-06-03 01:56:20.000000000 +0200 @@ -135,28 +135,6 @@ } IDirect3DSurface8Impl_LoadTexture((LPDIRECT3DSURFACE8) This->surfaces[i], GL_TEXTURE_2D, i); -#if 0 - TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n", - GL_TEXTURE_2D, - i, - D3DFmt2GLIntFmt(This->format), - This->surfaces[i]->myDesc.Width, - This->surfaces[i]->myDesc.Height, - 0, - D3DFmt2GLFmt(This->format), - D3DFmt2GLType(This->format), - This->surfaces[i]->allocatedMemory); - glTexImage2D(GL_TEXTURE_2D, - i, - D3DFmt2GLIntFmt(This->format), - This->surfaces[i]->myDesc.Width, - This->surfaces[i]->myDesc.Height, - 0, - D3DFmt2GLFmt(This->format), - D3DFmt2GLType(This->format), - This->surfaces[i]->allocatedMemory); - checkGLcall("glTexImage2D"); -#endif /* Removed glTexParameterf now TextureStageStates are initialized at startup */ This->Dirty = FALSE; } @@ -187,7 +165,7 @@ } /* IDirect3DTexture8 */ -HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DSURFACE_DESC* pDesc) { +HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 iface, UINT Level, D3DSURFACE_DESC* pDesc) { ICOM_THIS(IDirect3DTexture8Impl,iface); if (Level < This->levels) { @@ -199,7 +177,7 @@ } return D3D_OK; } -HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level,IDirect3DSurface8** ppSurfaceLevel) { +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]); @@ -239,8 +217,8 @@ HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect) { ICOM_THIS(IDirect3DTexture8Impl,iface); This->Dirty = TRUE; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) : dirtyfication of surface Level (0)\n", This); + return IDirect3DSurface8Impl_AddDirtyRect((LPDIRECT3DSURFACE8) This->surfaces[0], pDirtyRect); } diff -u /cvs-src/wine-pending/d3d8_49/volume.c dlls/d3d8/volume.c --- /cvs-src/wine-pending/d3d8_49/volume.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/volume.c 2003-06-03 01:47:51.000000000 +0200 @@ -116,12 +116,24 @@ if (!pBox) { TRACE("No box supplied - all is ok\n"); pLockedVolume->pBits = This->allocatedMemory; + This->lockedBox.Left = 0; + This->lockedBox.Top = 0; + This->lockedBox.Front = 0; + This->lockedBox.Right = This->myDesc.Width; + This->lockedBox.Bottom = This->myDesc.Height; + This->lockedBox.Back = This->myDesc.Depth; } else { TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n", pBox, pBox->Left, pBox->Top, pBox->Right, pBox->Bottom, pBox->Front, pBox->Back); pLockedVolume->pBits = This->allocatedMemory + - (pLockedVolume->SlicePitch * pBox->Front) + /* FIXME: is front < back or vica versa? */ - (pLockedVolume->RowPitch * pBox->Top) + - (pBox->Left * This->bytesPerPixel); + (pLockedVolume->SlicePitch * pBox->Front) + /* FIXME: is front < back or vica versa? */ + (pLockedVolume->RowPitch * pBox->Top) + + (pBox->Left * This->bytesPerPixel); + This->lockedBox.Left = pBox->Left; + This->lockedBox.Top = pBox->Top; + This->lockedBox.Front = pBox->Front; + This->lockedBox.Right = pBox->Right; + This->lockedBox.Bottom = pBox->Bottom; + This->lockedBox.Back = pBox->Back; } if (Flags & (D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY)) { @@ -131,6 +143,8 @@ * Dirtify on lock * as seen in msdn docs */ + IDirect3DVolume8Impl_AddDirtyBox(iface, &This->lockedBox); + /** Dirtify Container if needed */ if (NULL != This->Container) { IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container; @@ -144,24 +158,19 @@ } } + This->locked = TRUE; 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; - D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont); - if (containerType == D3DRTYPE_VOLUMETEXTURE) { - IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont; - pTexture->Dirty = TRUE; - } else { - FIXME("Set dirty on container type %d\n", containerType); - } + if (FALSE == This->locked) { + ERR("trying to lock unlocked volume@%p\n", This); + return D3DERR_INVALIDCALL; } -#endif + TRACE("(%p) : unlocking volume\n", This); + This->locked = FALSE; + memset(&This->lockedBox, 0, sizeof(RECT)); return D3D_OK; } @@ -181,3 +190,31 @@ IDirect3DVolume8Impl_LockBox, IDirect3DVolume8Impl_UnlockBox }; + +HRESULT WINAPI IDirect3DVolume8Impl_CleanDirtyBox(LPDIRECT3DVOLUME8 iface) { + ICOM_THIS(IDirect3DVolume8Impl,iface); + This->Dirty = FALSE; + This->lockedBox.Left = This->myDesc.Width; + This->lockedBox.Top = This->myDesc.Height; + This->lockedBox.Front = This->myDesc.Depth; + This->lockedBox.Right = 0; + This->lockedBox.Bottom = 0; + This->lockedBox.Back = 0; + return D3D_OK; +} + +/** + * Raphael: + * very stupid way to handle multiple dirty box but it works :) + */ +HRESULT WINAPI IDirect3DVolume8Impl_AddDirtyBox(LPDIRECT3DVOLUME8 iface, CONST D3DBOX* pDirtyBox) { + ICOM_THIS(IDirect3DVolume8Impl,iface); + This->Dirty = TRUE; + This->lockedBox.Left = min(This->lockedBox.Left, pDirtyBox->Left); + This->lockedBox.Top = min(This->lockedBox.Top, pDirtyBox->Top); + This->lockedBox.Front = min(This->lockedBox.Front, pDirtyBox->Front); + This->lockedBox.Right = max(This->lockedBox.Right, pDirtyBox->Right); + This->lockedBox.Bottom = max(This->lockedBox.Bottom, pDirtyBox->Bottom); + This->lockedBox.Back = max(This->lockedBox.Back, pDirtyBox->Back); + return D3D_OK; +} diff -u /cvs-src/wine-pending/d3d8_49/volumetexture.c dlls/d3d8/volumetexture.c --- /cvs-src/wine-pending/d3d8_49/volumetexture.c 2003-06-03 02:40:48.000000000 +0200 +++ dlls/d3d8/volumetexture.c 2003-06-03 01:54:12.000000000 +0200 @@ -230,20 +230,22 @@ return hr; } HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level) { + HRESULT hr; ICOM_THIS(IDirect3DVolumeTexture8Impl,iface); if (Level < This->levels) { - TRACE("(%p) level(%d) stub\n", This, Level); + hr = IDirect3DVolume8Impl_UnlockBox((LPDIRECT3DVOLUME8) This->volumes[Level]); + TRACE("(%p) -> level(%d) success(%lu)\n", This, Level, hr); } else { FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels); return D3DERR_INVALIDCALL; } - return D3D_OK; + return hr; } HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX* pDirtyBox) { ICOM_THIS(IDirect3DVolumeTexture8Impl,iface); This->Dirty = TRUE; - FIXME("(%p) : stub\n", This); - return D3D_OK; + TRACE("(%p) : dirtyfication of volume Level (0)\n", This); + return IDirect3DVolume8Impl_AddDirtyBox((LPDIRECT3DVOLUME8) This->volumes[0], pDirtyBox); }