[dx8-17] Warcraft3 begining ...
Raphaël Junqueira
fenix at club-internet.fr
Sat May 10 11:34:38 CDT 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Stupid email client (don't like ctr+enter) ;(
> Hi all,
>
> with this patch Warcraft3 menu + loading look better than never ;)
>
> Changelog:
> - minor COM fixes (fixes some crashes on stupid games)
> - minor indent
> - fix SELECTARG2 behavior (with help of lionel same patch)
> - surface locking/unlocking (only rendering and textures surfaces
> supported now) be carefull, its very very very slow
>
> Regards,
> Raphael
>
> PS: Jason have you an idea why glDrawPixels is really slow (is know it slow
> but launching warcraft3 on call on my geforce card take 0.1-0.2s!!!)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+vSoep7NA3AmQTU4RAt42AJ9j7AiRK/3JfKAdY8vOy+qfvJE+EACdGbSj
O9Y1SBNcwuRQbcJattFeL+w=
=nCb6
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.23
diff -u -r1.23 d3d8_private.h
--- d3d8_private.h 8 May 2003 17:36:00 -0000 1.23
+++ d3d8_private.h 10 May 2003 16:23:55 -0000
@@ -247,6 +247,7 @@
/* IDirect3DDevice8 fields */
IDirect3D8Impl *direct3d8;
+ IDirect3DSurface8Impl *frontBuffer;
IDirect3DSurface8Impl *backBuffer;
IDirect3DSurface8Impl *depthStencilBuffer;
D3DPRESENT_PARAMETERS PresentParms;
@@ -413,7 +414,7 @@
IDirect3DDevice8Impl *Device;
D3DRESOURCETYPE ResourceType;
- void *Container;
+ IUnknown *Container;
D3DVOLUME_DESC myDesc;
BYTE *allocatedMemory;
UINT textureName;
@@ -493,6 +494,9 @@
BYTE *allocatedMemory;
UINT textureName;
UINT bytesPerPixel;
+ BOOL lockable;
+ BOOL locked;
+ RECT lockedRect;
};
/* IUnknown: */
@@ -721,7 +725,6 @@
UINT levels;
D3DFORMAT format;
- IDirect3DDevice8Impl *device;
IDirect3DSurface8Impl *surfaces[6][MAX_LEVELS];
BOOL Dirty;
};
@@ -848,7 +851,6 @@
DWORD usage;
D3DFORMAT format;
- IDirect3DDevice8Impl *device;
IDirect3DVolume8Impl *volumes[MAX_LEVELS];
BOOL Dirty;
};
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.47
diff -u -r1.47 device.c
--- device.c 8 May 2003 17:36:00 -0000 1.47
+++ device.c 10 May 2003 16:23:57 -0000
@@ -994,9 +994,9 @@
case D3DSTENCILOP_INCRSAT : return GL_INCR;
case D3DSTENCILOP_DECRSAT : return GL_DECR;
case D3DSTENCILOP_INVERT : return GL_INVERT;
- case D3DSTENCILOP_INCR : FIXME("Unsupported stencil op %ld\n", op);
+ case D3DSTENCILOP_INCR : FIXME("Unsupported stencil op D3DSTENCILOP_INCR\n");
return GL_INCR; /* Fixme - needs to support wrap */
- case D3DSTENCILOP_DECR : FIXME("Unsupported stencil op %ld\n", op);
+ case D3DSTENCILOP_DECR : FIXME("Unsupported stencil op D3DSTENCILOP_DECR\n");
return GL_DECR; /* Fixme - needs to support wrap */
default:
FIXME("Invalid stencil op %ld\n", op);
@@ -1004,6 +1004,72 @@
}
}
+/**
+ * @nodoc: todo
+ */
+void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand)
+{
+ BOOL isAlphaReplicate = FALSE;
+ BOOL isComplement = FALSE;
+
+ *operand = GL_SRC_COLOR;
+ *source = GL_TEXTURE;
+
+ /* Catch alpha replicate */
+ if (iValue & D3DTA_ALPHAREPLICATE) {
+ iValue = iValue & ~D3DTA_ALPHAREPLICATE;
+ isAlphaReplicate = TRUE;
+ }
+
+ /* Catch Complement */
+ if (iValue & D3DTA_COMPLEMENT) {
+ iValue = iValue & ~D3DTA_COMPLEMENT;
+ isComplement = TRUE;
+ }
+
+ /* Calculate the operand */
+ if (isAlphaReplicate && !isComplement) {
+ *operand = GL_SRC_ALPHA;
+ } else if (isAlphaReplicate && isComplement) {
+ *operand = GL_ONE_MINUS_SRC_ALPHA;
+ } else if (isComplement) {
+ if (isAlphaArg) {
+ *operand = GL_ONE_MINUS_SRC_ALPHA;
+ } else {
+ *operand = GL_ONE_MINUS_SRC_COLOR;
+ }
+ } else {
+ if (isAlphaArg) {
+ *operand = GL_SRC_ALPHA;
+ } else {
+ *operand = GL_SRC_COLOR;
+ }
+ }
+
+ /* Calculate the source */
+ switch (iValue & D3DTA_SELECTMASK) {
+ case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT;
+ break;
+ case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT;
+ break;
+ case D3DTA_TEXTURE: *source = GL_TEXTURE;
+ break;
+ case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT;
+ break;
+ case D3DTA_SPECULAR:
+ /**
+ * According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
+ * isnt supported until base GL supports it
+ * There is no concept of temp registers as far as I can tell
+ */
+
+ default:
+ FIXME("Unrecognized or unhandled texture arg %ld\n", iValue);
+ *source = GL_TEXTURE;
+ }
+}
+
+
/* Apply the current values to the specified texture stage */
void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1154,7 +1220,9 @@
}
HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : stub\n", This); return D3D_OK;
+ FIXME("(%p) : stub\n", This);
+ *pSwapChain = NULL;
+ return D3D_OK;
}
HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1173,11 +1241,16 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
*ppBackBuffer = (LPDIRECT3DSURFACE8) This->backBuffer;
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;
+ }
+
/* Note inc ref on returned surface */
IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppBackBuffer);
@@ -1185,7 +1258,8 @@
}
HRESULT WINAPI IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 iface, D3DRASTER_STATUS* pRasterStatus) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : stub\n", This); return D3D_OK;
+ FIXME("(%p) : stub\n", This);
+ return D3D_OK;
}
void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags,CONST D3DGAMMARAMP* pRamp) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1217,6 +1291,7 @@
object->usage = Usage;
object->format = Format;
object->device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/
/* Calculate levels for mip mapping */
if (Levels == 0) {
@@ -1237,7 +1312,8 @@
for (i=0; i<object->levels; i++)
{
IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
- object->surfaces[i]->Container = (IUnknown*) object; /* FIXME: AddRef(object) */
+ object->surfaces[i]->Container = (IUnknown*) object;
+ /*IUnknown_AddRef(object->surfaces[i]->Container);*/
object->surfaces[i]->myDesc.Usage = Usage;
object->surfaces[i]->myDesc.Pool = Pool ;
@@ -1264,16 +1340,16 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture8Impl));
object->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
object->ResourceType = D3DRTYPE_VOLUMETEXTURE;
+ object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
object->ref = 1;
-
object->width = Width;
object->height = Height;
object->depth = Depth;
object->levels = Levels;
object->usage = Usage;
object->format = Format;
- object->device = This;
/* Calculate levels for mip mapping */
if (Levels == 0) {
@@ -1282,7 +1358,7 @@
tmpH = Height;
tmpD = Depth;
while (tmpW > 1 && tmpH > 1 && tmpD > 1) {
- tmpW = max(1,tmpW / 2);
+ tmpW = max(1, tmpW / 2);
tmpH = max(1, tmpH / 2);
tmpD = max(1, tmpD / 2);
object->levels++;
@@ -1295,7 +1371,7 @@
tmpH = Height;
tmpD = Depth;
- for (i=0; i<object->levels; i++)
+ for (i = 0; i< object->levels; i++)
{
IDirect3DVolume8Impl *volume;
@@ -1304,9 +1380,11 @@
object->volumes[i] = (IDirect3DVolume8Impl *) volume;
volume->lpVtbl = &Direct3DVolume8_Vtbl;
- volume->Device = This; /* FIXME: AddRef(This) */
+ volume->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) volume->Device);*/
volume->ResourceType = D3DRTYPE_VOLUME;
- volume->Container = object;
+ volume->Container = (IUnknown*) object;
+ /*IUnknown_AddRef(volume->Container);*/
volume->ref = 1;
volume->myDesc.Width = Width;
@@ -1343,14 +1421,14 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DCubeTexture8Impl));
object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
object->ref = 1;
- object->Device = This; /* FIXME: AddRef(This) */
+ object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
object->ResourceType = D3DRTYPE_CUBETEXTURE;
object->edgeLength = EdgeLength;
object->levels = Levels;
object->usage = Usage;
object->format = Format;
- object->device = This;
/* Calculate levels for mip mapping */
if (Levels == 0) {
@@ -1365,17 +1443,18 @@
/* Generate all the surfaces */
tmpW = EdgeLength;
- for (i=0; i<object->levels; i++)
+ 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 ;
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);
}
}
@@ -1383,8 +1462,7 @@
*ppCubeTexture = (LPDIRECT3DCUBETEXTURE8)object;
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage,
- DWORD FVF,D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) {
+HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) {
IDirect3DVertexBuffer8Impl *object;
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1393,6 +1471,7 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl));
object->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
object->ResourceType = D3DRTYPE_VERTEXBUFFER;
object->ref = 1;
object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
@@ -1407,8 +1486,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer8** ppIndexBuffer) {
-
+HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer) {
IDirect3DIndexBuffer8Impl *object;
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1417,8 +1495,9 @@
/* Allocate the storage for the device */
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DIndexBuffer8Impl));
object->lpVtbl = &Direct3DIndexBuffer8_Vtbl;
- object->ref = 1;
object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+ object->ref = 1;
object->ResourceType = D3DRTYPE_INDEXBUFFER;
object->currentDesc.Type = D3DRTYPE_INDEXBUFFER;
@@ -1435,17 +1514,69 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,BOOL Lockable,IDirect3DSurface8** ppSurface) {
+HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) {
+ IDirect3DSurface8Impl *object;
+
ICOM_THIS(IDirect3DDevice8Impl,iface);
- /* up ref count on surface, surface->container = This */
- FIXME("(%p) : stub\n", This); return D3D_OK;
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+ *ppSurface = (LPDIRECT3DSURFACE8) object;
+ object->lpVtbl = &Direct3DSurface8_Vtbl;
+ object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+ object->ResourceType = D3DRTYPE_SURFACE;
+ object->Container = (IUnknown*) This;
+ /*IUnknown_AddRef(object->Container);*/
+
+ object->ref = 1;
+ object->myDesc.Width = Width;
+ object->myDesc.Height = Height;
+ object->myDesc.Format = Format;
+ object->myDesc.Type = D3DRTYPE_SURFACE;
+ object->myDesc.Usage = D3DUSAGE_RENDERTARGET;
+ object->myDesc.Pool = D3DPOOL_MANAGED;
+ object->myDesc.MultiSampleType = MultiSample;
+ object->bytesPerPixel = bytesPerPixel(Format);
+ object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+ object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+ object->lockable = Lockable;
+ object->locked = FALSE;
+
+ TRACE("(%p) : w(%d) h(%d) fmt(%d) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, Lockable, *ppSurface, object->allocatedMemory, object->myDesc.Size);
+ return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,IDirect3DSurface8** ppSurface) {
+HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) {
+ IDirect3DSurface8Impl *object;
+
ICOM_THIS(IDirect3DDevice8Impl,iface);
- /* surface->container = This */
- FIXME("(%p) : stub\n", This); return D3D_OK;
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
+ *ppSurface = (LPDIRECT3DSURFACE8) object;
+ object->lpVtbl = &Direct3DSurface8_Vtbl;
+ object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
+ object->ResourceType = D3DRTYPE_SURFACE;
+ object->Container = (IUnknown*) This;
+ /*IUnknown_AddRef(object->Container);*/
+
+ object->ref = 1;
+ object->myDesc.Width = Width;
+ object->myDesc.Height = Height;
+ object->myDesc.Format = Format;
+ object->myDesc.Type = D3DRTYPE_SURFACE;
+ object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL;
+ object->myDesc.Pool = D3DPOOL_MANAGED;
+ object->myDesc.MultiSampleType = MultiSample;
+ object->bytesPerPixel = bytesPerPixel(Format);
+ object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
+ object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+ object->lockable = TRUE;
+ object->locked = FALSE;
+
+ TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, *ppSurface, object->allocatedMemory, object->myDesc.Size);
+ return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,IDirect3DSurface8** ppSurface) {
+HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) {
IDirect3DSurface8Impl *object;
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1454,19 +1585,23 @@
*ppSurface = (LPDIRECT3DSURFACE8) object;
object->lpVtbl = &Direct3DSurface8_Vtbl;
object->Device = This;
+ /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/
object->ResourceType = D3DRTYPE_SURFACE;
object->Container = (IUnknown*) This;
+ /*IUnknown_AddRef(object->Container);*/
object->ref = 1;
- object->myDesc.Width = Width;
- object->myDesc.Height= Height;
- object->myDesc.Format= Format;
+ object->myDesc.Width = Width;
+ object->myDesc.Height = Height;
+ object->myDesc.Format = Format;
object->myDesc.Type = D3DRTYPE_SURFACE;
- /*object->myDesc.Usage */
- object->myDesc.Pool = D3DPOOL_SYSTEMMEM ;
+ object->myDesc.Usage = 0;
+ object->myDesc.Pool = D3DPOOL_SYSTEMMEM;
object->bytesPerPixel = bytesPerPixel(Format);
object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size);
+ object->lockable = TRUE;
+ object->locked = FALSE;
TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, *ppSurface, object->allocatedMemory, object->myDesc.Size);
return D3D_OK;
@@ -1597,29 +1732,66 @@
FIXME("(%p) : stub\n", This); return D3D_OK;
}
HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
+ HRESULT hr;
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : stub\n", This); return D3D_OK;
+
+ FIXME("(%p) : stub\n", This);
+
+ if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
+ return D3DERR_INVALIDCALL;
+ }
+
+ D3DLOCKED_RECT lockedRect;
+ hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, NULL, 0);
+ if (FAILED(hr)) {
+ return D3DERR_INVALIDCALL;
+ }
+
+ GLint prev_store;
+ GLenum prev_read;
+
+ ENTER_GL();
+
+ glFlush();
+ vcheckGLcall("glFlush");
+ glGetIntegerv(GL_READ_BUFFER, &prev_read);
+ vcheckGLcall("glIntegerv");
+ glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+ vcheckGLcall("glIntegerv");
+
+ glReadBuffer(GL_FRONT);
+ vcheckGLcall("glReadBuffer");
+ glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+ vcheckGLcall("glPixelStorei");
+ glReadPixels(0, 0, This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight,
+ GL_BGRA, GL_UNSIGNED_BYTE, lockedRect.pBits);
+ vcheckGLcall("glReadPixels");
+ glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
+ vcheckGLcall("glPixelStorei");
+ glReadBuffer(prev_read);
+ vcheckGLcall("glReadBuffer");
+ LEAVE_GL();
+
+ hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface);
+ return hr;
}
HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget,IDirect3DSurface8* pNewZStencil) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : stub\n", This);
+ FIXME("(%p) : invalid stub expect crash\n", This);
return D3D_OK;
}
HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- /*TRACE("(%p) : returning %p\n", This, This->renderTarget); */
- FIXME("(%p) : stub\n", This);
-
- /*
- **ppRenderTarget = (LPDIRECT3DSURFACE8) This->renderTarget;
- *IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget);
- */
+ TRACE("(%p)->(%p)\n", This, This->frontBuffer);
+
+ *ppRenderTarget = (LPDIRECT3DSURFACE8) This->frontBuffer;
+ IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget);
+
return D3D_OK;
}
HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface) {
-
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p)->(%p)\n", This, ppZStencilSurface);
@@ -1674,7 +1846,7 @@
curRect = NULL;
}
- for (i=0;i<Count || i==0; i++) {
+ for (i = 0; i < Count || i == 0; i++) {
if (curRect) {
/* Note gl uses lower left, width/height */
@@ -1852,14 +2024,14 @@
}
/* Reapply texture transforms as based off modelview when applied */
- for (Stage=0; Stage<This->TextureUnits; Stage++) {
+ for (Stage = 0; Stage < This->TextureUnits; Stage++) {
/* Now apply texture transforms if not applying to the dummy textures */
- #if defined(GL_VERSION_1_3)
+#if defined(GL_VERSION_1_3)
glActiveTexture(GL_TEXTURE0 + Stage);
- #else
+#else
glActiveTextureARB(GL_TEXTURE0_ARB + Stage);
- #endif
+#endif
checkGLcall("glActiveTexture(GL_TEXTURE0 + Stage);");
glMatrixMode(GL_TEXTURE);
@@ -1966,7 +2138,7 @@
m.u.s._21 = 1.0f; m.u.s._22 = 1.0f; m.u.s._23 = 1.0f; m.u.s._24 = 1.0f;
m.u.s._31 = 1.0f; m.u.s._32 = 1.0f; m.u.s._33 = 1.0f; m.u.s._34 = 1.0f;
m.u.s._41 = 1.0f; m.u.s._42 = 1.0f; m.u.s._43 = 1.0f; m.u.s._44 = 1.0f;
- if (viewChanged==FALSE) {
+ if (viewChanged == FALSE) {
glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
@@ -3039,7 +3211,7 @@
TRACE("(%p)\n", This);
- return IDirect3DDeviceImpl_BeginStateBlock(This);
+ return IDirect3DDeviceImpl_BeginStateBlock(This);
}
HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface, DWORD* pToken) {
IDirect3DStateBlockImpl* pSB;
@@ -3357,69 +3529,19 @@
case D3DTSS_COLORARG0 :
case D3DTSS_ALPHAARG0 :
/* FIXME: Mesa seems to struggle setting these at the moment */
- break;
+ /*FIXME("COLORARG0/ALPHAARG0 support still a stub, Stage=%ld, Type=%d, Value =%ld\n", Stage, Type, Value);*/
+ /*break;*/
case D3DTSS_COLORARG1 :
case D3DTSS_COLORARG2 :
case D3DTSS_ALPHAARG1 :
case D3DTSS_ALPHAARG2 :
{
- BOOL isAlphaReplicate = FALSE;
- BOOL isComplement = FALSE;
- BOOL isAlphaArg = (Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0);
- int operand= GL_SRC_COLOR;
+ BOOL isAlphaArg = (Type == D3DTSS_ALPHAARG1 || Type == D3DTSS_ALPHAARG2 || Type == D3DTSS_ALPHAARG0);
+ int operand = GL_SRC_COLOR;
int source = GL_TEXTURE;
- /* Catch alpha replicate */
- if (Value & D3DTA_ALPHAREPLICATE) {
- Value = Value & ~D3DTA_ALPHAREPLICATE;
- isAlphaReplicate = TRUE;
- }
-
- /* Catch Complement */
- if (Value & D3DTA_COMPLEMENT) {
- Value = Value & ~D3DTA_COMPLEMENT;
- isComplement = TRUE;
- }
-
- /* Calculate the operand */
- if (isAlphaReplicate && !isComplement) {
- operand = GL_SRC_ALPHA;
- } else if (isAlphaReplicate && isComplement) {
- operand = GL_ONE_MINUS_SRC_ALPHA;
- } else if (isComplement) {
- if (isAlphaArg) {
- operand = GL_ONE_MINUS_SRC_ALPHA;
- } else {
- operand = GL_ONE_MINUS_SRC_COLOR;
- }
- } else {
- if (isAlphaArg) {
- operand = GL_SRC_ALPHA;
- } else {
- operand = GL_SRC_COLOR;
- }
- }
-
- /* Calculate the source */
- switch (Value) {
- case D3DTA_CURRENT: source = GL_PREVIOUS_EXT;
- break;
- case D3DTA_DIFFUSE: source = GL_PRIMARY_COLOR_EXT;
- break;
- case D3DTA_TEXTURE: source = GL_TEXTURE;
- break;
- case D3DTA_TFACTOR: source = GL_CONSTANT_EXT;
- break;
-
- /* According to the GL_ARB_texture_env_combine specs, SPECULAR is 'Secondary color' and
- isnt supported until base GL supports it
- There is no concept of temp registers as far as I can tell */
-
- default:
- FIXME("Unrecognized or unhandled texture arg %ld\n", Value);
- }
-
+ GetSrcAndOpFromValue(Value, isAlphaArg, &source, &operand);
if (isAlphaArg) {
TRACE("Source %x = %x, Operand %x = %x\n", SOURCEx_ALPHA_EXT(Type), source, OPERANDx_ALPHA_EXT(Type), operand);
glTexEnvi(GL_TEXTURE_ENV, SOURCEx_ALPHA_EXT(Type), source);
@@ -3492,10 +3614,92 @@
break;
case D3DTOP_SELECTARG1 :
- glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+ {
+ 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 */
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
+ }
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+ }
+#endif
+ }
break;
+ case D3DTOP_SELECTARG2 :
+ {
+ BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP);
+ DWORD dwValue = 0;
+ GLenum source;
+ GLenum operand;
+ FIXME("see if D3DTOP_SELECTARG2 behavior is correct now!\n");
+ glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
+ /* GL_REPLACE, swap args 0 and 1? */
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
+ }
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+ }
+ }
+ break;
+
case D3DTOP_MODULATE4X : Scale = Scale * 2; /* Drop through */
case D3DTOP_MODULATE2X : Scale = Scale * 2; /* Drop through */
case D3DTOP_MODULATE :
@@ -3535,9 +3739,17 @@
break;
case D3DTOP_SUBTRACT :
- /* glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT); Missing? */
- case D3DTOP_SELECTARG2 :
- /* GL_REPLACE, swap args 0 and 1? */
+#if defined(GL_VERSION_1_3)
+ glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_SUBTRACT)");
+ break;
+#else
+ /**
+ * @TODO: to check:
+ * if ARB_texture_env_combine is supported
+ * we can use GL_SUBTRACT_ARB here
+ */
+#endif
case D3DTOP_ADDSMOOTH :
case D3DTOP_BLENDDIFFUSEALPHA :
case D3DTOP_BLENDTEXTUREALPHA :
@@ -3619,52 +3831,77 @@
break;
case D3DTSS_TEXCOORDINDEX :
- /* CameraSpacePosition means use the vertex position, transformed to camera space,
- as the input texture coordinates for this stage's texture transformation. This
- equates roughly to EYE_LINEAR */
- if (Value & D3DTSS_TCI_CAMERASPACEPOSITION) {
- float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
- float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
- float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
- float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
- TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
- glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
- glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
- glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
- glPopMatrix();
-
- TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
- glEnable(GL_TEXTURE_GEN_S);
- checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
- checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
- glEnable(GL_TEXTURE_GEN_T);
- checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
- checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
- glEnable(GL_TEXTURE_GEN_R);
- checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
- glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
- checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
- }
-
- /* Todo: */
- if (Value && Value != D3DTSS_TCI_CAMERASPACEPOSITION) {
- /* ? disable GL_TEXTURE_GEN_n ? */
- FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value);
+ {
+ /* CameraSpacePosition means use the vertex position, transformed to camera space,
+ as the input texture coordinates for this stage's texture transformation. This
+ equates roughly to EYE_LINEAR */
+
+ /**
+ * To Jason: i don't understand what to do with the (Value & 0x00FF) index
+ * it seems a texture coordinate index (0 <= x <= 7) seeing msdn and logs
+ * have you any idea ?
+ */
+
+ /**
+ * Be carefull the value of the mask 0xF0000 come from d3d8types.h infos
+ */
+ switch (Value & 0xFFFFFF00) {
+ case D3DTSS_TCI_PASSTHRU:
+ /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/
+ break;
+
+ case D3DTSS_TCI_CAMERASPACEPOSITION:
+ {
+ float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
+ float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
+ float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
+ float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
+ TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+ glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
+ glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
+ glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
+ glPopMatrix();
+
+ TRACE("D3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
+ glEnable(GL_TEXTURE_GEN_S);
+ checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+ glEnable(GL_TEXTURE_GEN_T);
+ checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+ glEnable(GL_TEXTURE_GEN_R);
+ checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
+ }
+ break;
+
+ default:
+ /* Todo: */
+ /* ? disable GL_TEXTURE_GEN_n ? */
+ FIXME("Unhandled D3DTSS_TEXCOORDINDEX %lx\n", Value);
+ break;
+ }
}
break;
/* Unhandled */
case D3DTSS_BUMPENVMAT00 :
case D3DTSS_BUMPENVMAT01 :
+ TRACE("BUMPENVMAT0%u Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT00, Stage, Type, Value);
+ break;
case D3DTSS_BUMPENVMAT10 :
case D3DTSS_BUMPENVMAT11 :
+ TRACE("BUMPENVMAT1%u Still a stub, Stage=%ld, Type=%d, Value =%ld\n", Type - D3DTSS_BUMPENVMAT10, Stage, Type, Value);
+ break;
+
case D3DTSS_MIPMAPLODBIAS :
case D3DTSS_MAXMIPLEVEL :
case D3DTSS_MAXANISOTROPY :
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.28
diff -u -r1.28 directx.c
--- directx.c 8 May 2003 17:36:00 -0000 1.28
+++ directx.c 10 May 2003 16:23:58 -0000
@@ -378,15 +378,14 @@
{
GLint gl_max;
-
#if defined(GL_VERSION_1_3)
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gl_max);
#else
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
#endif
+ TRACE("GLCaps: GL_MAX_TEXTURE_UNITS_ARB=%d\n", gl_max);
pCaps->MaxTextureBlendStages = min(8, gl_max);
pCaps->MaxSimultaneousTextures = min(8, gl_max);
- TRACE("GLCaps: GL_MAX_TEXTURE_UNITS_ARB=%ld\n", pCaps->MaxTextureBlendStages);
glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
pCaps->MaxUserClipPlanes = min(MAX_CLIPPLANES, gl_max);
@@ -563,18 +562,27 @@
}
}
- IDirect3DDevice8Impl_CreateImageSurface((LPDIRECT3DDEVICE8) object,
+ IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
+ pPresentationParameters->BackBufferWidth,
+ pPresentationParameters->BackBufferHeight,
+ pPresentationParameters->BackBufferFormat,
+ D3DMULTISAMPLE_NONE, TRUE,
+ (LPDIRECT3DSURFACE8*) &object->frontBuffer);
+
+ IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
pPresentationParameters->BackBufferWidth,
pPresentationParameters->BackBufferHeight,
pPresentationParameters->BackBufferFormat,
+ D3DMULTISAMPLE_NONE, TRUE,
(LPDIRECT3DSURFACE8*) &object->backBuffer);
if (pPresentationParameters->EnableAutoDepthStencil)
- IDirect3DDevice8Impl_CreateImageSurface((LPDIRECT3DDEVICE8) object,
- pPresentationParameters->BackBufferWidth,
- pPresentationParameters->BackBufferHeight,
- pPresentationParameters->AutoDepthStencilFormat,
- (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer);
+ IDirect3DDevice8Impl_CreateDepthStencilSurface((LPDIRECT3DDEVICE8) object,
+ pPresentationParameters->BackBufferWidth,
+ pPresentationParameters->BackBufferHeight,
+ pPresentationParameters->AutoDepthStencilFormat,
+ D3DMULTISAMPLE_NONE,
+ (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer);
/* Now override the surface's Flip method (if in double buffering) ?COPIED from DDRAW!?
((x11_ds_private *) surface->private)->opengl_flip = TRUE;
Index: indexbuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/indexbuffer.c,v
retrieving revision 1.5
diff -u -r1.5 indexbuffer.c
--- indexbuffer.c 21 Apr 2003 22:38:14 -0000 1.5
+++ indexbuffer.c 10 May 2003 16:23:58 -0000
@@ -69,6 +69,7 @@
ICOM_THIS(IDirect3DIndexBuffer8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DIndexBuffer8Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: resource.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/resource.c,v
retrieving revision 1.3
diff -u -r1.3 resource.c
--- resource.c 12 Apr 2003 00:06:43 -0000 1.3
+++ resource.c 10 May 2003 16:23:59 -0000
@@ -66,6 +66,7 @@
ICOM_THIS(IDirect3DResource8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DResource8Impl_SetPrivateData(LPDIRECT3DRESOURCE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: stateblock.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v
retrieving revision 1.2
diff -u -r1.2 stateblock.c
--- stateblock.c 12 Apr 2003 00:06:43 -0000 1.2
+++ stateblock.c 10 May 2003 16:23:59 -0000
@@ -200,9 +200,13 @@
/* Make appropriate texture active */
if (This->isMultiTexture) {
+#if defined(GL_VERSION_1_3)
+ glActiveTexture(GL_TEXTURE0 + i);
+#else
glActiveTextureARB(GL_TEXTURE0_ARB + i);
+#endif
checkGLcall("glActiveTextureARB");
- } else if (i>0) {
+ } else if (i > 0) {
FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n");
}
@@ -241,7 +245,7 @@
if (object) {
if (NULL == This->StateBlock) { /** if it the main stateblock only do init and returns */
/*object->lpVtbl = &Direct3DStateBlock9_Vtbl;*/
- object->device = This; /* FIXME: AddRef(This) */
+ object->device = This;
object->ref = 1;
object->blockType = Type;
This->StateBlock = object;
@@ -254,7 +258,7 @@
return E_OUTOFMEMORY;
}
/*object->lpVtbl = &Direct3DStateBlock9_Vtbl;*/
- object->device = This; /* FIXME: AddRef(This) */
+ object->device = This;
object->ref = 1;
object->blockType = Type;
@@ -331,7 +335,7 @@
return E_OUTOFMEMORY;
}
/*object->lpVtbl = &Direct3DVextexShaderDeclaration8_Vtbl;*/
- object->device = This; /* FIXME: AddRef(This) */
+ object->device = This;
object->ref = 1;
This->isRecordingState = TRUE;
@@ -350,7 +354,7 @@
}
This->UpdateStateBlock->blockType = D3DSBT_RECORDED;
- *ppStateBlock = This->UpdateStateBlock;
+ *ppStateBlock = This->UpdateStateBlock; /* FIXME: AddRef() */
This->isRecordingState = FALSE;
This->UpdateStateBlock = This->StateBlock;
@@ -369,7 +373,7 @@
if (pSB->blockType == D3DSBT_RECORDED || pSB->blockType == D3DSBT_ALL || pSB->blockType == D3DSBT_VERTEXSTATE) {
- for (i=0; i<This->maxLights; i++) {
+ for (i = 0; i < This->maxLights; i++) {
if (pSB->Set.lightEnable[i] && pSB->Changed.lightEnable[i])
IDirect3DDevice8Impl_LightEnable(iface, i, pSB->lightEnable[i]);
@@ -393,7 +397,7 @@
/* Others + Render & Texture */
if (pSB->blockType == D3DSBT_RECORDED || pSB->blockType == D3DSBT_ALL) {
- for (i=0; i<HIGHEST_TRANSFORMSTATE; i++) {
+ for (i = 0; i < HIGHEST_TRANSFORMSTATE; i++) {
if (pSB->Set.transform[i] && pSB->Changed.transform[i])
IDirect3DDevice8Impl_SetTransform(iface, i, &pSB->transforms[i]);
}
@@ -412,7 +416,7 @@
IDirect3DDevice8Impl_SetStreamSource(iface, i, pSB->stream_source[i], pSB->stream_stride[i]);
}
- for (i=0; i<This->clipPlanes; i++) {
+ for (i = 0; i < This->clipPlanes; i++) {
if (pSB->Set.clipplane[i] && pSB->Changed.clipplane[i]) {
float clip[4];
@@ -425,11 +429,9 @@
}
/* Render */
- for (i=0; i<HIGHEST_RENDER_STATE; i++) {
-
+ for (i = 0; i < HIGHEST_RENDER_STATE; i++) {
if (pSB->Set.renderstate[i] && pSB->Changed.renderstate[i])
IDirect3DDevice8Impl_SetRenderState(iface, i, pSB->renderstate[i]);
-
}
/* Texture */
@@ -447,15 +449,14 @@
} else if (pSB->blockType == D3DSBT_PIXELSTATE) {
- for (i=0; i<NUM_SAVEDPIXELSTATES_R; i++) {
+ for (i = 0; i < NUM_SAVEDPIXELSTATES_R; i++) {
if (pSB->Set.renderstate[SavedPixelStates_R[i]] && pSB->Changed.renderstate[SavedPixelStates_R[i]])
IDirect3DDevice8Impl_SetRenderState(iface, SavedPixelStates_R[i], pSB->renderstate[SavedPixelStates_R[i]]);
}
- for (j=0; j<This->TextureUnits; i++) {
- for (i=0; i<NUM_SAVEDPIXELSTATES_T; i++) {
-
+ for (j = 0; j < This->TextureUnits; i++) {
+ for (i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) {
if (pSB->Set.texture_state[j][SavedPixelStates_T[i]] &&
pSB->Changed.texture_state[j][SavedPixelStates_T[i]])
IDirect3DDevice8Impl_SetTextureStageState(iface, j, SavedPixelStates_T[i], pSB->texture_state[j][SavedPixelStates_T[i]]);
@@ -464,15 +465,13 @@
} else if (pSB->blockType == D3DSBT_VERTEXSTATE) {
- for (i=0; i<NUM_SAVEDVERTEXSTATES_R; i++) {
+ for (i = 0; i < NUM_SAVEDVERTEXSTATES_R; i++) {
if (pSB->Set.renderstate[SavedVertexStates_R[i]] && pSB->Changed.renderstate[SavedVertexStates_R[i]])
IDirect3DDevice8Impl_SetRenderState(iface, SavedVertexStates_R[i], pSB->renderstate[SavedVertexStates_R[i]]);
-
}
- for (j=0; j<This->TextureUnits; i++) {
- for (i=0; i<NUM_SAVEDVERTEXSTATES_T; i++) {
-
+ for (j = 0; j < This->TextureUnits; i++) {
+ for (i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) {
if (pSB->Set.texture_state[j][SavedVertexStates_T[i]] &&
pSB->Changed.texture_state[j][SavedVertexStates_T[i]])
IDirect3DDevice8Impl_SetTextureStageState(iface, j, SavedVertexStates_T[i], pSB->texture_state[j][SavedVertexStates_T[i]]);
@@ -505,7 +504,7 @@
across this action */
} else {
- int i,j;
+ int i, j;
/* Recorded => Only update 'changed' values */
if (updateBlock->Set.vertexShader && updateBlock->VertexShader != This->StateBlock->VertexShader) {
@@ -515,7 +514,7 @@
/* TODO: Vertex Shader Constants */
- for (i=0; i<This->maxLights; i++) {
+ for (i = 0; i < This->maxLights; i++) {
if (updateBlock->Set.lightEnable[i] && This->StateBlock->lightEnable[i] != updateBlock->lightEnable[i]) {
TRACE("Updating light enable for light %d to %d\n", i, This->StateBlock->lightEnable[i]);
updateBlock->lightEnable[i] = This->StateBlock->lightEnable[i];
@@ -538,7 +537,7 @@
/* TODO: Pixel Shader Constants */
/* Others + Render & Texture */
- for (i=0; i<HIGHEST_TRANSFORMSTATE; i++) {
+ for (i = 0; i < HIGHEST_TRANSFORMSTATE; i++) {
if (updateBlock->Set.transform[i] && memcmp(&This->StateBlock->transforms[i],
&updateBlock->transforms[i],
sizeof(D3DMATRIX)) != 0) {
@@ -569,7 +568,7 @@
memcpy(&updateBlock->viewport, &This->StateBlock->viewport, sizeof(D3DVIEWPORT8));
}
- for (i=0; i<MAX_STREAMS; i++) {
+ for (i = 0; i < MAX_STREAMS; i++) {
if (updateBlock->Set.stream_source[i] &&
((updateBlock->stream_stride[i] != This->StateBlock->stream_stride[i]) ||
(updateBlock->stream_source[i] != This->StateBlock->stream_source[i]))) {
@@ -580,7 +579,7 @@
}
}
- for (i=0; i<This->clipPlanes; i++) {
+ for (i = 0; i < This->clipPlanes; i++) {
if (updateBlock->Set.clipplane[i] && memcmp(&This->StateBlock->clipplane[i],
&updateBlock->clipplane[i],
sizeof(updateBlock->clipplane)) != 0) {
@@ -592,7 +591,7 @@
}
/* Render */
- for (i=0; i<HIGHEST_RENDER_STATE; i++) {
+ for (i = 0; i < HIGHEST_RENDER_STATE; i++) {
if (updateBlock->Set.renderstate[i] && (updateBlock->renderstate[i] !=
This->StateBlock->renderstate[i])) {
@@ -602,8 +601,8 @@
}
/* Texture */
- for (j=0; j<This->TextureUnits; j++) {
- for (i=0; i<HIGHEST_TEXTURE_STATE; i++) {
+ for (j = 0; j < This->TextureUnits; j++) {
+ for (i = 0; i < HIGHEST_TEXTURE_STATE; i++) {
if (updateBlock->Set.texture_state[j][i] && (updateBlock->texture_state[j][i] !=
This->StateBlock->texture_state[j][i])) {
Index: surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.6
diff -u -r1.6 surface.c
--- surface.c 12 Apr 2003 00:06:43 -0000 1.6
+++ surface.c 10 May 2003 16:23:59 -0000
@@ -30,6 +30,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+/* trace: */
+#if 1
+# define VTRACE(A) FIXME A
+#else
+# define VTRACE(A)
+#endif
+
+
/* IDirect3DVolume IUnknown parts follow: */
HRESULT WINAPI IDirect3DSurface8Impl_QueryInterface(LPDIRECT3DSURFACE8 iface,REFIID riid,LPVOID *ppobj)
{
@@ -57,8 +65,8 @@
ULONG ref = --This->ref;
TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
if (ref == 0) {
- HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
- HeapFree(GetProcessHeap(), 0, This);
+ HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
+ HeapFree(GetProcessHeap(), 0, This);
}
return ref;
}
@@ -90,11 +98,6 @@
HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
HRESULT res;
- /*
- TRACE("(%p) : returning %p\n", This, This->Container);
- *ppContainer = This->Container;
- return D3D_OK;
- */
res = IUnknown_QueryInterface(This->Container, riid, ppContainer);
if (E_NOINTERFACE == res) {
/**
@@ -114,40 +117,226 @@
memcpy(pDesc, &This->myDesc, sizeof(D3DSURFACE_DESC));
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) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
/* fixme: should we really lock as such? */
+
+ if (FALSE == This->lockable) {
+ ERR("trying to lock unlockable surf@%p\n", This);
+ return D3DERR_INVALIDCALL;
+ }
+
TRACE("(%p) : rect=%p, output prect=%p, allMem=%p\n", This, pRect, pLockedRect, This->allocatedMemory);
- pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width; /* Bytes / row */
+ pLockedRect->Pitch = This->bytesPerPixel * This->myDesc.Width; /* Bytes / row */
+
if (!pRect) {
- pLockedRect->pBits = This->allocatedMemory;
+ pLockedRect->pBits = This->allocatedMemory;
+ This->lockedRect.left = 0;
+ This->lockedRect.top = 0;
+ This->lockedRect.right = This->myDesc.Width;
+ This->lockedRect.bottom = This->myDesc.Height;
+ } else {
+ TRACE("Lock Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
+ pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel);
+ This->lockedRect.left = pRect->left;
+ This->lockedRect.top = pRect->top;
+ This->lockedRect.right = pRect->right;
+ This->lockedRect.bottom = pRect->bottom;
+ }
+
+
+
+ if (0 == This->myDesc.Usage) { /* classic surface */
+
+ /* Nothing to do ;) */
+
+ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+
+ if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
+ GLint prev_store;
+ GLenum prev_read;
+
+ ENTER_GL();
+
+ /**
+ * for render->surface copy begin to begin of allocatedMemory
+ * unlock can be more easy
+ */
+ pLockedRect->pBits = This->allocatedMemory;
+
+ glFlush();
+ vcheckGLcall("glFlush");
+ glGetIntegerv(GL_READ_BUFFER, &prev_read);
+ vcheckGLcall("glIntegerv");
+ glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+ vcheckGLcall("glIntegerv");
+
+ if (This == This->Device->backBuffer) {
+ glReadBuffer(GL_BACK);
+ } else if (This == This->Device->frontBuffer) {
+ glReadBuffer(GL_FRONT);
+ }
+ vcheckGLcall("glReadBuffer");
+
+ switch (This->myDesc.Format) {
+ case D3DFMT_R5G6B5:
+ {
+ glReadPixels(This->lockedRect.left, This->lockedRect.top,
+ This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pLockedRect->pBits);
+ vcheckGLcall("glReadPixels");
+ }
+ break;
+ case D3DFMT_R8G8B8:
+ {
+ glReadPixels(This->lockedRect.left, This->lockedRect.top,
+ This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_RGB, GL_UNSIGNED_BYTE, pLockedRect->pBits);
+ vcheckGLcall("glReadPixels");
+ }
+ break;
+ case D3DFMT_A8R8G8B8:
+ {
+ glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+ vcheckGLcall("glPixelStorei");
+ glReadPixels(This->lockedRect.left, This->lockedRect.top,
+ This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_BGRA, GL_UNSIGNED_BYTE, pLockedRect->pBits);
+ vcheckGLcall("glReadPixels");
+ glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
+ vcheckGLcall("glPixelStorei");
+ }
+ break;
+ default:
+ FIXME("Unsupported Format %u in locking func\n", This->myDesc.Format);
+ }
+
+ glReadBuffer(prev_read);
+ vcheckGLcall("glReadBuffer");
+ LEAVE_GL();
+ } else {
+ FIXME("unsupported locking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+ }
+
+ } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+
+ FIXME("TODO stencil depth surface locking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+
} else {
- TRACE("Lock Rect (%p) = l %ld, t %ld, r %ld, b %ld\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
- pLockedRect->pBits = This->allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel);
+ 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 (This->Container) {
- IDirect3DBaseTexture8 *cont = (IDirect3DBaseTexture8*) This->Container;
- /* Now setup the texture appropraitly */
- int containerType = IDirect3DBaseTexture8Impl_GetType(cont);
- if (containerType == D3DRTYPE_TEXTURE) {
+ if (0 == This->myDesc.Usage) { /* classic surface */
+ if (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);
+ if (containerType == D3DRTYPE_TEXTURE) {
IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont;
pTexture->Dirty = TRUE;
- } else if (containerType == D3DRTYPE_CUBETEXTURE) {
+ } else if (containerType == D3DRTYPE_CUBETEXTURE) {
IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont;
pTexture->Dirty = TRUE;
-
- } else {
+ } else {
FIXME("Set dirty on container type %d\n", containerType);
- }
+ }
+ IDirect3DBaseTexture8_Release(cont);
+ cont = NULL;
+ }
+ }
+ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+
+ if (This == This->Device->backBuffer || This == This->Device->frontBuffer) {
+ GLint prev_store;
+ GLenum prev_draw;
+
+ ENTER_GL();
+
+ glFlush();
+ vcheckGLcall("glFlush");
+ glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
+ vcheckGLcall("glIntegerv");
+ glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
+ vcheckGLcall("glIntegerv");
+
+ if (This == This->Device->backBuffer) {
+ glDrawBuffer(GL_BACK);
+ } else if (This == This->Device->frontBuffer) {
+ glDrawBuffer(GL_FRONT);
+ }
+ vcheckGLcall("glDrawBuffer");
+
+ glRasterPos2i(This->lockedRect.left, This->lockedRect.top);
+ vcheckGLcall("glRasterPos2f");
+ switch (This->myDesc.Format) {
+ case D3DFMT_R5G6B5:
+ {
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, This->allocatedMemory);
+ vcheckGLcall("glDrawPixels");
+ }
+ break;
+ case D3DFMT_R8G8B8:
+ {
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_RGB, GL_UNSIGNED_BYTE, This->allocatedMemory);
+ vcheckGLcall("glDrawPixels");
+ }
+ break;
+ case D3DFMT_A8R8G8B8:
+ {
+ glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+ vcheckGLcall("glPixelStorei");
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ GL_BGRA, GL_UNSIGNED_BYTE, This->allocatedMemory);
+ vcheckGLcall("glDrawPixels");
+ glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
+ vcheckGLcall("glPixelStorei");
+ }
+ break;
+ default:
+ FIXME("Unsupported Format %u in locking func\n", This->myDesc.Format);
+ }
+
+ glDrawBuffer(prev_draw);
+ vcheckGLcall("glDrawBuffer");
+ LEAVE_GL();
+ } else {
+ FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+ }
+
+ } else if (D3DUSAGE_DEPTHSTENCIL & This->myDesc.Usage) { /* stencil surfaces */
+
+ if (This == This->Device->depthStencilBuffer) {
+ FIXME("TODO stencil depth surface unlocking surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+ } else {
+ FIXME("unsupported unlocking to StencilDepth surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
+ }
+
+ } else {
+ FIXME("unsupported unlocking to surface surf@%p usage(%lu)\n", This, This->myDesc.Usage);
}
+ This->locked = FALSE;
return D3D_OK;
}
Index: swapchain.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/swapchain.c,v
retrieving revision 1.3
diff -u -r1.3 swapchain.c
--- swapchain.c 12 Apr 2003 00:06:43 -0000 1.3
+++ swapchain.c 10 May 2003 16:23:59 -0000
@@ -64,11 +64,14 @@
/* IDirect3DSwapChain parts follow: */
HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) {
ICOM_THIS(IDirect3DSwapChain8Impl,iface);
- FIXME("(%p) : stub\n", This); return D3D_OK;
+ FIXME("(%p) : stub\n", This);
+ return D3D_OK;
}
HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
ICOM_THIS(IDirect3DSwapChain8Impl,iface);
- FIXME("(%p) : stub\n", This); return D3D_OK;
+ FIXME("(%p) : stub\n", This);
+ *ppBackBuffer = NULL;
+ return D3D_OK;
}
Index: vertexbuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/vertexbuffer.c,v
retrieving revision 1.3
diff -u -r1.3 vertexbuffer.c
--- vertexbuffer.c 12 Apr 2003 00:06:43 -0000 1.3
+++ vertexbuffer.c 10 May 2003 16:23:59 -0000
@@ -69,6 +69,7 @@
ICOM_THIS(IDirect3DVertexBuffer8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DVertexBuffer8Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
@@ -118,12 +119,12 @@
ICOM_THIS(IDirect3DVertexBuffer8Impl,iface);
TRACE("(%p)\n", This);
- pDesc->Format= This->currentDesc.Format;
- pDesc->Type= This->currentDesc.Type;
- pDesc->Usage= This->currentDesc.Usage;
- pDesc->Pool= This->currentDesc.Pool;
- pDesc->Size= This->currentDesc.Size;
- pDesc->FVF= This->currentDesc.FVF;
+ pDesc->Format = This->currentDesc.Format;
+ pDesc->Type = This->currentDesc.Type;
+ pDesc->Usage = This->currentDesc.Usage;
+ pDesc->Pool = This->currentDesc.Pool;
+ pDesc->Size = This->currentDesc.Size;
+ pDesc->FVF = This->currentDesc.FVF;
return D3D_OK;
}
Index: volume.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volume.c,v
retrieving revision 1.4
diff -u -r1.4 volume.c
--- volume.c 12 Apr 2003 00:06:43 -0000 1.4
+++ volume.c 10 May 2003 16:23:59 -0000
@@ -92,6 +92,7 @@
ICOM_THIS(IDirect3DVolume8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Container);
*ppContainer = This->Container;
+ IUnknown_AddRef(This->Container);
return D3D_OK;
}
HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DVOLUME_DESC* pDesc) {
@@ -113,8 +114,7 @@
TRACE("No box supplied - all is ok\n");
pLockedVolume->pBits = This->allocatedMemory;
} else {
- TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n", pBox, pBox->Left, pBox->Top,
- pBox->Right, pBox->Bottom, pBox->Front, pBox->Back);
+ TRACE("Lock Box (%p) = l %d, t %d, r %d, b %d, fr %d, ba %d\n", pBox, pBox->Left, pBox->Top, pBox->Right, pBox->Bottom, pBox->Front, pBox->Back);
pLockedVolume->pBits = This->allocatedMemory +
(pLockedVolume->SlicePitch * pBox->Front) + /* FIXME: is front < back or vica versa? */
(pLockedVolume->RowPitch * pBox->Top) +
@@ -122,16 +122,12 @@
}
TRACE("returning pBits=%p, rpitch=%d, spitch=%d\n", pLockedVolume->pBits, pLockedVolume->RowPitch, pLockedVolume->SlicePitch);
return D3D_OK;
-
-
-
- return D3D_OK;
}
HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) {
ICOM_THIS(IDirect3DVolume8Impl,iface);
TRACE("(%p) : stub\n", This);
if (This->Container) {
- IDirect3DVolumeTexture8 *cont = This->Container;
+ IDirect3DVolumeTexture8* cont = (IDirect3DVolumeTexture8*) This->Container;
int containerType = IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) cont);
if (containerType == D3DRTYPE_VOLUMETEXTURE) {
Index: volumetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v
retrieving revision 1.5
diff -u -r1.5 volumetexture.c
--- volumetexture.c 12 Apr 2003 00:06:43 -0000 1.5
+++ volumetexture.c 10 May 2003 16:23:59 -0000
@@ -62,7 +62,7 @@
TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
if (ref == 0) {
- for (i=0; i<This->levels; i++) {
+ for (i = 0; i < This->levels; i++) {
if (This->volumes[i] != NULL) {
TRACE("(%p) : Releasing volume %p\n", This, This->volumes[i]);
IDirect3DVolume8Impl_Release((LPDIRECT3DVOLUME8) This->volumes[i]);
More information about the wine-patches
mailing list