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