[D3D8] Some rendering target fixes
Christian Costa
titan.costa at wanadoo.fr
Sat May 1 05:44:10 CDT 2004
Hi,
Here are some fixes for rendering targets from Jason and I.
Changelog:
Fixes for rendering targets.
Jason Edmeades us at the-edmeades.demon.co.uk
Christian Costa titan.costa at wanadoo.fr
-------------- next part --------------
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.106
diff -u -r1.106 device.c
--- device.c 29 Apr 2004 00:20:18 -0000 1.106
+++ device.c 1 May 2004 08:32:30 -0000
@@ -1,7 +1,8 @@
/*
* IDirect3DDevice8 implementation
*
- * Copyright 2002 Jason Edmeades
+ * Copyright 2002-2004 Jason Edmeades
+ * Copyright 2004 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1169,7 +1170,7 @@
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : see if behavior correct\n", This);
+ FIXME("(%p) : Should return whole screen, only returns GL context window in top left corner\n", This);
if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
ERR("(%p) : surface(%p) have a invalid format\n", This, pDestSurface);
@@ -1204,7 +1205,6 @@
{
long j;
for (j = 0; j < This->PresentParms.BackBufferHeight; ++j) {
- /*memcpy(lockedRect.pBits + (j * lockedRect.Pitch), This->frontBuffer->allocatedMemory + (j * i), i);*/
glReadPixels(0, This->PresentParms.BackBufferHeight - j - 1, This->PresentParms.BackBufferWidth, 1,
GL_BGRA, GL_UNSIGNED_BYTE, ((char*) lockedRect.pBits) + (j * lockedRect.Pitch));
vcheckGLcall("glReadPixels");
@@ -1261,7 +1261,7 @@
HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- TRACE("(%p)->(%p) default(%p)\n", This, This->renderTarget, This->frontBuffer);
+ TRACE("(%p)->returning (%p) default is backbuffer=(%p)\n", This, This->renderTarget, This->backBuffer);
*ppRenderTarget = (LPDIRECT3DSURFACE8) This->renderTarget;
IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget);
@@ -1303,12 +1303,12 @@
getchar();
#endif
- if (This->frontBuffer != This->renderTarget) {
+ if ((This->frontBuffer != This->renderTarget) && (This->backBuffer != This->renderTarget)) {
#if 0
GLenum prev_read;
glGetIntegerv(GL_READ_BUFFER, &prev_read);
vcheckGLcall("glIntegerv");
- glReadBuffer(GL_BACK);
+ glReadBuffer(GL_FRONT);
vcheckGLcall("glReadBuffer");
{
long j;
@@ -1413,14 +1413,14 @@
/* Note gl uses lower left, width/height */
TRACE("(%p) %p Rect=(%ld,%ld)->(%ld,%ld) glRect=(%ld,%ld), len=%ld, hei=%ld\n", This, curRect,
curRect->x1, curRect->y1, curRect->x2, curRect->y2,
- curRect->x1, (This->PresentParms.BackBufferHeight - curRect->y2),
+ curRect->x1, (This->renderTarget->myDesc.Height - curRect->y2),
curRect->x2 - curRect->x1, curRect->y2 - curRect->y1);
- glScissor(curRect->x1, (This->PresentParms.BackBufferHeight - curRect->y2),
+ glScissor(curRect->x1, (This->renderTarget->myDesc.Height - curRect->y2),
curRect->x2 - curRect->x1, curRect->y2 - curRect->y1);
checkGLcall("glScissor");
} else {
glScissor(This->StateBlock->viewport.X,
- (This->PresentParms.BackBufferHeight - (This->StateBlock->viewport.Y + This->StateBlock->viewport.Height)),
+ (This->renderTarget->myDesc.Height - (This->StateBlock->viewport.Y + This->StateBlock->viewport.Height)),
This->StateBlock->viewport.Width,
This->StateBlock->viewport.Height);
checkGLcall("glScissor");
@@ -4614,7 +4614,7 @@
{
DWORD value;
/* The surface must be rendered upside down to cancel the flip produce by glCopyTexImage */
- This->renderUpsideDown = This->renderTarget != This->frontBuffer;
+ This->renderUpsideDown = (This->renderTarget != This->frontBuffer) && (This->renderTarget != This->backBuffer);
/* Force updating the cull mode */
IDirect3DDevice8_GetRenderState(iface, D3DRS_CULLMODE, &value);
IDirect3DDevice8_SetRenderState(iface, D3DRS_CULLMODE, value);
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.66
diff -u -r1.66 directx.c
--- directx.c 29 Apr 2004 00:20:18 -0000 1.66
+++ directx.c 1 May 2004 08:32:33 -0000
@@ -441,6 +441,8 @@
case D3DFMT_L6V5U5:
/*case D3DFMT_V8U8:*/
case D3DFMT_L8:
+ case D3DFMT_P8:
+ case D3DFMT_A8P8:
/* Since we do not support these formats right now, don't pretend to. */
return D3DERR_NOTAVAILABLE;
default:
@@ -1269,7 +1271,7 @@
/* init the default renderTarget management */
object->drawable = object->win;
object->render_ctx = object->glCtx;
- object->renderTarget = object->frontBuffer;
+ object->renderTarget = object->backBuffer;
IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) object->renderTarget);
object->stencilBufferTarget = object->depthStencilBuffer;
if (NULL != object->stencilBufferTarget) {
@@ -1330,6 +1332,10 @@
object->last_was_rhw = 0;
glGetIntegerv(GL_MAX_LIGHTS, &object->maxConcurrentLights);
TRACE("(%p,%d) All defaults now set up, leaving CreateDevice with %p\n", This, Adapter, object);
+
+ /* Clear the screen */
+ IDirect3DDevice8Impl_Clear((LPDIRECT3DDEVICE8) object, 0, NULL, D3DCLEAR_STENCIL|D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET, 0x00, 1.0, 0);
+
return D3D_OK;
}
Index: drawprim.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/drawprim.c,v
retrieving revision 1.19
diff -u -r1.19 drawprim.c
--- drawprim.c 29 Apr 2004 00:20:18 -0000 1.19
+++ drawprim.c 1 May 2004 08:32:37 -0000
@@ -1605,11 +1605,11 @@
if (isDumpingFrames == TRUE) {
D3DLOCKED_RECT r;
char buffer[80];
- IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->backBuffer, &r, NULL, D3DLOCK_READONLY);
+ IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->renderTarget, &r, NULL, D3DLOCK_READONLY);
sprintf(buffer, "/tmp/backbuffer_%ld.ppm", primCounter);
TRACE("Saving screenshot %s\n", buffer);
- IDirect3DSurface8Impl_SaveSnapshot((LPDIRECT3DSURFACE8) This->backBuffer, buffer);
- IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) This->backBuffer);
+ IDirect3DSurface8Impl_SaveSnapshot((LPDIRECT3DSURFACE8) This->renderTarget, buffer);
+ IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) This->renderTarget);
#if defined(SHOW_TEXTURE_MAKEUP)
{
Index: surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.33
diff -u -r1.33 surface.c
--- surface.c 29 Apr 2004 00:20:18 -0000 1.33
+++ surface.c 1 May 2004 08:32:39 -0000
@@ -1,8 +1,9 @@
/*
* IDirect3DSurface8 implementation
*
- * Copyright 2002-2003 Jason Edmeades
- * Raphael Junqueira
+ * Copyright 2002-2004 Jason Edmeades
+ * Copyright 2002-2003 Raphael Junqueira
+ * Copyright 2004 Christian Costa
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -193,7 +194,7 @@
/* Nothing to do ;) */
- } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */
+ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage && !(Flags&D3DLOCK_DISCARD)) { /* render surfaces */
if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer) {
GLint prev_store;
@@ -293,18 +294,19 @@
return D3DERR_INVALIDCALL;
}
- if (This == This->Device->backBuffer || This == This->Device->frontBuffer || This->Device->depthStencilBuffer) {
+ if (This == This->Device->backBuffer || This == This->Device->frontBuffer || This->Device->depthStencilBuffer || This == This->Device->renderTarget) {
if (This == This->Device->backBuffer) {
TRACE("(%p, backBuffer) : dirtyfied(%d)\n", This, This->Dirty);
} else if (This == This->Device->frontBuffer) {
TRACE("(%p, frontBuffer) : dirtyfied(%d)\n", This, This->Dirty);
} else if (This == This->Device->depthStencilBuffer) {
TRACE("(%p, stencilBuffer) : dirtyfied(%d)\n", This, This->Dirty);
+ } else if (This == This->Device->renderTarget) {
+ TRACE("(%p, renderTarget) : dirtyfied(%d)\n", This, This->Dirty);
}
} else {
TRACE("(%p) : dirtyfied(%d)\n", This, This->Dirty);
}
- /*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);
@@ -318,7 +320,7 @@
*/
} 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 || This == This->Device->renderTarget) {
GLint prev_store;
GLenum prev_draw;
GLint prev_rasterpos[4];
@@ -376,7 +378,7 @@
if (This == This->Device->backBuffer) {
glDrawBuffer(GL_BACK);
- } else if (This == This->Device->frontBuffer) {
+ } else if (This == This->Device->frontBuffer || This == This->Device->renderTarget) {
glDrawBuffer(GL_FRONT);
}
vcheckGLcall("glDrawBuffer");
More information about the wine-patches
mailing list