[D3D 68] Fix some dumb game (1/2)
Lionel Ulmer
lionel.ulmer at free.fr
Mon Dec 30 15:08:11 CST 2002
Changelog:
- added enumeration of the Reference device (some games seems to need
it to work and they want it enumerated first..)
- some comments about potential problems with Z masking
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c 2002-12-30 11:19:27.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c 2002-12-30 20:20:33.000000000 +0100
@@ -272,12 +272,22 @@
HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context)
{
D3DDEVICEDESC d1, d2;
-
+ HRESULT ret_value;
+
fill_opengl_caps(&d1);
d2 = d1;
+ TRACE(" enumerating OpenGL D3DDevice interface using reference IID (IID %s).\n", debugstr_guid(&IID_IDirect3DRefDevice));
+ ret_value = cb((LPIID) &IID_IDirect3DRefDevice, "WINE Reference Direct3DX using OpenGL", "direct3d", &d1, &d2, context);
+ if (ret_value != D3DENUMRET_OK)
+ return ret_value;
+
TRACE(" enumerating OpenGL D3DDevice interface (IID %s).\n", debugstr_guid(&IID_D3DDEVICE_OpenGL));
- return cb((LPIID) &IID_D3DDEVICE_OpenGL, "WINE Direct3DX using OpenGL", "direct3d", &d1, &d2, context);
+ ret_value = cb((LPIID) &IID_D3DDEVICE_OpenGL, "WINE Direct3DX using OpenGL", "direct3d", &d1, &d2, context);
+ if (ret_value != D3DENUMRET_OK)
+ return ret_value;
+
+ return D3DENUMRET_OK;
}
HRESULT d3ddevice_enumerate7(LPD3DENUMDEVICESCALLBACK7 cb, LPVOID context)
@@ -479,8 +489,9 @@
}
if (lpD3DDFS->dwFlags & D3DFDS_GUID) {
TRACE(" trying to match guid %s.\n", debugstr_guid(&(lpD3DDFS->guid)));
- if ((IsEqualGUID( &IID_D3DDEVICE_OpenGL, &(lpD3DDFS->guid)) == 0) &&
- (IsEqualGUID(&IID_IDirect3DHALDevice, &(lpD3DDFS->guid)) == 0)) {
+ if ((IsEqualGUID(&IID_D3DDEVICE_OpenGL, &(lpD3DDFS->guid)) == 0) &&
+ (IsEqualGUID(&IID_IDirect3DHALDevice, &(lpD3DDFS->guid)) == 0) &&
+ (IsEqualGUID(&IID_IDirect3DRefDevice, &(lpD3DDFS->guid)) == 0)) {
TRACE(" no match for this GUID.\n");
return DDERR_INVALIDPARAMS;
}
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c 2002-12-29 15:16:14.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c 2002-12-29 18:43:55.000000000 +0100
@@ -135,10 +135,18 @@
break;
case D3DRENDERSTATE_ZENABLE: /* 7 */
- if (dwRenderState)
+ /* To investigate : in OpenGL, if we disable the depth test, the Z buffer will NOT be
+ 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)
glEnable(GL_DEPTH_TEST);
- else
+ else if (dwRenderState == D3DZB_FALSE)
glDisable(GL_DEPTH_TEST);
+ else {
+ glEnable(GL_DEPTH_TEST);
+ WARN(" w-buffering not supported.\n");
+ }
break;
case D3DRENDERSTATE_FILLMODE: /* 8 */
--- /home/ulmer/Wine/wine_base//dlls/ddraw/direct3d/mesa.c 2002-12-29 09:28:51.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/direct3d/mesa.c 2002-12-30 20:21:51.000000000 +0100
@@ -131,7 +131,8 @@
if ((iid == NULL) ||
(IsEqualGUID(&IID_D3DDEVICE_OpenGL, iid)) ||
(IsEqualGUID(&IID_IDirect3DHALDevice, iid)) ||
- (IsEqualGUID(&IID_IDirect3DTnLHalDevice, iid))) {
+ (IsEqualGUID(&IID_IDirect3DTnLHalDevice, iid)) ||
+ (IsEqualGUID(&IID_IDirect3DRefDevice, iid))) {
switch (interface) {
case 1:
*obj = ICOM_INTERFACE(lpd3ddev, IDirect3DDevice);
More information about the wine-patches
mailing list