[PATCH 2/5] mfplat: Implement GetVideoService() for the device manager.

Nikolay Sivov nsivov at codeweavers.com
Fri Oct 23 06:33:27 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/main.c         | 28 ++++++++++++++++++++++++----
 dlls/mfplat/tests/mfplat.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 68aa2cdaa2d..1c51fafff1e 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -8689,12 +8689,32 @@ static HRESULT WINAPI dxgi_device_manager_CloseDeviceHandle(IMFDXGIDeviceManager
     return hr;
 }
 
-static HRESULT WINAPI dxgi_device_manager_GetVideoService(IMFDXGIDeviceManager *iface, HANDLE device,
-                                                          REFIID riid, void **service)
+static HRESULT WINAPI dxgi_device_manager_GetVideoService(IMFDXGIDeviceManager *iface, HANDLE hdevice,
+        REFIID riid, void **service)
 {
-    FIXME("(%p, %p, %s, %p): stub.\n", iface, device, debugstr_guid(riid), service);
+    struct dxgi_device_manager *manager = impl_from_IMFDXGIDeviceManager(iface);
+    HRESULT hr;
+    size_t idx;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %s, %p.\n", iface, hdevice, debugstr_guid(riid), service);
+
+    EnterCriticalSection(&manager->cs);
+
+    if (!manager->device)
+        hr = MF_E_DXGI_DEVICE_NOT_INITIALIZED;
+    else if (SUCCEEDED(hr = dxgi_device_manager_get_handle_index(manager, hdevice, &idx)))
+    {
+        if (manager->handles[idx] & DXGI_DEVICE_HANDLE_FLAG_INVALID)
+            hr = MF_E_DXGI_NEW_VIDEO_DEVICE;
+        else if (manager->handles[idx] & DXGI_DEVICE_HANDLE_FLAG_OPEN)
+            hr = IDXGIDevice_QueryInterface(manager->device, riid, service);
+        else
+            hr = E_HANDLE;
+    }
+
+    LeaveCriticalSection(&manager->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI dxgi_device_manager_LockDevice(IMFDXGIDeviceManager *iface, HANDLE hdevice,
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index c318c4364fb..5b09d36f616 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -4530,6 +4530,7 @@ static void test_dxgi_device_manager(void)
     struct test_thread_param param;
     HANDLE handle1, handle, thread;
     UINT token, token2;
+    IUnknown *unk;
     HRESULT hr;
 
     if (!pMFCreateDXGIDeviceManager)
@@ -4560,6 +4561,9 @@ static void test_dxgi_device_manager(void)
     ok(manager != manager2, "got wrong pointer: %p.\n", manager2);
     EXPECT_REF(manager, 1);
 
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, NULL, &IID_ID3D11Device, (void **)&unk);
+    ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr);
+
     hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle);
     ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr);
 
@@ -4599,6 +4603,12 @@ static void test_dxgi_device_manager(void)
     EXPECT_REF(manager, 1);
     EXPECT_REF(d3d11_dev, 2);
 
+    /* GetVideoService() on device change. */
+    handle = NULL;
+    hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!!handle, "Unexpected handle value %p.\n", handle);
+
     hr = pD3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0,
                            NULL, 0, D3D11_SDK_VERSION, &d3d11_dev2, NULL, NULL);
     ok(hr == S_OK, "D3D11CreateDevice failed: %#x.\n", hr);
@@ -4609,11 +4619,32 @@ static void test_dxgi_device_manager(void)
     EXPECT_REF(d3d11_dev2, 2);
     EXPECT_REF(d3d11_dev, 1);
 
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_ID3D11Device, (void **)&unk);
+    ok(hr == MF_E_DXGI_NEW_VIDEO_DEVICE, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
     handle = NULL;
     hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!!handle, "Unexpected handle value %p.\n", handle);
 
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, NULL, &IID_ID3D11Device, (void **)&unk);
+    ok(hr == E_HANDLE, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_ID3D11Device, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    IUnknown_Release(unk);
+
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_IUnknown, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    IUnknown_Release(unk);
+
+    hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_IDXGIDevice, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    IUnknown_Release(unk);
+
     handle1 = NULL;
     hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle1);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-- 
2.28.0




More information about the wine-devel mailing list