[D3D 50] Some hacks to please some games :-)

Lionel Ulmer lionel.ulmer at free.fr
Wed Dec 25 15:41:49 CST 2002


D3D50
Changelog:
 Added 'blt' and 'bltfast' override functions

PS: this is a bit hacky for now, but it will be fixed the day we
    'merge' both the TEXTURE and D3DDEVICE surface type in the current
    surface hierarchy instead of adding callbacks everywhere.

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c	2002-12-25 21:26:29.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c	2002-12-25 21:51:19.000000000 +0100
@@ -1685,14 +1685,16 @@
     
     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 > 0) {
+	    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) {
+    if (dwCount > 1) {
         WARN("  Warning, this function only for now clears the whole screen...\n");
     }
 
@@ -1745,6 +1747,29 @@
     return DD_OK;
 }
 
+HRESULT
+d3ddevice_blt(IDirectDrawSurfaceImpl *This, LPRECT rdst,
+	      LPDIRECTDRAWSURFACE7 src, LPRECT rsrc,
+	      DWORD dwFlags, LPDDBLTFX lpbltfx)
+{
+    if (dwFlags & DDBLT_COLORFILL) {
+        /* This is easy to handle for the D3D Device... */
+        TRACE(" executing D3D Device override.\n");
+        DWORD color = lpbltfx->u5.dwFillColor;
+	d3ddevice_clear(This->d3ddevice, 0, NULL, D3DCLEAR_TARGET, color, 0.0, 0x00000000);
+	return DD_OK;
+    }
+    return DDERR_INVALIDPARAMS;
+}
+
+HRESULT
+d3ddevice_bltfast(IDirectDrawSurfaceImpl *This, DWORD dstx,
+		  DWORD dsty, LPDIRECTDRAWSURFACE7 src,
+		  LPRECT rsrc, DWORD trans)
+{
+     return DDERR_INVALIDPARAMS;
+}
+
 
 /* TODO for both these functions :
     - change / restore OpenGL parameters for pictures transfers in case they are ever modified
@@ -1916,6 +1945,9 @@
 	    /* Override the Lock / Unlock function for all these surfaces */
 	    surf->lock_update = d3ddevice_lock_update;
 	    surf->unlock_update = d3ddevice_unlock_update;
+	    /* And install also the blt / bltfast overrides */
+	    surf->aux_blt = d3ddevice_blt;
+	    surf->aux_bltfast = d3ddevice_bltfast;
 	}
 	surf->d3ddevice = object;
     }
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dtexture.c	2002-12-25 17:25:28.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dtexture.c	2002-12-25 21:37:46.000000000 +0100
@@ -60,7 +60,7 @@
 /*******************************************************************************
  *			   IDirectSurface callback methods
  */
-HRESULT WINAPI gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey )
+HRESULT gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey )
 {
     DDSURFACEDESC *tex_d;
     GLuint current_texture;
@@ -689,7 +689,7 @@
 	surf->lock_update = gltex_lock_update;
 	surf->unlock_update = gltex_unlock_update;
 	surf->tex_private = private;
-	surf->SetColorKey_cb = gltex_setcolorkey_cb;
+	surf->aux_setcolorkey_cb = gltex_setcolorkey_cb;
 	
 	ENTER_GL();
 	if (surf->mipmap_level == 0) {
--- /home/ulmer/Wine/wine_base//dlls/ddraw/ddraw_private.h	2002-12-24 15:48:07.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/ddraw_private.h	2002-12-25 21:35:03.000000000 +0100
@@ -294,7 +294,9 @@
     void (*aux_release)(LPVOID ctx, LPVOID data);
     BOOL (*aux_flip)(LPVOID ctx, LPVOID data);
     void (*aux_unlock)(LPVOID ctx, LPVOID data, LPRECT lpRect);
-    HRESULT (WINAPI *SetColorKey_cb)(struct IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) ;
+    HRESULT (*aux_blt)(struct IDirectDrawSurfaceImpl *This, LPRECT rdst, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx);
+    HRESULT (*aux_bltfast)(struct IDirectDrawSurfaceImpl *This, DWORD dstx, DWORD dsty, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD trans);
+    HRESULT (*aux_setcolorkey_cb)(struct IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey );
     /* This is to get the D3DDevice object associated to this surface */
     struct IDirect3DDeviceImpl *d3ddevice;
     /* This is for texture */
--- /home/ulmer/Wine/wine_base//dlls/ddraw/dsurface/dib.c	2002-12-22 15:09:19.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/dsurface/dib.c	2002-12-25 21:37:16.000000000 +0100
@@ -365,6 +365,11 @@
 	}
     }
 
+    /* First, check if the possible override function handles this case */
+    if (This->aux_blt != NULL) {
+        if (This->aux_blt(This, rdst, src, rsrc, dwFlags, lpbltfx) == DD_OK) return DD_OK;
+    }
+
     DD_STRUCT_INIT(&ddesc);
     DD_STRUCT_INIT(&sdesc);
 
@@ -814,6 +819,11 @@
 	  FIXME(" srcrect: NULL\n");
     }
 
+    /* First, check if the possible override function handles this case */
+    if (This->aux_bltfast != NULL) {
+        if (This->aux_bltfast(This, dstx, dsty, src, rsrc, trans) == DD_OK) return DD_OK;
+    }
+
     /* We need to lock the surfaces, or we won't get refreshes when done. */
     sdesc.dwSize = sizeof(sdesc);
     IDirectDrawSurface7_Lock(src, NULL,&sdesc,DDLOCK_READONLY, 0);


More information about the wine-patches mailing list