[D3D 40] Improvements of the Clear method

Lionel Ulmer lionel.ulmer at free.fr
Mon Dec 23 12:26:18 CST 2002


Changelog:
 - factorize Clear method between Viewport and Device
 - some more rendering states handled

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/main.c	2002-12-23 18:33:13.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/main.c	2002-12-23 18:32:36.000000000 +0100
@@ -191,8 +191,8 @@
                                  DWORD dwStencil)
 {
     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
-    FIXME("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
-    return DD_OK;
+    TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
+    return This->clear(This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
 }
 
 HRESULT WINAPI
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2002-12-23 18:33:15.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2002-12-23 18:21:34.000000000 +0100
@@ -1575,6 +1575,83 @@
 #undef XCAST
 #endif
 
+static HRESULT d3ddevice_clear(IDirect3DDeviceImpl *This,
+			       DWORD dwCount,
+			       LPD3DRECT lpRects,
+			       DWORD dwFlags,
+			       DWORD dwColor,
+			       D3DVALUE dvZ,
+			       DWORD dwStencil)
+{
+    GLboolean ztest;
+    GLfloat old_z_clear_value;
+    GLbitfield bitfield = 0;
+    GLint old_stencil_clear_value;
+    GLfloat old_color_clear_value[4];
+    
+    TRACE("(%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
+    if (TRACE_ON(ddraw)) {
+        int i;
+	TRACE(" rectangles : \n");
+	for (i = 0; i < dwCount; i++) {
+	    TRACE("  - %ld x %ld     %ld x %ld\n", lpRects[i].u1.x1, lpRects[i].u2.y1, lpRects[i].u3.x2, lpRects[i].u4.y2);
+	}
+    }
+
+    if (dwCount != 1) {
+        WARN("  Warning, this function only for now clears the whole screen...\n");
+    }
+
+    /* Clears the screen */
+    ENTER_GL();
+    if (dwFlags & D3DCLEAR_ZBUFFER) {
+	bitfield |= GL_DEPTH_BUFFER_BIT;
+        glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
+	glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
+	glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
+	glClearDepth(dvZ);
+	TRACE(" depth value : %f\n", dvZ);
+    }
+    if (dwFlags & D3DCLEAR_STENCIL) {
+        bitfield |= GL_STENCIL_BUFFER_BIT;
+	glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
+	glClearStencil(dwStencil);
+	TRACE(" stencil value : %ld\n", dwStencil);
+    }    
+    if (dwFlags & D3DCLEAR_TARGET) {
+        bitfield |= GL_COLOR_BUFFER_BIT;
+	glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
+	glClearColor(((dwColor >> 16) & 0xFF) / 255.0,
+		     ((dwColor >>  8) & 0xFF) / 255.0,
+		     ((dwColor >>  0) & 0xFF) / 255.0,
+		     ((dwColor >> 24) & 0xFF) / 255.0);
+	TRACE(" color value (ARGB) : %08lx\n", dwColor);
+    }
+    
+    glClear(bitfield);
+    
+    if (dwFlags & D3DCLEAR_ZBUFFER) {
+        glDepthMask(ztest);
+	glClearDepth(old_z_clear_value);
+    }
+     if (dwFlags & D3DCLEAR_STENCIL) {
+        bitfield |= GL_STENCIL_BUFFER_BIT;
+	glClearStencil(old_stencil_clear_value);
+    }    
+    if (dwFlags & D3DCLEAR_TARGET) {
+        bitfield |= GL_COLOR_BUFFER_BIT;
+	glClearColor(old_color_clear_value[0],
+		     old_color_clear_value[1],
+		     old_color_clear_value[2],
+		     old_color_clear_value[3]);
+    }
+    
+    LEAVE_GL();
+    
+    return DD_OK;
+}
+
+
 /* TODO for both these functions :
     - change / restore OpenGL parameters for pictures transfers in case they are ever modified
       by other OpenGL code in D3D
@@ -1689,6 +1770,7 @@
     object->d3d = d3d;
     object->surface = surface;
     object->set_context = set_context;
+    object->clear = d3ddevice_clear;
 
     TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
 
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3d_private.h	2002-12-23 18:33:17.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3d_private.h	2002-12-23 18:16:52.000000000 +0100
@@ -175,6 +175,13 @@
     IDirectDrawSurfaceImpl *current_texture[MAX_TEXTURES];
 
     void (*set_context)(IDirect3DDeviceImpl*);
+    HRESULT (*clear)(IDirect3DDeviceImpl *This,
+		     DWORD dwCount,
+		     LPD3DRECT lpRects,
+		     DWORD dwFlags,
+		     DWORD dwColor,
+		     D3DVALUE dvZ,
+		     DWORD dwStencil);
 };
 
 /*****************************************************************************
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dviewport.c	2002-12-23 18:33:18.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dviewport.c	2002-12-23 18:24:45.000000000 +0100
@@ -233,8 +233,12 @@
                                        DWORD dwFlags)
 {
     ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
-    FIXME("(%p/%p)->(%08lx,%p,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags);
-    return DD_OK;
+    TRACE("(%p/%p)->(%08lx,%p,%08lx)\n", This, iface, dwCount, lpRects, dwFlags);
+    if (This->active_device == NULL) {
+        ERR(" Trying to clear a viewport not attached to a device !\n");
+	return D3DERR_VIEWPORTHASNODEVICE;
+    }
+    return This->active_device->clear(This->active_device, dwCount, lpRects, dwFlags, 0x00000000, 0.0, 0x00000000);
 }
 
 HRESULT WINAPI
@@ -362,106 +366,12 @@
                                     DWORD dwStencil)
 {
     ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
-    FIXME("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
-    return DD_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DViewportImpl_3_2_1_Clear(LPDIRECT3DVIEWPORT3 iface,
-                                       DWORD dwCount,
-                                       LPD3DRECT lpRects,
-                                       DWORD dwFlags)
-{
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
-    GLboolean ztest;
-    
-    TRACE("(%p/%p)->(%08lx,%p,%08lx)\n", This, iface, dwCount, lpRects, dwFlags);
-
-    if (dwCount != 1) {
-        WARN("  Warning, this function only for now clears the whole screen...\n");
-    }
-    
-    /* Clears the screen */
-    ENTER_GL();
-    glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
-    glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
-    glClear(((dwFlags & D3DCLEAR_TARGET) ? GL_COLOR_BUFFER_BIT : 0) |
-	    ((dwFlags & D3DCLEAR_ZBUFFER) ? GL_DEPTH_BUFFER_BIT : 0));
-    glDepthMask(ztest);
-    LEAVE_GL();
-    
-    return DD_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DViewportImpl_3_Clear2(LPDIRECT3DVIEWPORT3 iface,
-                                    DWORD dwCount,
-                                    LPD3DRECT lpRects,
-                                    DWORD dwFlags,
-                                    DWORD dwColor,
-                                    D3DVALUE dvZ,
-                                    DWORD dwStencil)
-{
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
-    GLboolean ztest;
-    GLfloat old_z_clear_value;
-    GLbitfield bitfield = 0;
-    GLint old_stencil_clear_value;
-    GLfloat old_color_clear_value[4];
-    
     TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
-
-    if (dwCount != 1) {
-        WARN("  Warning, this function only for now clears the whole screen...\n");
+    if (This->active_device == NULL) {
+        ERR(" Trying to clear a viewport not attached to a device !\n");
+	return D3DERR_VIEWPORTHASNODEVICE;
     }
-
-    /* Clears the screen */
-    ENTER_GL();
-    if (dwFlags & D3DCLEAR_ZBUFFER) {
-        glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
-	glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
-	glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
-	glClearDepth(dvZ);
-	TRACE(" Depth value : %f\n", dvZ);
-	bitfield |= GL_DEPTH_BUFFER_BIT;
-    }
-    if (dwFlags & D3DCLEAR_STENCIL) {
-        bitfield |= GL_STENCIL_BUFFER_BIT;
-	glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
-	glClearStencil(dwStencil);
-	TRACE(" Stencil value : %ld\n", dwStencil);
-    }    
-    if (dwFlags & D3DCLEAR_TARGET) {
-        bitfield |= GL_COLOR_BUFFER_BIT;
-	glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
-	glClearColor(((dwColor >> 16) & 0xFF) / 255.0,
-		     ((dwColor >>  8) & 0xFF) / 255.0,
-		     ((dwColor >>  0) & 0xFF) / 255.0,
-		     ((dwColor >> 24) & 0xFF) / 255.0);
-	TRACE("Color value (ARGB) : %08lx\n", dwColor);
-    }
-    
-    glClear(bitfield);
-    
-    if (dwFlags & D3DCLEAR_ZBUFFER) {
-        glDepthMask(ztest);
-	glClearDepth(old_z_clear_value);
-    }
-     if (dwFlags & D3DCLEAR_STENCIL) {
-        bitfield |= GL_STENCIL_BUFFER_BIT;
-	glClearStencil(old_stencil_clear_value);
-    }    
-    if (dwFlags & D3DCLEAR_TARGET) {
-        bitfield |= GL_COLOR_BUFFER_BIT;
-	glClearColor(old_color_clear_value[0],
-		     old_color_clear_value[1],
-		     old_color_clear_value[2],
-		     old_color_clear_value[3]);
-    }
-    
-    LEAVE_GL();
-    
-    return DD_OK;
+    return This->active_device->clear(This->active_device, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
 }
 
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
@@ -485,7 +395,7 @@
     XCAST(GetBackground) Main_IDirect3DViewportImpl_3_2_1_GetBackground,
     XCAST(SetBackgroundDepth) Main_IDirect3DViewportImpl_3_2_1_SetBackgroundDepth,
     XCAST(GetBackgroundDepth) Main_IDirect3DViewportImpl_3_2_1_GetBackgroundDepth,
-    XCAST(Clear) GL_IDirect3DViewportImpl_3_2_1_Clear,
+    XCAST(Clear) Main_IDirect3DViewportImpl_3_2_1_Clear,
     XCAST(AddLight) Main_IDirect3DViewportImpl_3_2_1_AddLight,
     XCAST(DeleteLight) Main_IDirect3DViewportImpl_3_2_1_DeleteLight,
     XCAST(NextLight) Main_IDirect3DViewportImpl_3_2_1_NextLight,
@@ -493,7 +403,7 @@
     XCAST(SetViewport2) Main_IDirect3DViewportImpl_3_2_SetViewport2,
     XCAST(SetBackgroundDepth2) Main_IDirect3DViewportImpl_3_SetBackgroundDepth2,
     XCAST(GetBackgroundDepth2) Main_IDirect3DViewportImpl_3_GetBackgroundDepth2,
-    XCAST(Clear2) GL_IDirect3DViewportImpl_3_Clear2,
+    XCAST(Clear2) Main_IDirect3DViewportImpl_3_Clear2,
 };
 
 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c	2002-12-23 18:33:20.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c	2002-12-23 17:46:39.000000000 +0100
@@ -297,6 +297,11 @@
 	        /* We do not support this anyway, so why protest :-) */
 	        break;
 
+ 	    case D3DRENDERSTATE_STIPPLEDALPHA: /* 33 */
+	        if (dwRenderState)
+		    ERR(" Stippled Alpha not supported yet.\n");
+		break;
+
 	    case D3DRENDERSTATE_FOGCOLOR: { /* 34 */
 	        GLint color[4];
 		color[0] = (dwRenderState >> 16) & 0xFF;
@@ -331,6 +336,15 @@
 	    case D3DRENDERSTATE_FLUSHBATCH:         /* 50 */
 	        break;
 
+	    case D3DRENDERSTATE_LIGHTING:    /* 137 */
+	        /* There will be more to do here once we really support D3D7 Lighting.
+		   Should be enough for now to prevent warnings :-) */
+	        if (dwRenderState)
+		    glEnable(GL_LIGHTING);
+		else
+		    glDisable(GL_LIGHTING);
+	        break;
+
 	    default:
 	        ERR("Unhandled dwRenderStateType %s (%08x) !\n", _get_renderstate(dwRenderStateType), dwRenderStateType);
 	}


More information about the wine-patches mailing list