Nikolay Sivov : d3d11: Correctly handle optional arguments in OMGetDepthStencilState().
Alexandre Julliard
julliard at winehq.org
Tue Oct 19 16:07:48 CDT 2021
Module: wine
Branch: master
Commit: 3b860a0378b76a80f5a5fca771a0029bb30e7800
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3b860a0378b76a80f5a5fca771a0029bb30e7800
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Oct 19 09:05:00 2021 +0300
d3d11: Correctly handle optional arguments in OMGetDepthStencilState().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3d10core/tests/d3d10core.c | 11 +++++++++++
dlls/d3d11/device.c | 37 ++++++++++++++++++++++++++-----------
dlls/d3d11/tests/d3d11.c | 10 ++++++++++
3 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/dlls/d3d10core/tests/d3d10core.c b/dlls/d3d10core/tests/d3d10core.c
index 85e453c8474..6ec398269fa 100644
--- a/dlls/d3d10core/tests/d3d10core.c
+++ b/dlls/d3d10core/tests/d3d10core.c
@@ -5696,6 +5696,17 @@ float4 main(float4 color : COLOR) : SV_TARGET
ok(tmp_ds_state == ds_state, "Got unexpected depth stencil state %p, expected %p.\n", tmp_ds_state, ds_state);
ID3D10DepthStencilState_Release(tmp_ds_state);
ok(stencil_ref == 3, "Got unexpected stencil ref %u.\n", stencil_ref);
+ /* For OMGetDepthStencilState() both arguments are optional. */
+ ID3D10Device_OMGetDepthStencilState(device, NULL, NULL);
+ stencil_ref = 0;
+ ID3D10Device_OMGetDepthStencilState(device, NULL, &stencil_ref);
+ ok(stencil_ref == 3, "Got unexpected stencil ref %u.\n", stencil_ref);
+ tmp_ds_state = NULL;
+ ID3D10Device_OMGetDepthStencilState(device, &tmp_ds_state, NULL);
+ ok(stencil_ref == 3, "Got unexpected stencil ref %u.\n", stencil_ref);
+ ok(tmp_ds_state == ds_state, "Got unexpected depth stencil state %p, expected %p.\n", tmp_ds_state, ds_state);
+ ID3D10DepthStencilState_Release(tmp_ds_state);
+
ID3D10Device_OMGetRenderTargets(device, D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT, tmp_rtv, &tmp_dsv);
for (i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
{
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 248634a245d..6d125e06ace 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -2216,19 +2216,25 @@ static void STDMETHODCALLTYPE d3d11_device_context_OMGetDepthStencilState(ID3D11
struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface);
struct wined3d_depth_stencil_state *wined3d_state;
struct d3d_depthstencil_state *state_impl;
+ UINT stencil_ref_tmp;
TRACE("iface %p, depth_stencil_state %p, stencil_ref %p.\n",
iface, depth_stencil_state, stencil_ref);
wined3d_mutex_lock();
- if ((wined3d_state = wined3d_device_context_get_depth_stencil_state(context->wined3d_context, stencil_ref)))
+ if (!stencil_ref) stencil_ref = &stencil_ref_tmp;
+ wined3d_state = wined3d_device_context_get_depth_stencil_state(context->wined3d_context, stencil_ref);
+ if (depth_stencil_state)
{
- state_impl = wined3d_depth_stencil_state_get_parent(wined3d_state);
- ID3D11DepthStencilState_AddRef(*depth_stencil_state = &state_impl->ID3D11DepthStencilState_iface);
- }
- else
- {
- *depth_stencil_state = NULL;
+ if (wined3d_state)
+ {
+ state_impl = wined3d_depth_stencil_state_get_parent(wined3d_state);
+ ID3D11DepthStencilState_AddRef(*depth_stencil_state = &state_impl->ID3D11DepthStencilState_iface);
+ }
+ else
+ {
+ *depth_stencil_state = NULL;
+ }
}
wined3d_mutex_unlock();
}
@@ -5554,7 +5560,7 @@ static void STDMETHODCALLTYPE d3d10_device_OMGetDepthStencilState(ID3D10Device1
ID3D10DepthStencilState **depth_stencil_state, UINT *stencil_ref)
{
struct d3d_device *device = impl_from_ID3D10Device(iface);
- ID3D11DepthStencilState *d3d11_iface;
+ ID3D11DepthStencilState *d3d11_iface = NULL;
TRACE("iface %p, depth_stencil_state %p, stencil_ref %p.\n",
iface, depth_stencil_state, stencil_ref);
@@ -5562,10 +5568,19 @@ static void STDMETHODCALLTYPE d3d10_device_OMGetDepthStencilState(ID3D10Device1
d3d11_device_context_OMGetDepthStencilState(&device->immediate_context.ID3D11DeviceContext1_iface,
&d3d11_iface, stencil_ref);
+ if (depth_stencil_state)
+ {
+ if (d3d11_iface)
+ {
+ *depth_stencil_state = &impl_from_ID3D11DepthStencilState(d3d11_iface)->ID3D10DepthStencilState_iface;
+ ID3D10DepthStencilState_AddRef(*depth_stencil_state);
+ }
+ else
+ *depth_stencil_state = NULL;
+ }
+
if (d3d11_iface)
- *depth_stencil_state = &impl_from_ID3D11DepthStencilState(d3d11_iface)->ID3D10DepthStencilState_iface;
- else
- *depth_stencil_state = NULL;
+ ID3D11DepthStencilState_Release(d3d11_iface);
}
static void STDMETHODCALLTYPE d3d10_device_SOGetTargets(ID3D10Device1 *iface,
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index bd16d7ab8b8..553caa10e46 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -12599,6 +12599,16 @@ static void test_clear_state(void)
ok(tmp_ds_state == ds_state, "Got unexpected depth stencil state %p, expected %p.\n", tmp_ds_state, ds_state);
ID3D11DepthStencilState_Release(tmp_ds_state);
ok(stencil_ref == 3, "Got unexpected stencil ref %u.\n", stencil_ref);
+ /* For OMGetDepthStencilState() both arguments are optional. */
+ ID3D11DeviceContext_OMGetDepthStencilState(context, NULL, NULL);
+ stencil_ref = 0;
+ ID3D11DeviceContext_OMGetDepthStencilState(context, NULL, &stencil_ref);
+ ok(stencil_ref == 3, "Got unexpected stencil ref %u.\n", stencil_ref);
+ tmp_ds_state = NULL;
+ ID3D11DeviceContext_OMGetDepthStencilState(context, &tmp_ds_state, NULL);
+ ok(tmp_ds_state == ds_state, "Got unexpected depth stencil state %p, expected %p.\n", tmp_ds_state, ds_state);
+ ID3D11DepthStencilState_Release(tmp_ds_state);
+
ID3D11DeviceContext_OMGetRenderTargets(context, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, tmp_rtv, &tmp_dsv);
for (i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT - 1; ++i)
{
More information about the wine-cvs
mailing list