Stefan Dösinger : ddraw: Some EnumZBufferFormat fixes.

Alexandre Julliard julliard at winehq.org
Thu Mar 27 07:22:42 CDT 2008


Module: wine
Branch: master
Commit: ee13cc4903285c764cd27e3a2650b3815d2eee3f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ee13cc4903285c764cd27e3a2650b3815d2eee3f

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Mar 21 23:33:37 2008 +0100

ddraw: Some EnumZBufferFormat fixes.

---

 dlls/ddraw/direct3d.c |   52 ++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
index 34e14d3..730fcf6 100644
--- a/dlls/ddraw/direct3d.c
+++ b/dlls/ddraw/direct3d.c
@@ -1132,6 +1132,7 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface,
     HRESULT hr;
     int i;
     WINED3DDISPLAYMODE d3ddm;
+    WINED3DDEVTYPE type;
 
     /* Order matters. Specifically, BattleZone II (full version) expects the
      * 16-bit depth formats to be listed before the 24 and 32 ones. */
@@ -1146,23 +1147,56 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface,
 
     TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context);
 
-    if(IWineD3D_GetAdapterDisplayMode(This->wineD3D, WINED3DADAPTER_DEFAULT, &d3ddm ) != WINED3D_OK) {
-        ERR("Unable to retrieve a default display mode for quering the z-buffer formats!\n");
-        return DDERR_INVALIDPARAMS;
-    }
-
     if(!Callback)
         return DDERR_INVALIDPARAMS;
 
+    if(IsEqualGUID(refiidDevice, &IID_IDirect3DHALDevice)    ||
+       IsEqualGUID(refiidDevice, &IID_IDirect3DTnLHalDevice) ||
+       IsEqualGUID(refiidDevice, &IID_D3DDEVICE_WineD3D))
+    {
+        TRACE("Asked for HAL device\n");
+        type = WINED3DDEVTYPE_HAL;
+    }
+    else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRGBDevice) ||
+            IsEqualGUID(refiidDevice, &IID_IDirect3DMMXDevice))
+    {
+        TRACE("Asked for SW device\n");
+        type = WINED3DDEVTYPE_SW;
+    }
+    else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRefDevice))
+    {
+        TRACE("Asked for REF device\n");
+        type = WINED3DDEVTYPE_REF;
+    }
+    else if(IsEqualGUID(refiidDevice, &IID_IDirect3DNullDevice))
+    {
+        TRACE("Asked for NULLREF device\n");
+        type = WINED3DDEVTYPE_NULLREF;
+    }
+    else
+    {
+        FIXME("Unexpected device GUID %s\n", debugstr_guid(refiidDevice));
+        type = WINED3DDEVTYPE_HAL;
+    }
+
     EnterCriticalSection(&ddraw_cs);
-    for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++)
+    /* We need an adapter format from somewhere to please wined3d and WGL. Use the current display mode.
+     * So far all cards offer the same depth stencil format for all modes, but if some do not and apps
+     * do not like that we'll have to find some workaround, like iterating over all imaginable formats
+     * and collecting all the depth stencil formats we can get
+     */
+    hr = IWineD3DDevice_GetDisplayMode(This->wineD3DDevice,
+                                       0 /* swapchain 0 */,
+                                       &d3ddm);
+
+    for(i = 0; i < (sizeof(FormatList) / sizeof(FormatList[0])); i++)
     {
         hr = IWineD3D_CheckDeviceFormat(This->wineD3D,
-                                        0 /* Adapter */,
-                                        0 /* DeviceType */,
+                                        WINED3DADAPTER_DEFAULT /* Adapter */,
+                                        type /* DeviceType */,
                                         d3ddm.Format /* AdapterFormat */,
                                         WINED3DUSAGE_DEPTHSTENCIL /* Usage */,
-                                        WINED3DRTYPE_SURFACE /* ResourceType */,
+                                        WINED3DRTYPE_SURFACE,
                                         FormatList[i]);
         if(hr == D3D_OK)
         {




More information about the wine-cvs mailing list