From eb36d31d6fed62a506e1648cb25b681cdacc2006 Mon Sep 17 00:00:00 2001 From: Raphael Junqueira Date: Mon, 12 May 2003 03:10:27 +0000 Subject: [PATCH] - surface pool init fixes - minor indentation and traces fixes - fix locking/unlocking/dirty behavior (dirtify on lock) + optimisations (only copy when dirty) - fix IDirect3DDevice8::Clear behavior (problem seen after a locking/unlocking code error) - begin to fix volume and cube textures management --- dlls/d3d8/cubetexture.c | 75 +++++++++++++++++------- dlls/d3d8/d3d8_private.h | 15 +++-- dlls/d3d8/device.c | 118 ++++++++++++++++++++++++++------------ dlls/d3d8/surface.c | 100 +++++++++++++++++++++++--------- dlls/d3d8/texture.c | 16 ++++-- dlls/d3d8/volume.c | 41 ++++++++++--- dlls/d3d8/volumetexture.c | 45 ++++++++++----- 7 files changed, 292 insertions(+), 118 deletions(-) diff --git a/dlls/d3d8/cubetexture.c b/dlls/d3d8/cubetexture.c index 1c3e2fa34dc..e77a3978eec 100644 --- a/dlls/d3d8/cubetexture.c +++ b/dlls/d3d8/cubetexture.c @@ -86,23 +86,28 @@ HRESULT WINAPI IDirect3DCubeTexture8Impl_GetDevice(LPDIRECT3DCUBETEXTURE } 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 @@ DWORD WINAPI IDirect3DCubeTexture8Impl_GetLevelCount(LPDIRECT3DCUBETEX } /* 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); + 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) { ICOM_THIS(IDirect3DCubeTexture8Impl,iface); This->Dirty = TRUE; - FIXME("(%p) : stub\n", This); return D3D_OK; -} -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; } diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index b64ef306a21..52215ef1403 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -455,10 +455,13 @@ struct IDirect3DSwapChain8Impl 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 @@ struct IDirect3DSurface8Impl BOOL lockable; BOOL locked; RECT lockedRect; + BOOL Dirty; }; /* IUnknown: */ @@ -669,6 +673,8 @@ struct IDirect3DBaseTexture8Impl D3DRESOURCETYPE ResourceType; /* IDirect3DBaseTexture8 fields */ + BOOL Dirty; + /* *BOOL isManaged; *DWORD lod; @@ -718,6 +724,7 @@ struct IDirect3DCubeTexture8Impl D3DRESOURCETYPE ResourceType; /* IDirect3DBaseTexture8 fields */ + BOOL Dirty; /* IDirect3DCubeTexture8 fields */ UINT edgeLength; @@ -726,7 +733,6 @@ struct IDirect3DCubeTexture8Impl D3DFORMAT format; IDirect3DSurface8Impl *surfaces[6][MAX_LEVELS]; - BOOL Dirty; }; /* IUnknown: */ @@ -779,6 +785,7 @@ struct IDirect3DTexture8Impl D3DRESOURCETYPE ResourceType; /* IDirect3DBaseTexture8 fields */ + BOOL Dirty; /* IDirect3DTexture8 fields */ UINT width; @@ -787,9 +794,7 @@ struct IDirect3DTexture8Impl DWORD usage; D3DFORMAT format; - IDirect3DDevice8Impl *device; IDirect3DSurface8Impl *surfaces[MAX_LEVELS]; - BOOL Dirty; }; /* IUnknown: */ @@ -842,6 +847,7 @@ struct IDirect3DVolumeTexture8Impl D3DRESOURCETYPE ResourceType; /* IDirect3DBaseTexture8 fields */ + BOOL Dirty; /* IDirect3DVolumeTexture8 fields */ UINT width; @@ -852,7 +858,6 @@ struct IDirect3DVolumeTexture8Impl D3DFORMAT format; IDirect3DVolume8Impl *volumes[MAX_LEVELS]; - BOOL Dirty; }; /* IUnknown: */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 3baae17a3d8..90a5f716562 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -432,10 +432,15 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, } } 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: %u\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 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UIN 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN /* Generate all the surfaces */ tmpW = Width; tmpH = Height; - for (i=0; ilevels; 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 ifac tmpH = Height; tmpD = Depth; - for (i = 0; i< object->levels; i++) + for (i = 0; i < object->levels; i++) { IDirect3DVolume8Impl *volume; @@ -1387,13 +1392,13 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 ifac /*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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 ifac 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, ID 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 i 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count } /* 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count 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 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count 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); } @@ -3622,7 +3668,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP); DWORD dwValue = 0; GLenum source; - GLenum operand; + GLenum operand; dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1]; GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand); if (isAlphaOp) { diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c index 842717d9308..0c80c9a46a9 100644 --- a/dlls/d3d8/surface.c +++ b/dlls/d3d8/surface.c @@ -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_GetDevice(LPDIRECT3DSURFACE8 iface, IDirect } 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 @@ HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3DSURFAC 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 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE return D3DERR_INVALIDCALL; } - TRACE("(%p) : rect=%p, output prect=%p, allMem=%p\n", This, pRect, pLockedRect, This->allocatedMemory); + TRACE("(%p) : rect@%p flags(%08lx), 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 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE } - if (0 == This->myDesc.Usage) { /* classic surface */ /* Nothing to do ;) */ @@ -227,35 +231,27 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE FIXME("unsupported locking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage); } - TRACE("returning pBits=%p, pitch=%d\n", pLockedRect->pBits, pLockedRect->Pitch); - - This->locked = TRUE; - return D3D_OK; -} -HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) { - HRESULT hr; - ICOM_THIS(IDirect3DSurface8Impl,iface); - - if (FALSE == This->locked) { - ERR("trying to lock unlocked surf@%p\n", This); - return D3DERR_INVALIDCALL; - } - - TRACE("(%p) : stub\n", This); - - if (0 == This->myDesc.Usage) { /* classic surface */ - if (This->Container) { + 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 */ - int containerType = IDirect3DBaseTexture8Impl_GetType(cont); + D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType(cont); if (containerType == D3DRTYPE_TEXTURE) { - IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont; + IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont; pTexture->Dirty = TRUE; } else if (containerType == D3DRTYPE_CUBETEXTURE) { - IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont; + IDirect3DCubeTexture8Impl* pTexture = (IDirect3DCubeTexture8Impl*) cont; pTexture->Dirty = TRUE; } else { FIXME("Set dirty on container type %d\n", containerType); @@ -264,6 +260,52 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) { cont = NULL; } } + } + + TRACE("returning pBits=%p, pitch=%d\n", pLockedRect->pBits, pLockedRect->Pitch); + + This->locked = TRUE; + return D3D_OK; +} +HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) { + ICOM_THIS(IDirect3DSurface8Impl,iface); + + if (FALSE == This->locked) { + ERR("trying to lock unlocked surf@%p\n", This); + return D3DERR_INVALIDCALL; + } + + 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); + + if (SUCCEEDED(hr) && NULL != cont) { + /* Now setup the texture appropraitly */ + int 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; + } + } +#endif } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */ if (This == This->Device->backBuffer || This == This->Device->frontBuffer) { @@ -336,6 +378,8 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) { } else { FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage); } + +unlock_end: This->locked = FALSE; return D3D_OK; } diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c index 8a3535f5246..1fca29cc41f 100644 --- a/dlls/d3d8/texture.c +++ b/dlls/d3d8/texture.c @@ -192,30 +192,36 @@ HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 ifa 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; } diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c index 6d7be4a2c90..d2427087f91 100644 --- a/dlls/d3d8/volume.c +++ b/dlls/d3d8/volume.c @@ -77,15 +77,18 @@ HRESULT WINAPI IDirect3DVolume8Impl_GetDevice(LPDIRECT3DVOLUME8 iface, IDirect3D } 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 @@ HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DVOLUME_D 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 @@ HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_B (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; } diff --git a/dlls/d3d8/volumetexture.c b/dlls/d3d8/volumetexture.c index d19e4d65e7f..4b148c39bc5 100644 --- a/dlls/d3d8/volumetexture.c +++ b/dlls/d3d8/volumetexture.c @@ -141,33 +141,50 @@ HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUME } 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); - return D3D_OK; -} -HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) { - 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); + *ppVolumeLevel = (LPDIRECT3DVOLUME8)This->volumes[Level]; + IDirect3DVolume8Impl_AddRef((LPDIRECT3DVOLUME8) *ppVolumeLevel); + TRACE("(%p) -> level(%d) returning volume@%p\n", This, Level, *ppVolumeLevel); } 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; + +} +HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) { + HRESULT hr; + ICOM_THIS(IDirect3DVolumeTexture8Impl,iface); + if (Level < This->levels) { + /** + * 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("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->levels); + return D3DERR_INVALIDCALL; + } + 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; }