[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