Stefan Dösinger : wined3d: Find possible fbconfis on dll load time, use them in CheckDepthStencilMatch.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 11 08:46:24 CDT 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Fri Jun  8 14:16:37 2007 +0200

wined3d: Find possible fbconfis on dll load time, use them in CheckDepthStencilMatch.

---

 dlls/wined3d/directx.c         |   48 ++++++++++++++++-----------------------
 dlls/wined3d/wined3d_private.h |    2 +
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8d15f7e..07e0dbe 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1469,9 +1469,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
                                                    WINED3DFORMAT RenderTargetFormat,
                                                    WINED3DFORMAT DepthStencilFormat) {
     IWineD3DImpl *This = (IWineD3DImpl *)iface;
-    HRESULT hr = WINED3DERR_NOTAVAILABLE;
-    GLXFBConfig* cfgs = NULL;
-    int nCfgs = 0;
     int it;
 
     WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n",
@@ -1486,34 +1483,17 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
         return WINED3DERR_INVALIDCALL;
     }
 
-    /* TODO: Store an array in the adapter */
-    if(WineD3D_CreateFakeGLContext())
-        cfgs = glXGetFBConfigs(wined3d_fake_gl_context_display, DefaultScreen(wined3d_fake_gl_context_display), &nCfgs);
-
-    if (cfgs) {
-        for (it = 0; it < nCfgs; ++it) {
-            if (IWineD3DImpl_IsGLXFBConfigCompatibleWithRenderFmt(wined3d_fake_gl_context_display, cfgs[it], RenderTargetFormat)) {
-                if (IWineD3DImpl_IsGLXFBConfigCompatibleWithDepthFmt(wined3d_fake_gl_context_display, cfgs[it], DepthStencilFormat)) {
-                    hr = WINED3D_OK;
-                    break ;
-                }
+    for (it = 0; it < Adapters[Adapter].nCfgs; ++it) {
+        if (IWineD3DImpl_IsGLXFBConfigCompatibleWithRenderFmt(Adapters[Adapter].display, Adapters[Adapter].cfgs[it], RenderTargetFormat)) {
+            if (IWineD3DImpl_IsGLXFBConfigCompatibleWithDepthFmt(Adapters[Adapter].display, Adapters[Adapter].cfgs[it], DepthStencilFormat)) {
+                TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
+                return WINED3D_OK;
             }
         }
-        XFree(cfgs);
-        if(hr != WINED3D_OK)
-            ERR("unsupported format pair: %s and %s\n", debug_d3dformat(RenderTargetFormat), debug_d3dformat(DepthStencilFormat));
-    } else {
-        ERR_(d3d_caps)("returning WINED3D_OK even so CreateFakeGLContext or glXGetFBConfigs failed\n");
-        hr = WINED3D_OK;
     }
+    WARN_(d3d_caps)("unsupported format pair: %s and %s\n", debug_d3dformat(RenderTargetFormat), debug_d3dformat(DepthStencilFormat));
 
-    WineD3D_ReleaseFakeGLContext();
-
-    if (hr != WINED3D_OK)
-        TRACE_(d3d_caps)("Failed to match stencil format to device\n");
-
-    TRACE_(d3d_caps)("(%p) : Returning %x\n", This, hr);
-    return hr;
+    return WINED3DERR_NOTAVAILABLE;
 }
 
 static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, 
@@ -2615,9 +2595,21 @@ BOOL InitAdapters(void) {
         Adapters[0].display = get_display(device_context);
         ReleaseDC(0, device_context);
 
+        ENTER_GL();
+        if(WineD3D_CreateFakeGLContext()) {
+            Adapters[0].cfgs = glXGetFBConfigs(Adapters[0].display, DefaultScreen(Adapters[0].display), &Adapters[0].nCfgs);
+            WineD3D_ReleaseFakeGLContext();
+        } else {
+            ERR("Failed to create a fake opengl context to find fbconfigs formats\n");
+            LEAVE_GL();
+            return FALSE;
+        }
+        LEAVE_GL();
+
         ret = IWineD3DImpl_FillGLCaps(&Adapters[0].gl_info, Adapters[0].display);
-        if(ret != TRUE) {
+        if(!ret) {
             ERR("Failed to initialize gl caps for default adapter\n");
+            XFree(Adapters[0].cfgs);
             HeapFree(GetProcessHeap(), 0, Adapters);
             return FALSE;
         }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index be37ec1..6673bc0 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -579,6 +579,8 @@ struct WineD3DAdapter
     WineD3D_GL_Info         gl_info;
     const char              *driver;
     const char              *description;
+    GLXFBConfig             *cfgs;
+    int                     nCfgs;
 };
 
 extern BOOL InitAdapters(void);




More information about the wine-cvs mailing list