- 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
This commit is contained in:
Raphael Junqueira 2003-05-12 03:10:27 +00:00 committed by Alexandre Julliard
parent a872c781ea
commit eb36d31d6f
7 changed files with 292 additions and 118 deletions

View File

@ -86,23 +86,28 @@ HRESULT WINAPI IDirect3DCubeTexture8Impl_GetDevice(LPDIRECT3DCUBETEXTURE
} }
HRESULT WINAPI IDirect3DCubeTexture8Impl_SetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { HRESULT WINAPI IDirect3DCubeTexture8Impl_SetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
ICOM_THIS(IDirect3DCubeTexture8Impl,iface); 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) { HRESULT WINAPI IDirect3DCubeTexture8Impl_GetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
ICOM_THIS(IDirect3DCubeTexture8Impl,iface); 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) { HRESULT WINAPI IDirect3DCubeTexture8Impl_FreePrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid) {
ICOM_THIS(IDirect3DCubeTexture8Impl,iface); 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) { DWORD WINAPI IDirect3DCubeTexture8Impl_SetPriority(LPDIRECT3DCUBETEXTURE8 iface, DWORD PriorityNew) {
ICOM_THIS(IDirect3DCubeTexture8Impl,iface); 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) { DWORD WINAPI IDirect3DCubeTexture8Impl_GetPriority(LPDIRECT3DCUBETEXTURE8 iface) {
ICOM_THIS(IDirect3DCubeTexture8Impl,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) { void WINAPI IDirect3DCubeTexture8Impl_PreLoad(LPDIRECT3DCUBETEXTURE8 iface) {
ICOM_THIS(IDirect3DCubeTexture8Impl,iface); ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
@ -134,36 +139,62 @@ DWORD WINAPI IDirect3DCubeTexture8Impl_GetLevelCount(LPDIRECT3DCUBETEX
} }
/* IDirect3DCubeTexture8 */ /* 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); ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
if (Level < This->levels) { if (Level < This->levels) {
TRACE("(%p) Level (%d)\n", This, Level); TRACE("(%p) level (%d)\n", This, Level);
return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8)This->surfaces[Level], pDesc); return IDirect3DSurface8Impl_GetDesc((LPDIRECT3DSURFACE8) This->surfaces[Level], pDesc);
} else { } 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; 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); ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->surfaces[FaceType][Level]); if (Level < This->levels) {
*ppCubeMapSurface = (LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level]; *ppCubeMapSurface = (LPDIRECT3DSURFACE8) This->surfaces[FaceType][Level];
IDirect3DSurface8Impl_AddRef((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; 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); 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); ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
This->Dirty = TRUE; This->Dirty = TRUE;
FIXME("(%p) : stub\n", This); return D3D_OK; 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;
} }

View File

@ -455,10 +455,13 @@ struct IDirect3DSwapChain8Impl
DWORD ref; DWORD ref;
/* IDirect3DSwapChain8 fields */ /* IDirect3DSwapChain8 fields */
IDirect3DSurface8Impl *frontBuffer;
IDirect3DSurface8Impl *backBuffer;
D3DPRESENT_PARAMETERS PresentParms;
}; };
/* IUnknown: */ /* 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_AddRef(LPDIRECT3DSWAPCHAIN8 iface);
extern ULONG WINAPI IDirect3DSwapChain8Impl_Release(LPDIRECT3DSWAPCHAIN8 iface); extern ULONG WINAPI IDirect3DSwapChain8Impl_Release(LPDIRECT3DSWAPCHAIN8 iface);
@ -497,6 +500,7 @@ struct IDirect3DSurface8Impl
BOOL lockable; BOOL lockable;
BOOL locked; BOOL locked;
RECT lockedRect; RECT lockedRect;
BOOL Dirty;
}; };
/* IUnknown: */ /* IUnknown: */
@ -669,6 +673,8 @@ struct IDirect3DBaseTexture8Impl
D3DRESOURCETYPE ResourceType; D3DRESOURCETYPE ResourceType;
/* IDirect3DBaseTexture8 fields */ /* IDirect3DBaseTexture8 fields */
BOOL Dirty;
/* /*
*BOOL isManaged; *BOOL isManaged;
*DWORD lod; *DWORD lod;
@ -718,6 +724,7 @@ struct IDirect3DCubeTexture8Impl
D3DRESOURCETYPE ResourceType; D3DRESOURCETYPE ResourceType;
/* IDirect3DBaseTexture8 fields */ /* IDirect3DBaseTexture8 fields */
BOOL Dirty;
/* IDirect3DCubeTexture8 fields */ /* IDirect3DCubeTexture8 fields */
UINT edgeLength; UINT edgeLength;
@ -726,7 +733,6 @@ struct IDirect3DCubeTexture8Impl
D3DFORMAT format; D3DFORMAT format;
IDirect3DSurface8Impl *surfaces[6][MAX_LEVELS]; IDirect3DSurface8Impl *surfaces[6][MAX_LEVELS];
BOOL Dirty;
}; };
/* IUnknown: */ /* IUnknown: */
@ -779,6 +785,7 @@ struct IDirect3DTexture8Impl
D3DRESOURCETYPE ResourceType; D3DRESOURCETYPE ResourceType;
/* IDirect3DBaseTexture8 fields */ /* IDirect3DBaseTexture8 fields */
BOOL Dirty;
/* IDirect3DTexture8 fields */ /* IDirect3DTexture8 fields */
UINT width; UINT width;
@ -787,9 +794,7 @@ struct IDirect3DTexture8Impl
DWORD usage; DWORD usage;
D3DFORMAT format; D3DFORMAT format;
IDirect3DDevice8Impl *device;
IDirect3DSurface8Impl *surfaces[MAX_LEVELS]; IDirect3DSurface8Impl *surfaces[MAX_LEVELS];
BOOL Dirty;
}; };
/* IUnknown: */ /* IUnknown: */
@ -842,6 +847,7 @@ struct IDirect3DVolumeTexture8Impl
D3DRESOURCETYPE ResourceType; D3DRESOURCETYPE ResourceType;
/* IDirect3DBaseTexture8 fields */ /* IDirect3DBaseTexture8 fields */
BOOL Dirty;
/* IDirect3DVolumeTexture8 fields */ /* IDirect3DVolumeTexture8 fields */
UINT width; UINT width;
@ -852,7 +858,6 @@ struct IDirect3DVolumeTexture8Impl
D3DFORMAT format; D3DFORMAT format;
IDirect3DVolume8Impl *volumes[MAX_LEVELS]; IDirect3DVolume8Impl *volumes[MAX_LEVELS];
BOOL Dirty;
}; };
/* IUnknown: */ /* IUnknown: */

View File

@ -432,10 +432,15 @@ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface,
} }
} }
break; 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: default:
r = 0.0f; q = 0.0f; /* Avoid compiler warnings, need these vars later for other textures */ 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 { } else {
/* Note I have seen a program actually do this, so just hide it and continue */ /* 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); TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, BackBuffer, Type, *ppBackBuffer);
if (BackBuffer > This->PresentParms.BackBufferCount - 1) { if (BackBuffer > This->PresentParms.BackBufferCount - 1) {
FIXME("Only one backBuffer currently supported\n"); FIXME("Only one backBuffer currently supported\n");
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
} }
/* Note inc ref on returned surface */ /* 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); 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 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl));
object->lpVtbl = &Direct3DTexture8_Vtbl; object->lpVtbl = &Direct3DTexture8_Vtbl;
object->Device = This; /* FIXME: AddRef(This) */ object->Device = This;
/*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
object->ResourceType = D3DRTYPE_TEXTURE; object->ResourceType = D3DRTYPE_TEXTURE;
object->ref = 1; object->ref = 1;
object->width = Width; object->width = Width;
@ -1290,8 +1296,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN
object->levels = Levels; object->levels = Levels;
object->usage = Usage; object->usage = Usage;
object->format = Format; object->format = Format;
object->device = This;
/*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
/* Calculate levels for mip mapping */ /* Calculate levels for mip mapping */
if (Levels == 0) { if (Levels == 0) {
@ -1299,7 +1304,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN
tmpW = Width; tmpW = Width;
tmpH = Height; tmpH = Height;
while (tmpW > 1 && tmpH > 1) { while (tmpW > 1 && tmpH > 1) {
tmpW = max(1,tmpW / 2); tmpW = max(1, tmpW / 2);
tmpH = max(1, tmpH / 2); tmpH = max(1, tmpH / 2);
object->levels++; object->levels++;
} }
@ -1309,7 +1314,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN
/* Generate all the surfaces */ /* Generate all the surfaces */
tmpW = Width; tmpW = Width;
tmpH = Height; 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]); IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
object->surfaces[i]->Container = (IUnknown*) object; object->surfaces[i]->Container = (IUnknown*) object;
@ -1322,7 +1327,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN
tmpH = max(1, tmpH / 2); tmpH = max(1, tmpH / 2);
} }
*ppTexture = (LPDIRECT3DTEXTURE8)object; *ppTexture = (LPDIRECT3DTEXTURE8) object;
return D3D_OK; 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) { 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; tmpH = Height;
tmpD = Depth; tmpD = Depth;
for (i = 0; i< object->levels; i++) for (i = 0; i < object->levels; i++)
{ {
IDirect3DVolume8Impl *volume; IDirect3DVolume8Impl *volume;
@ -1387,13 +1392,13 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 ifac
/*IUnknown_AddRef(volume->Container);*/ /*IUnknown_AddRef(volume->Container);*/
volume->ref = 1; volume->ref = 1;
volume->myDesc.Width = Width; volume->myDesc.Width = Width;
volume->myDesc.Height= Height; volume->myDesc.Height = Height;
volume->myDesc.Depth = Depth; volume->myDesc.Depth = Depth;
volume->myDesc.Format= Format; volume->myDesc.Format = Format;
volume->myDesc.Type = D3DRTYPE_VOLUME; volume->myDesc.Type = D3DRTYPE_VOLUME;
volume->myDesc.Pool = Pool; volume->myDesc.Pool = Pool;
volume->myDesc.Usage = Usage; volume->myDesc.Usage = Usage;
volume->bytesPerPixel = bytesPerPixel(Format); volume->bytesPerPixel = bytesPerPixel(Format);
volume->myDesc.Size = (Width * volume->bytesPerPixel) * Height * Depth; volume->myDesc.Size = (Width * volume->bytesPerPixel) * Height * Depth;
volume->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, volume->myDesc.Size); 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, 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); volume, volume->allocatedMemory, volume->myDesc.Size);
tmpW = max(1,tmpW / 2); tmpW = max(1, tmpW / 2);
tmpH = max(1, tmpH / 2); tmpH = max(1, tmpH / 2);
tmpD = max(1, tmpD / 2); tmpD = max(1, tmpD / 2);
} }
*ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8)object; *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object;
return D3D_OK; 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; IDirect3DCubeTexture8Impl *object;
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
@ -1435,7 +1440,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface,
object->levels++; object->levels++;
tmpW = EdgeLength; tmpW = EdgeLength;
while (tmpW > 1) { while (tmpW > 1) {
tmpW = max(1,tmpW / 2); tmpW = max(1, tmpW / 2);
object->levels++; object->levels++;
} }
TRACE("Calculated levels = %d\n", 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++) for (i = 0; i < object->levels; i++)
{ {
/* Create the 6 faces */ /* 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]); IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
object->surfaces[j][i]->Container = (IUnknown*) object; object->surfaces[j][i]->Container = (IUnknown*) object;
/*IUnknown_AddRef(object->surfaces[j][i]->Container);*/ /*IUnknown_AddRef(object->surfaces[j][i]->Container);*/
object->surfaces[j][i]->myDesc.Usage = Usage; 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); 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); tmpW = max(1, tmpW / 2);
@ -1518,8 +1523,12 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface
IDirect3DSurface8Impl *object; IDirect3DSurface8Impl *object;
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
if (NULL == object) {
*ppSurface = NULL;
return D3DERR_OUTOFVIDEOMEMORY;
}
*ppSurface = (LPDIRECT3DSURFACE8) object; *ppSurface = (LPDIRECT3DSURFACE8) object;
object->lpVtbl = &Direct3DSurface8_Vtbl; object->lpVtbl = &Direct3DSurface8_Vtbl;
object->Device = This; object->Device = This;
@ -1534,7 +1543,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface
object->myDesc.Format = Format; object->myDesc.Format = Format;
object->myDesc.Type = D3DRTYPE_SURFACE; object->myDesc.Type = D3DRTYPE_SURFACE;
object->myDesc.Usage = D3DUSAGE_RENDERTARGET; object->myDesc.Usage = D3DUSAGE_RENDERTARGET;
object->myDesc.Pool = D3DPOOL_MANAGED; object->myDesc.Pool = D3DPOOL_DEFAULT;
object->myDesc.MultiSampleType = MultiSample; object->myDesc.MultiSampleType = MultiSample;
object->bytesPerPixel = bytesPerPixel(Format); object->bytesPerPixel = bytesPerPixel(Format);
object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
@ -1551,6 +1560,10 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
if (NULL == object) {
*ppSurface = NULL;
return D3DERR_OUTOFVIDEOMEMORY;
}
*ppSurface = (LPDIRECT3DSURFACE8) object; *ppSurface = (LPDIRECT3DSURFACE8) object;
object->lpVtbl = &Direct3DSurface8_Vtbl; object->lpVtbl = &Direct3DSurface8_Vtbl;
object->Device = This; object->Device = This;
@ -1565,7 +1578,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE
object->myDesc.Format = Format; object->myDesc.Format = Format;
object->myDesc.Type = D3DRTYPE_SURFACE; object->myDesc.Type = D3DRTYPE_SURFACE;
object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL; object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL;
object->myDesc.Pool = D3DPOOL_MANAGED; object->myDesc.Pool = D3DPOOL_DEFAULT;
object->myDesc.MultiSampleType = MultiSample; object->myDesc.MultiSampleType = MultiSample;
object->bytesPerPixel = bytesPerPixel(Format); object->bytesPerPixel = bytesPerPixel(Format);
object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
@ -1727,9 +1740,10 @@ HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect
return D3D_OK; 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); 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 WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
HRESULT hr; HRESULT hr;
@ -1775,9 +1789,15 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, ID
hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface); hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface);
return hr; 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); 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; return D3D_OK;
} }
@ -1797,8 +1817,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 i
TRACE("(%p)->(%p)\n", This, ppZStencilSurface); TRACE("(%p)->(%p)\n", This, ppZStencilSurface);
/* Note inc ref on returned surface */ /* 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; 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 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. */ when the depth-buffer format does not contain stencil buffer information, this method fails. */
GLbitfield glMask = 0; GLbitfield glMask = 0;
GLboolean old_ztest;
GLfloat old_z_clear_value;
GLint old_stencil_clear_value;
GLfloat old_color_clear_value[4];
int i; int i;
CONST D3DRECT *curRect; CONST D3DRECT *curRect;
@ -1858,13 +1883,17 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count
} }
/* Clear the whole screen */ /* Clear the whole screen */
if (Flags & D3DCLEAR_STENCIL) { if (Flags & D3DCLEAR_STENCIL) {
glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
glClearStencil(Stencil); glClearStencil(Stencil);
checkGLcall("glClearStencil"); checkGLcall("glClearStencil");
glMask = glMask | GL_STENCIL_BUFFER_BIT; glMask = glMask | GL_STENCIL_BUFFER_BIT;
} }
if (Flags & D3DCLEAR_ZBUFFER) { if (Flags & D3DCLEAR_ZBUFFER) {
glGetBooleanv(GL_DEPTH_WRITEMASK, &old_ztest);
glDepthMask(GL_TRUE);
glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
glClearDepth(Z); glClearDepth(Z);
checkGLcall("glClearDepth"); checkGLcall("glClearDepth");
glMask = glMask | GL_DEPTH_BUFFER_BIT; glMask = glMask | GL_DEPTH_BUFFER_BIT;
@ -1872,8 +1901,11 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count
if (Flags & D3DCLEAR_TARGET) { if (Flags & D3DCLEAR_TARGET) {
TRACE("Clearing screen with glClear to color %lx\n", Color); TRACE("Clearing screen with glClear to color %lx\n", Color);
glClearColor(((Color >> 16) & 0xFF) / 255.0, ((Color >> 8) & 0xFF) / 255.0, glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
((Color >> 0) & 0xFF) / 255.0, ((Color >> 24) & 0xFF) / 255.0); glClearColor(((Color >> 16) & 0xFF) / 255.0,
((Color >> 8) & 0xFF) / 255.0,
((Color >> 0) & 0xFF) / 255.0,
((Color >> 24) & 0xFF) / 255.0);
checkGLcall("glClearColor"); checkGLcall("glClearColor");
glMask = glMask | GL_COLOR_BUFFER_BIT; glMask = glMask | GL_COLOR_BUFFER_BIT;
} }
@ -1881,6 +1913,20 @@ HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count
glClear(glMask); glClear(glMask);
checkGLcall("glClear"); 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); if (curRect) curRect = curRect + sizeof(D3DRECT);
} }
@ -3622,7 +3668,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa
BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP); BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP);
DWORD dwValue = 0; DWORD dwValue = 0;
GLenum source; GLenum source;
GLenum operand; GLenum operand;
dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1]; dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand); GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
if (isAlphaOp) { if (isAlphaOp) {

View File

@ -31,8 +31,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d); WINE_DEFAULT_DEBUG_CHANNEL(d3d);
/* trace: */ /* trace: */
#if 1 #if 0
# define VTRACE(A) FIXME A # define VTRACE(A) TRACE A
#else #else
# define VTRACE(A) # define VTRACE(A)
#endif #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) { HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
ICOM_THIS(IDirect3DSurface8Impl,iface); 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) { HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
ICOM_THIS(IDirect3DSurface8Impl,iface); 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) { HRESULT WINAPI IDirect3DSurface8Impl_FreePrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid) {
ICOM_THIS(IDirect3DSurface8Impl,iface); 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) { HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
ICOM_THIS(IDirect3DSurface8Impl,iface); ICOM_THIS(IDirect3DSurface8Impl,iface);
@ -118,7 +121,9 @@ HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3DSURFAC
return D3D_OK; return D3D_OK;
} }
HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) { HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
HRESULT hr;
ICOM_THIS(IDirect3DSurface8Impl,iface); ICOM_THIS(IDirect3DSurface8Impl,iface);
/* fixme: should we really lock as such? */ /* fixme: should we really lock as such? */
if (FALSE == This->lockable) { if (FALSE == This->lockable) {
@ -126,7 +131,7 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE
return D3DERR_INVALIDCALL; 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 */ 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 */ if (0 == This->myDesc.Usage) { /* classic surface */
/* Nothing to do ;) */ /* 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); 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); if (Flags & (D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY)) {
/* Dont dirtify */
This->locked = TRUE; } else {
return D3D_OK; /**
} * Dirtify on lock
HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) { * as seen in msdn docs
HRESULT hr; */
ICOM_THIS(IDirect3DSurface8Impl,iface); This->Dirty = TRUE;
/** Dirtify Container if needed */
if (FALSE == This->locked) { if (NULL != This->Container) {
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) {
IDirect3DBaseTexture8* cont = NULL; IDirect3DBaseTexture8* cont = NULL;
hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont); hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
if (SUCCEEDED(hr) && NULL != cont) { if (SUCCEEDED(hr) && NULL != cont) {
/* Now setup the texture appropraitly */ /* Now setup the texture appropraitly */
int containerType = IDirect3DBaseTexture8Impl_GetType(cont); D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType(cont);
if (containerType == D3DRTYPE_TEXTURE) { if (containerType == D3DRTYPE_TEXTURE) {
IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont; IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont;
pTexture->Dirty = TRUE; pTexture->Dirty = TRUE;
} else if (containerType == D3DRTYPE_CUBETEXTURE) { } else if (containerType == D3DRTYPE_CUBETEXTURE) {
IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont; IDirect3DCubeTexture8Impl* pTexture = (IDirect3DCubeTexture8Impl*) cont;
pTexture->Dirty = TRUE; pTexture->Dirty = TRUE;
} else { } else {
FIXME("Set dirty on container type %d\n", containerType); FIXME("Set dirty on container type %d\n", containerType);
@ -264,6 +260,52 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
cont = NULL; 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 */ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
if (This == This->Device->backBuffer || This == This->Device->frontBuffer) { if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
@ -336,6 +378,8 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
} else { } else {
FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage); FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
} }
unlock_end:
This->locked = FALSE; This->locked = FALSE;
return D3D_OK; return D3D_OK;
} }

View File

@ -192,30 +192,36 @@ HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 ifa
HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level,IDirect3DSurface8** ppSurfaceLevel) { HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level,IDirect3DSurface8** ppSurfaceLevel) {
ICOM_THIS(IDirect3DTexture8Impl,iface); ICOM_THIS(IDirect3DTexture8Impl,iface);
*ppSurfaceLevel = (LPDIRECT3DSURFACE8)This->surfaces[Level]; *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); TRACE("(%p) : returning %p for level %d\n", This, *ppSurfaceLevel, Level);
return D3D_OK; return D3D_OK;
} }
HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) { HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) {
HRESULT hr;
ICOM_THIS(IDirect3DTexture8Impl,iface); ICOM_THIS(IDirect3DTexture8Impl,iface);
TRACE("(%p) Level (%d)\n", This, Level); TRACE("(%p) Level (%d)\n", This, Level);
if (Level < This->levels) { 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 { } else {
FIXME("Levels seems too high?!!\n"); FIXME("Levels seems too high?!!\n");
} }
return D3D_OK; return hr;
} }
HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface, UINT Level) { HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface, UINT Level) {
ICOM_THIS(IDirect3DTexture8Impl,iface); ICOM_THIS(IDirect3DTexture8Impl,iface);
This->Dirty = TRUE;
TRACE("(%p) : stub\n", This); TRACE("(%p) : stub\n", This);
return D3D_OK; return D3D_OK;
} }
HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect) { HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect) {
ICOM_THIS(IDirect3DTexture8Impl,iface); ICOM_THIS(IDirect3DTexture8Impl,iface);
This->Dirty = TRUE; This->Dirty = TRUE;
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
return D3D_OK;
} }

View File

@ -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) { HRESULT WINAPI IDirect3DVolume8Impl_SetPrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
ICOM_THIS(IDirect3DVolume8Impl,iface); 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) { HRESULT WINAPI IDirect3DVolume8Impl_GetPrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
ICOM_THIS(IDirect3DVolume8Impl,iface); 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) { HRESULT WINAPI IDirect3DVolume8Impl_FreePrivateData(LPDIRECT3DVOLUME8 iface, REFGUID refguid) {
ICOM_THIS(IDirect3DVolume8Impl,iface); 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) { 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)); memcpy(pDesc, &This->myDesc, sizeof(D3DVOLUME_DESC));
return D3D_OK; 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); ICOM_THIS(IDirect3DVolume8Impl,iface);
FIXME("(%p) : pBox=%p stub\n", This, pBox); FIXME("(%p) : pBox=%p stub\n", This, pBox);
@ -120,23 +123,45 @@ HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_B
(pLockedVolume->RowPitch * pBox->Top) + (pLockedVolume->RowPitch * pBox->Top) +
(pBox->Left * This->bytesPerPixel); (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; return D3D_OK;
} }
HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) { HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) {
ICOM_THIS(IDirect3DVolume8Impl,iface); ICOM_THIS(IDirect3DVolume8Impl,iface);
TRACE("(%p) : stub\n", This); TRACE("(%p) : stub\n", This);
#if 0
if (This->Container) { if (This->Container) {
IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container; IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container;
D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
int containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
if (containerType == D3DRTYPE_VOLUMETEXTURE) { if (containerType == D3DRTYPE_VOLUMETEXTURE) {
IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont; IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont;
pTexture->Dirty = TRUE; pTexture->Dirty = TRUE;
} else { } else {
FIXME("Set dirty on container type %d\n", containerType); FIXME("Set dirty on container type %d\n", containerType);
} }
} }
#endif
return D3D_OK; return D3D_OK;
} }

View File

@ -141,33 +141,50 @@ HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUME
} }
return D3D_OK; 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); 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) { 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 { } 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 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) { HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level) {
ICOM_THIS(IDirect3DVolumeTexture8Impl,iface); ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
This->Dirty = TRUE; if (Level < This->levels) {
TRACE("(%p) : stub\n", This); 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; return D3D_OK;
} }
HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX* pDirtyBox) { HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX* pDirtyBox) {
ICOM_THIS(IDirect3DVolumeTexture8Impl,iface); ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
This->Dirty = TRUE; This->Dirty = TRUE;
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
return D3D_OK;
} }