[PATCH 5/6] d3d11: Partially implement d3d11_device_CheckFormatSupport() on top of wined3d_check_device_format().

Józef Kucia jkucia at codeweavers.com
Wed May 31 04:43:19 CDT 2017


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---

For Eve Online, Start Trek Online, Neverwinter, ...

---
 dlls/d3d11/device.c      | 55 ++++++++++++++++++++++++++++++++++++++++++++++--
 dlls/d3d11/tests/d3d11.c | 16 +++++++-------
 2 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 8966460..fcf5d10 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -3318,9 +3318,60 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_OpenSharedResource(ID3D11Device *i
 static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device *iface, DXGI_FORMAT format,
         UINT *format_support)
 {
-    FIXME("iface %p, format %u, format_support %p stub!\n", iface, format, format_support);
+    struct d3d_device *device = impl_from_ID3D11Device(iface);
+    struct wined3d_device_creation_parameters params;
+    enum wined3d_format_id wined3d_format;
+    struct wined3d *wined3d;
+    unsigned int i;
 
-    return E_NOTIMPL;
+    static const const struct
+    {
+        enum wined3d_resource_type rtype;
+        unsigned int usage;
+        D3D11_FORMAT_SUPPORT flag;
+    }
+    flag_mapping[] =
+    {
+        {WINED3D_RTYPE_TEXTURE_2D, WINED3DUSAGE_TEXTURE,      D3D11_FORMAT_SUPPORT_TEXTURE2D},
+        {WINED3D_RTYPE_TEXTURE_3D, WINED3DUSAGE_TEXTURE,      D3D11_FORMAT_SUPPORT_TEXTURE3D},
+        {WINED3D_RTYPE_NONE,       WINED3DUSAGE_RENDERTARGET, D3D11_FORMAT_SUPPORT_RENDER_TARGET},
+        {WINED3D_RTYPE_NONE,       WINED3DUSAGE_DEPTHSTENCIL, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL},
+    };
+    HRESULT hr;
+
+    FIXME("iface %p, format %u, format_support %p partial-stub!\n", iface, format, format_support);
+
+    wined3d_format = wined3dformat_from_dxgi_format(format);
+    if (format && !wined3d_format)
+    {
+        WARN("Invalid format %#x.\n", format);
+        *format_support = 0;
+        return E_FAIL;
+    }
+
+    *format_support = 0;
+
+    wined3d_mutex_lock();
+    wined3d = wined3d_device_get_wined3d(device->wined3d_device);
+    wined3d_device_get_creation_parameters(device->wined3d_device, &params);
+    for (i = 0; i < ARRAY_SIZE(flag_mapping); ++i)
+    {
+        hr = wined3d_check_device_format(wined3d, params.adapter_idx, params.device_type,
+                WINED3DFMT_UNKNOWN, flag_mapping[i].usage, flag_mapping[i].rtype, wined3d_format);
+        if (hr == WINED3DERR_NOTAVAILABLE || hr == WINED3DOK_NOAUTOGEN)
+            continue;
+        if (hr != WINED3D_OK)
+        {
+            WARN("Failed to check device format support, hr %#x.\n", hr);
+            wined3d_mutex_unlock();
+            return E_FAIL;
+        }
+
+        *format_support |= flag_mapping[i].flag;
+    }
+    wined3d_mutex_unlock();
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d11_device_CheckMultisampleQualityLevels(ID3D11Device *iface,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index b160977..84ffe4e 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -14046,7 +14046,7 @@ static void check_format_support(const unsigned int *format_support, D3D_FEATURE
 
         if (formats[i].fl_required <= feature_level)
         {
-            ok(supported, "Format %#x - %s not supported, feature_level %#x, format support %#x.\n",
+            todo_wine ok(supported, "Format %#x - %s not supported, feature_level %#x, format support %#x.\n",
                     format, feature_name, feature_level, format_support[format]);
             continue;
         }
@@ -14071,6 +14071,7 @@ static void test_required_format_support(const D3D_FEATURE_LEVEL feature_level)
     ID3D11Device *device;
     DXGI_FORMAT format;
     ULONG refcount;
+    UINT support;
     HRESULT hr;
 
     static const struct format_support index_buffers[] =
@@ -14087,20 +14088,19 @@ static void test_required_format_support(const D3D_FEATURE_LEVEL feature_level)
         return;
     }
 
+    support = 0xdeadbeef;
+    hr = ID3D11Device_CheckFormatSupport(device, ~0u, &support);
+    ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
+    ok(!support, "Got unexpected format support %#x.\n", support);
+
     memset(format_support, 0, sizeof(format_support));
     for (format = DXGI_FORMAT_UNKNOWN; format <= DXGI_FORMAT_B4G4R4A4_UNORM; ++format)
     {
         hr = ID3D11Device_CheckFormatSupport(device, format, &format_support[format]);
-        todo_wine ok(hr == S_OK || (hr == E_FAIL && !format_support[format]),
+        ok(hr == S_OK || (hr == E_FAIL && !format_support[format]),
                 "Got unexpected result for format %#x: hr %#x, format_support %#x.\n",
                 format, hr, format_support[format]);
     }
-    if (hr == E_NOTIMPL)
-    {
-        skip("CheckFormatSupport not implemented.\n");
-        ID3D11Device_Release(device);
-        return;
-    }
 
     check_format_support(format_support, feature_level,
             index_buffers, ARRAY_SIZE(index_buffers),
-- 
2.10.2




More information about the wine-patches mailing list