[PATCH 1/6] d3d11: Implement d3d11_device_CheckMultisampleQualityLevels().

Matteo Bruni mbruni at codeweavers.com
Thu Jan 28 17:51:22 CST 2016


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
 dlls/d3d11/device.c       | 35 ++++++++++++++++++++++++++++++++---
 dlls/d3d11/tests/d3d11.c  |  5 ++---
 dlls/wined3d/device.c     | 11 +++++++++++
 dlls/wined3d/wined3d.spec |  1 +
 include/wine/wined3d.h    |  3 +++
 5 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index fb308d0..785e537 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -2423,10 +2423,39 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device *i
 static HRESULT STDMETHODCALLTYPE d3d11_device_CheckMultisampleQualityLevels(ID3D11Device *iface,
         DXGI_FORMAT format, UINT sample_count, UINT *quality_level_count)
 {
-    FIXME("iface %p, format %u, sample_count %u, quality_level_count %p stub!\n",
-            iface, format, sample_count, quality_level_count);
+    struct d3d_device *device = impl_from_ID3D11Device(iface);
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, format %s, sample_count %u, quality_level_count %p.\n",
+            iface, debug_dxgi_format(format), sample_count, quality_level_count);
+
+    if (!quality_level_count)
+        return E_INVALIDARG;
+
+    *quality_level_count = 0;
+
+    if (!sample_count)
+        return E_FAIL;
+    if (sample_count == 1)
+    {
+        *quality_level_count = 1;
+        return S_OK;
+    }
+    if (sample_count > 32)
+        return E_FAIL;
+
+    if (sample_count > 16)
+    {
+        FIXME("sample_count %u not handled yet.\n", sample_count);
+        return S_OK;
+    }
+    hr = wined3d_device_check_multisample_quality_levels(device->wined3d_device,
+            wined3dformat_from_dxgi_format(format), sample_count, quality_level_count);
+    if (hr == WINED3DERR_INVALIDCALL)
+        return E_INVALIDARG;
+    if (hr == WINED3DERR_NOTAVAILABLE)
+        return S_OK;
+    return hr;
 }
 
 static void STDMETHODCALLTYPE d3d11_device_CheckCounterInfo(ID3D11Device *iface, D3D11_COUNTER_INFO *info)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index ba9cc52..7577633 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -4796,7 +4796,7 @@ static void test_multisample_init(void)
     }
 
     hr = ID3D11Device_CheckMultisampleQualityLevels(device, DXGI_FORMAT_R8G8B8A8_UNORM, 2, &count);
-    todo_wine ok(SUCCEEDED(hr), "Failed to get quality levels, hr %#x.\n", hr);
+    ok(SUCCEEDED(hr), "Failed to get quality levels, hr %#x.\n", hr);
     if (!count)
     {
         skip("Multisampling not supported for DXGI_FORMAT_R8G8B8A8_UNORM, skipping tests.\n");
@@ -4828,7 +4828,6 @@ static void test_multisample_init(void)
     hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &multi);
     ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
 
-    ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
     ID3D11DeviceContext_ResolveSubresource(context, (ID3D11Resource *)backbuffer, 0,
             (ID3D11Resource *)multi, 0, DXGI_FORMAT_R8G8B8A8_UNORM);
 
@@ -4848,7 +4847,7 @@ static void test_multisample_init(void)
             break;
     }
     release_texture_readback(&rb);
-    ok(all_zero, "Got unexpected color 0x%08x, position %ux%u.\n", color, x, y);
+    todo_wine ok(all_zero, "Got unexpected color 0x%08x, position %ux%u.\n", color, x, y);
 
     ID3D11DeviceContext_Release(context);
     ID3D11RenderTargetView_Release(rtview);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 7059e21..27284d6 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5076,6 +5076,17 @@ struct wined3d_surface * CDECL wined3d_device_get_surface_from_dc(const struct w
     return NULL;
 }
 
+HRESULT CDECL wined3d_device_check_multisample_quality_levels(const struct wined3d_device *device,
+        enum wined3d_format_id format_id, enum wined3d_multisample_type multisample_type,
+        DWORD *quality_level_count)
+{
+    TRACE("device %p, format_id %s, multisample_type %u, quality_level_count %p.\n",
+            device, debug_d3dformat(format_id), multisample_type, quality_level_count);
+
+    return wined3d_check_device_multisample_type(device->wined3d, device->create_parms.adapter_idx,
+            device->create_parms.device_type, format_id, TRUE, multisample_type, quality_level_count);
+}
+
 static int wined3d_sampler_compare(const void *key, const struct wine_rb_entry *entry)
 {
     const struct wined3d_sampler *sampler = WINE_RB_ENTRY_VALUE(entry, struct wined3d_sampler, entry);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index c09e0a6..e7a3f65 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -35,6 +35,7 @@
 @ cdecl wined3d_device_acquire_focus_window(ptr ptr)
 @ cdecl wined3d_device_begin_scene(ptr)
 @ cdecl wined3d_device_begin_stateblock(ptr)
+@ cdecl wined3d_device_check_multisample_quality_levels(ptr long long ptr)
 @ cdecl wined3d_device_clear(ptr long ptr long ptr float long)
 @ cdecl wined3d_device_clear_rendertarget_view(ptr ptr ptr ptr)
 @ cdecl wined3d_device_copy_resource(ptr ptr ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 08cbf50..035108a 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2120,6 +2120,9 @@ void __cdecl wined3d_buffer_unmap(struct wined3d_buffer *buffer);
 HRESULT __cdecl wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window);
 HRESULT __cdecl wined3d_device_begin_scene(struct wined3d_device *device);
 HRESULT __cdecl wined3d_device_begin_stateblock(struct wined3d_device *device);
+HRESULT __cdecl wined3d_device_check_multisample_quality_levels(const struct wined3d_device *device,
+        enum wined3d_format_id format_id, enum wined3d_multisample_type multisample_type,
+        DWORD *quality_level_count);
 HRESULT __cdecl wined3d_device_clear(struct wined3d_device *device, DWORD rect_count, const RECT *rects, DWORD flags,
         const struct wined3d_color *color, float z, DWORD stencil);
 HRESULT __cdecl wined3d_device_clear_rendertarget_view(struct wined3d_device *device,
-- 
2.4.10




More information about the wine-patches mailing list