[PATCH 1/5] evr/presenter: Create d3d device on presenter creation.

Nikolay Sivov nsivov at codeweavers.com
Fri Oct 2 06:01:09 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/evr/Makefile.in |  2 +-
 dlls/evr/presenter.c | 47 +++++++++++++++++++++++++++++++++----
 dlls/evr/tests/evr.c | 55 +++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 92 insertions(+), 12 deletions(-)

diff --git a/dlls/evr/Makefile.in b/dlls/evr/Makefile.in
index 6d936d65b79..02cdb9b820a 100644
--- a/dlls/evr/Makefile.in
+++ b/dlls/evr/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = evr.dll
 IMPORTLIB = evr
-IMPORTS   = mfuuid strmiids strmbase uuid dxguid ole32 oleaut32 dxva2
+IMPORTS   = mfuuid strmiids strmbase uuid dxguid ole32 oleaut32 user32 d3d9 dxva2
 DELAYIMPORTS = mfplat
 
 EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index b60de4b82a1..04653ff67ad 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -643,11 +643,47 @@ HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFII
     return CoCreateInstance(&CLSID_MFVideoPresenter9, owner, CLSCTX_INPROC_SERVER, riid, obj);
 }
 
+static HRESULT video_presenter_init_d3d(struct video_presenter *presenter)
+{
+    D3DPRESENT_PARAMETERS present_params = { 0 };
+    IDirect3DDevice9 *device;
+    IDirect3D9 *d3d;
+    HRESULT hr;
+
+    d3d = Direct3DCreate9(D3D_SDK_VERSION);
+
+    present_params.BackBufferCount = 1;
+    present_params.SwapEffect = D3DSWAPEFFECT_COPY;
+    present_params.hDeviceWindow = GetDesktopWindow();
+    present_params.Windowed = TRUE;
+    present_params.Flags = D3DPRESENTFLAG_VIDEO;
+    present_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
+    hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),
+            0, &present_params, &device);
+
+    IDirect3D9_Release(d3d);
+
+    if (FAILED(hr))
+    {
+        WARN("Failed to create d3d device, hr %#x.\n", hr);
+        return hr;
+    }
+
+    hr = IDirect3DDeviceManager9_ResetDevice(presenter->device_manager, device, presenter->reset_token);
+    IDirect3DDevice9_Release(device);
+    if (FAILED(hr))
+        WARN("Failed to set new device for the manager, hr %#x.\n", hr);
+
+    return hr;
+}
+
 HRESULT evr_presenter_create(IUnknown *outer, void **out)
 {
     struct video_presenter *object;
     HRESULT hr;
 
+    *out = NULL;
+
     if (!(object = heap_alloc_zero(sizeof(*object))))
         return E_OUTOFMEMORY;
 
@@ -663,12 +699,13 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
     InitializeCriticalSection(&object->cs);
 
     if (FAILED(hr = DXVA2CreateDirect3DDeviceManager9(&object->reset_token, &object->device_manager)))
-    {
         IUnknown_Release(&object->IUnknown_inner);
-        return hr;
-    }
 
-    *out = &object->IUnknown_inner;
+    if (FAILED(hr = video_presenter_init_d3d(object)))
+        IUnknown_Release(&object->IUnknown_inner);
 
-    return S_OK;
+    if (SUCCEEDED(hr))
+        *out = &object->IUnknown_inner;
+
+    return hr;
 }
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 0dff691b59f..c2e17595559 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -39,7 +39,7 @@ static HWND create_window(void)
 
     AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW | WS_VISIBLE, FALSE);
 
-    return CreateWindowA("static", "d3d9_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+    return CreateWindowA("static", "evr_test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
             0, 0, r.right - r.left, r.bottom - r.top, NULL, NULL, NULL, NULL);
 }
 
@@ -967,12 +967,16 @@ done:
 static void test_default_presenter(void)
 {
     D3DDEVICE_CREATION_PARAMETERS device_params = { 0 };
+    D3DPRESENT_PARAMETERS present_params = { 0 };
+    IMFVideoDisplayControl *display_control;
+    IDirect3DSwapChain9 *swapchain;
     IMFVideoPresenter *presenter;
     IMFRateSupport *rate_support;
     IDirect3DDevice9 *d3d_device;
     IDirect3DDeviceManager9 *dm;
     IMFVideoDeviceID *deviceid;
     IMFGetService *gs;
+    HWND hwnd, hwnd2;
     HANDLE handle;
     IUnknown *unk;
     float rate;
@@ -1010,33 +1014,70 @@ static void test_default_presenter(void)
     hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFGetService, (void **)&gs);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFGetService_GetService(gs, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, (void **)&display_control);
+todo_wine
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+        IMFVideoDisplayControl_Release(display_control);
+
     hr = IMFGetService_GetService(gs, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, (void **)&dm);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFVideoDisplayControl, (void **)&display_control);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
     hr = IDirect3DDeviceManager9_OpenDeviceHandle(dm, &handle);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
     hr = IDirect3DDeviceManager9_LockDevice(dm, handle, &d3d_device, FALSE);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
-if (SUCCEEDED(hr))
-{
     hr = IDirect3DDevice9_GetCreationParameters(d3d_device, &device_params);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(device_params.hFocusWindow == GetDesktopWindow(), "Unexpected window %p.\n", device_params.hFocusWindow);
 
+    hr = IDirect3DDevice9_GetSwapChain(d3d_device, 0, &swapchain);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_params);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ok(present_params.hDeviceWindow == GetDesktopWindow(), "Unexpected device window.\n");
+    ok(present_params.Windowed, "Unexpected windowed mode.\n");
+    ok(present_params.SwapEffect == D3DSWAPEFFECT_COPY, "Unexpected swap effect.\n");
+    ok(present_params.Flags == D3DPRESENTFLAG_VIDEO, "Unexpected flags.\n");
+    ok(present_params.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE, "Unexpected present interval.\n");
+
     IDirect3DDevice9_Release(d3d_device);
 
     hr = IDirect3DDeviceManager9_UnlockDevice(dm, handle, FALSE);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
-    hr = IDirect3DDeviceManager9_CloseDeviceHandle(dm, handle);
+    hwnd = create_window();
+    ok(!!hwnd, "Failed to create a test window.\n");
+
+    hwnd2 = hwnd;
+    hr = IMFVideoDisplayControl_GetVideoWindow(display_control, &hwnd2);
+todo_wine {
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(hwnd2 == NULL, "Unexpected window %p.\n", hwnd2);
+}
+    hr = IMFVideoDisplayControl_SetVideoWindow(display_control, hwnd);
+todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hwnd2 = NULL;
+    hr = IMFVideoDisplayControl_GetVideoWindow(display_control, &hwnd2);
+todo_wine {
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(hwnd2 == hwnd, "Unexpected window %p.\n", hwnd2);
 }
+    hr = IDirect3DDeviceManager9_CloseDeviceHandle(dm, handle);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
     IDirect3DDeviceManager9_Release(dm);
 
+    IMFVideoDisplayControl_Release(display_control);
     IMFGetService_Release(gs);
 
     /* Rate support. */
@@ -1066,6 +1107,8 @@ if (SUCCEEDED(hr))
     IMFRateSupport_Release(rate_support);
 
     IMFVideoPresenter_Release(presenter);
+
+    DestroyWindow(hwnd);
 }
 
 static void test_MFCreateVideoMixerAndPresenter(void)
-- 
2.28.0




More information about the wine-devel mailing list