[D3D] Some bug fixes and optimizations.

Lionel Ulmer lionel.ulmer at free.fr
Sun Jun 15 11:47:20 CDT 2003


Changelog:
 - fix some regressions
 - GetDC does not lock in ReadOnly mode as it leads to problems with
   some D3D optimizations
 - added a fast Back => Front / Front => Back Blt fast path
      
-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Sun Jun 15 02:09:27 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Sun Jun 15 18:37:35 2003
@@ -2684,6 +2684,83 @@
         LEAVE_GL();
         
         return DD_OK;
+    } else if ((dwFlags & (~(DDBLT_WAIT|DDBLT_ASYNC))) == 0) {
+	/* Normal blit without any special case... */
+	if (src != NULL) {
+	    /* And which has a SRC surface */
+	    IDirectDrawSurfaceImpl *src_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, src);
+	    if ((src_impl->surface_desc.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) &&
+		(src_impl->d3ddevice == This->d3ddevice)) {
+		/* Both are 3D devices and using the same GL device */
+		D3DRECT src_rect;
+		int width, height;
+		GLenum prev_draw;
+		WINE_GL_BUFFER_TYPE src_buffer_type;
+		IDirect3DDeviceGLImpl *gl_d3d_dev = (IDirect3DDeviceGLImpl *) This->d3ddevice;
+		
+		if (rsrc) {
+		    src_rect.u1.x1 = rsrc->left;
+		    src_rect.u2.y1 = rsrc->top;
+		    src_rect.u3.x2 = rsrc->right;
+		    src_rect.u4.y2 = rsrc->bottom;
+		} else {
+		    src_rect.u1.x1 = 0;
+		    src_rect.u2.y1 = 0;
+		    src_rect.u3.x2 = src_impl->surface_desc.dwWidth;
+		    src_rect.u4.y2 = src_impl->surface_desc.dwHeight;
+		}
+
+		width = src_rect.u3.x2 - src_rect.u1.x1;
+		height = src_rect.u4.y2 - src_rect.u2.y1;
+
+		if ((width != (src_rect.u3.x2 - src_rect.u1.x1)) ||
+		    (height != (src_rect.u4.y2 - src_rect.u2.y1))) {
+		    TRACE(" buffer to buffer copy not supported with stretching yet !\n");
+		    return DDERR_INVALIDPARAMS;
+		}
+
+		/* First check if we BLT from the backbuffer... */
+		if ((src_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_BACKBUFFER)) != 0) {
+		    src_buffer_type = WINE_GL_BUFFER_BACK;
+		} else if ((src_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER|DDSCAPS_PRIMARYSURFACE)) != 0) {
+		    src_buffer_type = WINE_GL_BUFFER_FRONT;
+		} else {
+		    ERR("Unexpected case in direct buffer to buffer copy !\n");
+		    return DDERR_INVALIDPARAMS;
+		}
+		
+		TRACE(" using direct buffer to buffer copy.\n");
+
+		ENTER_GL();
+		
+		glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
+		if (buffer_type == WINE_GL_BUFFER_FRONT)
+		    glDrawBuffer(GL_FRONT);
+		else
+		    glDrawBuffer(GL_BACK);
+
+		if (src_buffer_type == WINE_GL_BUFFER_FRONT)
+		    glReadBuffer(GL_FRONT);
+		else
+		    glReadBuffer(GL_BACK);
+		
+		/* Set orthographic projection to prevent bad things happening with the glRasterPos call */
+		if (gl_d3d_dev->transform_state != GL_TRANSFORM_ORTHO) {
+		    gl_d3d_dev->transform_state = GL_TRANSFORM_ORTHO;
+		    d3ddevice_set_ortho(This->d3ddevice);
+		}
+
+		glRasterPos3d(rect.u1.x1, rect.u2.y1, 0.5);
+		glCopyPixels(src_rect.u1.x1, src_impl->surface_desc.dwHeight - rect.u4.y2,
+			     width, height, GL_COLOR);
+		
+		if (((buffer_type == WINE_GL_BUFFER_FRONT) && (prev_draw == GL_BACK)) ||
+		    ((buffer_type == WINE_GL_BUFFER_BACK)  && (prev_draw == GL_FRONT)))
+		    glDrawBuffer(prev_draw);
+		
+		LEAVE_GL();
+	    }
+	}
     }
     return DDERR_INVALIDPARAMS;
 }
--- dlls/ddraw_CVS/dsurface/main.c	Sat Jun 14 00:41:02 2003
+++ dlls/ddraw/dsurface/main.c	Sun Jun 15 15:52:17 2003
@@ -794,7 +794,7 @@
      * Strange: Lock lists DDERR_SURFACEBUSY as an error, meaning that another
      * thread has it locked, but GetDC does not. */
     ddsd.dwSize = sizeof(ddsd);
-    hr = IDirectDrawSurface7_Lock(iface, NULL, &ddsd, DDLOCK_READONLY, 0);
+    hr = IDirectDrawSurface7_Lock(iface, NULL, &ddsd, 0, 0);
     if (FAILED(hr))
     {
 	UNLOCK_OBJECT(This);
--- dlls/ddraw_CVS/gl_api.h	Thu Jun  5 01:10:38 2003
+++ dlls/ddraw/gl_api.h	Sun Jun 15 18:38:52 2003
@@ -39,6 +39,7 @@
 GL_API_FUNCTION(glColor3ub)
 GL_API_FUNCTION(glColor4ub)
 GL_API_FUNCTION(glColorMaterial)
+GL_API_FUNCTION(glCopyPixels)
 GL_API_FUNCTION(glCopyTexSubImage2D)
 GL_API_FUNCTION(glCullFace)
 GL_API_FUNCTION(glDeleteTextures)
@@ -79,7 +80,7 @@
 GL_API_FUNCTION(glPolygonOffset)
 GL_API_FUNCTION(glPopMatrix)
 GL_API_FUNCTION(glPushMatrix)
-GL_API_FUNCTION(glRasterPos2f)
+GL_API_FUNCTION(glRasterPos3d)
 GL_API_FUNCTION(glReadBuffer)
 GL_API_FUNCTION(glReadPixels)
 GL_API_FUNCTION(glScissor)
--- dlls/ddraw_CVS/gl_private.h	Thu Jun  5 01:10:38 2003
+++ dlls/ddraw/gl_private.h	Sun Jun 15 18:39:24 2003
@@ -63,6 +63,7 @@
 #define glColor3f pglColor3f
 #define glColor3ub pglColor3ub
 #define glColor4ub pglColor4ub
+#define glCopyPixels pglCopyPixels
 #define glCopyTexSubImage2D pglCopyTexSubImage2D
 #define glColorMaterial pglColorMaterial
 #define glCullFace pglCullFace
@@ -104,7 +105,7 @@
 #define glPolygonOffset pglPolygonOffset
 #define glPopMatrix pglPopMatrix
 #define glPushMatrix pglPushMatrix
-#define glRasterPos2f pglRasterPos2f
+#define glRasterPos3d pglRasterPos3d
 #define glReadBuffer pglReadBuffer
 #define glReadPixels pglReadPixels
 #define glScissor pglScissor
--- dlls/ddraw_CVS/mesa.c	Sun Jun 15 02:09:27 2003
+++ dlls/ddraw/mesa.c	Sun Jun 15 15:49:30 2003
@@ -147,15 +147,21 @@
 		   updated either.. No idea about what happens in D3D.
 		   
 		   Maybe replacing the Z function by ALWAYS would be a better idea. */
-	        if ((dwRenderState == D3DZB_TRUE) && (glThis->depth_test == FALSE)) {
-		    glEnable(GL_DEPTH_TEST);
-		    glThis->depth_test = TRUE;
-		} else if ((dwRenderState == D3DZB_FALSE) && (glThis->depth_test == TRUE)) {
-		    glDisable(GL_DEPTH_TEST);
-		    glThis->depth_test = FALSE;
-		} else if (glThis->depth_test == FALSE) {
-		    glEnable(GL_DEPTH_TEST);
-		    glThis->depth_test = TRUE;
+	        if (dwRenderState == D3DZB_TRUE) {
+		    if (glThis->depth_test == FALSE) {
+			glEnable(GL_DEPTH_TEST);
+			glThis->depth_test = TRUE;
+		    }
+		} else if (dwRenderState == D3DZB_FALSE) {
+		    if (glThis->depth_test == TRUE) {
+			glDisable(GL_DEPTH_TEST);
+			glThis->depth_test = FALSE;
+		    }
+		} else {
+		    if (glThis->depth_test == FALSE) {
+			glEnable(GL_DEPTH_TEST);
+			glThis->depth_test = TRUE;
+		    }
 		    WARN(" w-buffering not supported.\n");
 		}
 	        break;


More information about the wine-patches mailing list