From: Zhiyi Zhang Subject: [PATCH v2 5/5] winex11.drv: Implement X11DRV_D3DKMTCheckVidPnExclusiveOwnership. Message-Id: <70eddc85-4e30-1e97-9b85-ac54c6cbdcd1@codeweavers.com> Date: Fri, 5 Jul 2019 01:06:29 +0800 Signed-off-by: Zhiyi Zhang --- dlls/dxgi/tests/dxgi.c | 10 +++++++--- dlls/gdi32/tests/driver.c | 2 +- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 25 +++++++++++++++++++++++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index d8176bb1c0..ab65725ccf 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -731,7 +731,6 @@ static IDXGIAdapter *get_adapter_(unsigned int line, IUnknown *device, BOOL is_d hr = IDXGIFactory_QueryInterface(factory, &IID_IDXGIFactory4, (void **)&factory4); ok_(__FILE__, line)(hr == S_OK, "Got unexpected hr %#x.\n", hr); hr = IDXGIFactory4_EnumAdapterByLuid(factory4, luid, &IID_IDXGIAdapter, (void **)&adapter); - ok_(__FILE__, line)(hr == S_OK, "Got unexpected hr %#x.\n", hr); IDXGIFactory4_Release(factory4); IDXGIFactory_Release(factory); } @@ -5497,13 +5496,18 @@ static void test_output_ownership(IUnknown *device, BOOL is_d3d12) if (!pD3DKMTCheckVidPnExclusiveOwnership || pD3DKMTCheckVidPnExclusiveOwnership(NULL) == STATUS_PROCEDURE_NOT_FOUND) { - skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); + win_skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); return; } get_factory(device, is_d3d12, &factory); adapter = get_adapter(device, is_d3d12); - ok(!!adapter, "Failed to get adapter.\n"); + if (!adapter) + { + skip("Failed to get adapter on Direct3D %d.\n", is_d3d12 ? 12 : 10); + IDXGIFactory_Release(factory); + return; + } hr = IDXGIAdapter_EnumOutputs(adapter, 0, &output); IDXGIAdapter_Release(adapter); diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 2ea43e3025..ed83a72813 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -376,7 +376,7 @@ static void test_D3DKMTCheckVidPnExclusiveOwnership(void) if (!pD3DKMTCheckVidPnExclusiveOwnership || pD3DKMTCheckVidPnExclusiveOwnership(NULL) == STATUS_PROCEDURE_NOT_FOUND) { - skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); + win_skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); return; } diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 66e6e7f09a..531bff0fdb 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -471,7 +471,7 @@ static const struct gdi_dc_funcs x11drv_funcs = X11DRV_StrokePath, /* pStrokePath */ X11DRV_UnrealizePalette, /* pUnrealizePalette */ NULL, /* pWidenPath */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ + X11DRV_D3DKMTCheckVidPnExclusiveOwnership, /* pD3DKMTCheckVidPnExclusiveOwnership */ X11DRV_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */ X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */ X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index d96a19f2e6..6ebf5db247 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -150,6 +150,7 @@ extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right, extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; extern NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) DECLSPEC_HIDDEN; +extern NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) DECLSPEC_HIDDEN; extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern INT X11DRV_EnumICMProfiles( PHYSDEV dev, ICMENUMPROCW proc, LPARAM lparam ) DECLSPEC_HIDDEN; extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index ef973f3e48..c9b202ad0e 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -877,3 +877,28 @@ done: LeaveCriticalSection( &x11drv_section ); return status; } + +/********************************************************************** + * X11DRV_D3DKMTCheckVidPnExclusiveOwnership + */ +NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) +{ + struct d3dkmt_vidpn_source *source; + + TRACE("(%p)\n", desc); + + if (!desc || !desc->hAdapter) + return STATUS_INVALID_PARAMETER; + + EnterCriticalSection( &x11drv_section ); + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->id == desc->VidPnSourceId && source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE) + { + LeaveCriticalSection( &x11drv_section ); + return STATUS_GRAPHICS_PRESENT_OCCLUDED; + } + } + LeaveCriticalSection( &x11drv_section ); + return STATUS_SUCCESS; +} -- 2.20.1