[D3D] Small optimization in the Lock / Unlock code

Lionel Ulmer lionel.ulmer at free.fr
Mon May 19 10:35:03 CDT 2003


Changelog:
 - no need to flush the surface back if last lock was a RO lock
 
-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Mon May 19 17:33:09 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Mon May 19 17:32:24 2003
@@ -112,7 +112,7 @@
 
     TRACE("(%p, %ld)\n", gl_d3d_dev->display,(Drawable)drawable);
     ENTER_GL();
-    if (gl_d3d_dev->state == SURFACE_MEMORY) {
+    if (gl_d3d_dev->state == SURFACE_MEMORY_DIRTY) {
         d3d_dev->flush_to_framebuffer(d3d_dev, NULL);
     }
     gl_d3d_dev->state = SURFACE_GL;
@@ -1100,7 +1100,7 @@
     int num_active_stages = 0;
 
     ENTER_GL();
-    if (glThis->state == SURFACE_MEMORY) {
+    if (glThis->state == SURFACE_MEMORY_DIRTY) {
         This->flush_to_framebuffer(This, NULL);
     }
     LEAVE_GL();
@@ -2404,6 +2404,7 @@
 			       D3DVALUE dvZ,
 			       DWORD dwStencil)
 {
+    IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
     GLboolean ztest;
     GLfloat old_z_clear_value;
     GLbitfield bitfield = 0;
@@ -2435,6 +2436,13 @@
     
     /* Clears the screen */
     ENTER_GL();
+
+    if (glThis->state == SURFACE_MEMORY_DIRTY) {
+        /* TODO: optimize here the case where Clear changes all the screen... */
+        This->flush_to_framebuffer(This, NULL);
+    }
+    glThis->state = SURFACE_GL;
+
     if (dwFlags & D3DCLEAR_ZBUFFER) {
 	bitfield |= GL_DEPTH_BUFFER_BIT;
         glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
@@ -2713,8 +2721,8 @@
     /* Try to acquire the device critical section */
     EnterCriticalSection(&(d3d_dev->crit));
     
-    if (((is_front == TRUE)  && (gl_d3d_dev->front_state != SURFACE_MEMORY)) ||
-	((is_front == FALSE) && (gl_d3d_dev->state       != SURFACE_MEMORY))) {
+    if (((is_front == TRUE)  && (gl_d3d_dev->front_state == SURFACE_GL)) ||
+	((is_front == FALSE) && (gl_d3d_dev->state       == SURFACE_GL))) {
         /* If the surface is already in memory, no need to do anything here... */
         GLenum buffer_type;
 	GLenum buffer_color;
@@ -2964,6 +2972,7 @@
 {
     BOOLEAN is_front;
     IDirect3DDeviceImpl *d3d_dev = This->d3ddevice;
+    IDirect3DDeviceGLImpl* gl_d3d_dev = (IDirect3DDeviceGLImpl*) d3d_dev;
   
     if ((This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER|DDSCAPS_PRIMARYSURFACE)) != 0) {
         is_front = TRUE;
@@ -2974,15 +2983,18 @@
 	return;
     }
     /* First, check if we need to do anything. For the backbuffer, flushing is done at the next 3D activity. */
-    if (((This->lastlocktype & DDLOCK_READONLY) == 0) &&
-	(is_front == TRUE)) {
-        GLenum prev_draw;
-	ENTER_GL();
-	glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
-	glDrawBuffer(GL_FRONT);
-        d3d_dev->flush_to_framebuffer(d3d_dev, pRect);
-	glDrawBuffer(prev_draw);
-	LEAVE_GL();
+    if ((This->lastlocktype & DDLOCK_READONLY) == 0) {
+        if (is_front == TRUE) {
+	    GLenum prev_draw;
+	    ENTER_GL();
+	    glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
+	    glDrawBuffer(GL_FRONT);
+	    d3d_dev->flush_to_framebuffer(d3d_dev, pRect);
+	    glDrawBuffer(prev_draw);
+	    LEAVE_GL();
+	} else {
+	    gl_d3d_dev->state = SURFACE_MEMORY_DIRTY;
+	}
     }
 
     /* And 'frees' the device critical section */
--- dlls/ddraw_CVS/d3dexecutebuffer.c	Mon May 19 17:33:09 2003
+++ dlls/ddraw/d3dexecutebuffer.c	Mon May 19 17:04:55 2003
@@ -207,7 +207,7 @@
 
     ENTER_GL();
     
-    if (((IDirect3DDeviceGLImpl *) lpDevice)->state == SURFACE_MEMORY) {
+    if (((IDirect3DDeviceGLImpl *) lpDevice)->state == SURFACE_MEMORY_DIRTY) {
         lpDevice->flush_to_framebuffer(lpDevice, NULL);
     }
     ((IDirect3DDeviceGLImpl *) lpDevice)->state = SURFACE_GL;
--- dlls/ddraw_CVS/mesa_private.h	Mon May 19 17:33:09 2003
+++ dlls/ddraw/mesa_private.h	Mon May 19 17:03:01 2003
@@ -100,7 +100,8 @@
 
 typedef enum {
     SURFACE_GL,
-    SURFACE_MEMORY
+    SURFACE_MEMORY,
+    SURFACE_MEMORY_DIRTY
 } SURFACE_STATE;
 
 typedef struct IDirect3DDeviceGLImpl


More information about the wine-patches mailing list