[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