=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Partially implement dxgi_adapter_CheckInterfaceSupport().

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 13 10:53:47 CDT 2015


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Oct 13 09:44:32 2015 +0200

dxgi: Partially implement dxgi_adapter_CheckInterfaceSupport().

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/adapter.c      | 34 ++++++++++++++++++++++++++++++++--
 dlls/dxgi/device.c       | 12 +++---------
 dlls/dxgi/dxgi_private.h |  4 +++-
 dlls/dxgi/utils.c        | 23 +++++++++++++++++++++++
 4 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/dlls/dxgi/adapter.c b/dlls/dxgi/adapter.c
index 9a74935..3e58fd2 100644
--- a/dlls/dxgi/adapter.c
+++ b/dlls/dxgi/adapter.c
@@ -200,9 +200,39 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_GetDesc(IDXGIAdapter1 *iface, DXGI
 static HRESULT STDMETHODCALLTYPE dxgi_adapter_CheckInterfaceSupport(IDXGIAdapter1 *iface,
         REFGUID guid, LARGE_INTEGER *umd_version)
 {
-    FIXME("iface %p, guid %s, umd_version %p stub!\n", iface, debugstr_guid(guid), umd_version);
+    struct dxgi_adapter *adapter = impl_from_IDXGIAdapter1(iface);
+    struct wined3d_adapter_identifier adapter_id;
+    HRESULT hr;
+
+    TRACE("iface %p, guid %s, umd_version %p.\n", iface, debugstr_guid(guid), umd_version);
+
+    /* This method works only for D3D10 interfaces. */
+    if (!(IsEqualGUID(guid, &IID_ID3D10Device)
+            || IsEqualGUID(guid, &IID_ID3D10Device1)))
+    {
+        WARN("Returning DXGI_ERROR_UNSUPPORTED for %s.\n", debugstr_guid(guid));
+        return DXGI_ERROR_UNSUPPORTED;
+    }
 
-    return E_NOTIMPL;
+    if (FAILED(hr = dxgi_check_d3d10_support(adapter->parent, adapter)))
+        return DXGI_ERROR_UNSUPPORTED;
+
+    if (umd_version)
+    {
+        adapter_id.driver_size = 0;
+        adapter_id.description_size = 0;
+        adapter_id.device_name_size = 0;
+
+        wined3d_mutex_lock();
+        hr = wined3d_get_adapter_identifier(adapter->parent->wined3d, adapter->ordinal, 0, &adapter_id);
+        wined3d_mutex_unlock();
+        if (FAILED(hr))
+            return hr;
+
+        *umd_version = adapter_id.driver_version;
+    }
+
+    return S_OK;
 }
 
 static const struct IDXGIAdapter1Vtbl dxgi_adapter_vtbl =
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index ecb9d91..b7a6aa0 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -23,7 +23,6 @@
 #include "dxgi_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dxgi);
-WINE_DECLARE_DEBUG_CHANNEL(winediag);
 
 static inline struct dxgi_device *impl_from_IWineDXGIDevice(IWineDXGIDevice *iface)
 {
@@ -352,7 +351,6 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
     struct dxgi_factory *dxgi_factory;
     void *layer_base;
     HRESULT hr;
-    WINED3DCAPS caps;
 
     if (!(dxgi_factory = unsafe_impl_from_IDXGIFactory1((IDXGIFactory1 *)factory)))
     {
@@ -394,20 +392,16 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
     wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
     IWineDXGIDeviceParent_Release(dxgi_device_parent);
 
-    FIXME("Ignoring adapter type.\n");
-
-    hr = wined3d_get_device_caps(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, &caps);
-    if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4)
+    if (FAILED(hr = dxgi_check_d3d10_support(dxgi_factory, dxgi_adapter)))
     {
-        FIXME_(winediag)("Direct3D 10 is not supported on this GPU with the current shader backend.\n");
-        if (SUCCEEDED(hr))
-            hr = E_FAIL;
         IUnknown_Release(device->child_layer);
         wined3d_private_store_cleanup(&device->private_store);
         wined3d_mutex_unlock();
         return hr;
     }
 
+    FIXME("Ignoring adapter type.\n");
+
     hr = wined3d_device_create(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL,
             NULL, 0, 4, wined3d_device_parent, &device->wined3d_device);
     if (FAILED(hr))
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 035af74..c1c178d 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -30,7 +30,7 @@
 #include "objbase.h"
 #include "winnls.h"
 
-#include "dxgi.h"
+#include "d3d10_1.h"
 #ifdef DXGI_INIT_GUID
 #include "initguid.h"
 #endif
@@ -168,4 +168,6 @@ struct dxgi_surface
 HRESULT dxgi_surface_init(struct dxgi_surface *surface, IDXGIDevice *device,
         IUnknown *outer, struct wined3d_resource *wined3d_resource) DECLSPEC_HIDDEN;
 
+HRESULT dxgi_check_d3d10_support(struct dxgi_factory *factory, struct dxgi_adapter *adapter) DECLSPEC_HIDDEN;
+
 #endif /* __WINE_DXGI_PRIVATE_H */
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index de3ef77..92a049f 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -23,6 +23,7 @@
 #include "dxgi_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dxgi);
+WINE_DECLARE_DEBUG_CHANNEL(winediag);
 
 #define WINE_DXGI_TO_STR(x) case x: return #x
 
@@ -432,3 +433,25 @@ HRESULT dxgi_set_private_data_interface(struct wined3d_private_store *store,
 
     return hr;
 }
+
+HRESULT dxgi_check_d3d10_support(struct dxgi_factory *factory, struct dxgi_adapter *adapter)
+{
+    WINED3DCAPS caps;
+    HRESULT hr;
+
+    FIXME("Ignoring adapter type.\n");
+
+    wined3d_mutex_lock();
+    hr = wined3d_get_device_caps(factory->wined3d, adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, &caps);
+    if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4)
+    {
+        FIXME_(winediag)("Direct3D 10 is not supported on this GPU with the current shader backend.\n");
+        if (SUCCEEDED(hr))
+            hr = E_FAIL;
+        wined3d_mutex_unlock();
+        return hr;
+    }
+    wined3d_mutex_unlock();
+
+    return S_OK;
+}




More information about the wine-cvs mailing list