[PATCH 4/6] evr/presenter: Add IDirect3DDeviceManager9 as a supported interface.

Nikolay Sivov nsivov at codeweavers.com
Tue Nov 17 04:41:38 CST 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/evr/presenter.c | 90 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/evr/tests/evr.c | 19 +++++++++-
 2 files changed, 108 insertions(+), 1 deletion(-)

diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index 51792cdc2cd..ac81634f7ca 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -68,6 +68,7 @@ struct video_presenter
     IMFVideoPositionMapper IMFVideoPositionMapper_iface;
     IQualProp IQualProp_iface;
     IMFQualityAdvise IMFQualityAdvise_iface;
+    IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface;
     IMFVideoSampleAllocatorNotify allocator_cb;
     IUnknown IUnknown_inner;
     IUnknown *outer_unk;
@@ -152,6 +153,11 @@ static struct video_presenter *impl_from_IMFQualityAdvise(IMFQualityAdvise *ifac
     return CONTAINING_RECORD(iface, struct video_presenter, IMFQualityAdvise_iface);
 }
 
+static struct video_presenter *impl_from_IDirect3DDeviceManager9(IDirect3DDeviceManager9 *iface)
+{
+    return CONTAINING_RECORD(iface, struct video_presenter, IDirect3DDeviceManager9_iface);
+}
+
 static void video_presenter_notify_renderer(struct video_presenter *presenter,
         LONG event, LONG_PTR param1, LONG_PTR param2)
 {
@@ -480,6 +486,10 @@ static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFI
     {
         *obj = &presenter->IMFQualityAdvise_iface;
     }
+    else if (IsEqualIID(riid, &IID_IDirect3DDeviceManager9))
+    {
+        *obj = &presenter->IDirect3DDeviceManager9_iface;
+    }
     else
     {
         WARN("Unimplemented interface %s.\n", debugstr_guid(riid));
@@ -1486,6 +1496,85 @@ static const IMFQualityAdviseVtbl video_presenter_quality_advise_vtbl =
     video_presenter_quality_advise_DropTime,
 };
 
+static HRESULT WINAPI video_presenter_device_manager_QueryInterface(IDirect3DDeviceManager9 *iface,
+        REFIID riid, void **obj)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IMFVideoPresenter_QueryInterface(&presenter->IMFVideoPresenter_iface, riid, obj);
+}
+
+static ULONG WINAPI video_presenter_device_manager_AddRef(IDirect3DDeviceManager9 *iface)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IMFVideoPresenter_AddRef(&presenter->IMFVideoPresenter_iface);
+}
+
+static ULONG WINAPI video_presenter_device_manager_Release(IDirect3DDeviceManager9 *iface)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IMFVideoPresenter_Release(&presenter->IMFVideoPresenter_iface);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_ResetDevice(IDirect3DDeviceManager9 *iface,
+        IDirect3DDevice9 *device, UINT token)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_ResetDevice(presenter->device_manager, device, token);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_OpenDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE *hdevice)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_OpenDeviceHandle(presenter->device_manager, hdevice);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_CloseDeviceHandle(IDirect3DDeviceManager9 *iface, HANDLE hdevice)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_CloseDeviceHandle(presenter->device_manager, hdevice);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_TestDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_TestDevice(presenter->device_manager, hdevice);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_LockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice,
+        IDirect3DDevice9 **device, BOOL block)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_LockDevice(presenter->device_manager, hdevice, device, block);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_UnlockDevice(IDirect3DDeviceManager9 *iface, HANDLE hdevice,
+        BOOL savestate)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_UnlockDevice(presenter->device_manager, hdevice, savestate);
+}
+
+static HRESULT WINAPI video_presenter_device_manager_GetVideoService(IDirect3DDeviceManager9 *iface, HANDLE hdevice,
+        REFIID riid, void **service)
+{
+    struct video_presenter *presenter = impl_from_IDirect3DDeviceManager9(iface);
+    return IDirect3DDeviceManager9_GetVideoService(presenter->device_manager, hdevice, riid, service);
+}
+
+static const IDirect3DDeviceManager9Vtbl video_presenter_device_manager_vtbl =
+{
+    video_presenter_device_manager_QueryInterface,
+    video_presenter_device_manager_AddRef,
+    video_presenter_device_manager_Release,
+    video_presenter_device_manager_ResetDevice,
+    video_presenter_device_manager_OpenDeviceHandle,
+    video_presenter_device_manager_CloseDeviceHandle,
+    video_presenter_device_manager_TestDevice,
+    video_presenter_device_manager_LockDevice,
+    video_presenter_device_manager_UnlockDevice,
+    video_presenter_device_manager_GetVideoService,
+};
+
 HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj)
 {
     TRACE("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj);
@@ -1558,6 +1647,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
     object->IMFQualityAdvise_iface.lpVtbl = &video_presenter_quality_advise_vtbl;
     object->allocator_cb.lpVtbl = &video_presenter_allocator_cb_vtbl;
     object->IUnknown_inner.lpVtbl = &video_presenter_inner_vtbl;
+    object->IDirect3DDeviceManager9_iface.lpVtbl = &video_presenter_device_manager_vtbl;
     object->outer_unk = outer ? outer : &object->IUnknown_inner;
     object->refcount = 1;
     object->src_rect.right = object->src_rect.bottom = 1.0f;
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 55986414a70..34a69559b65 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1128,8 +1128,8 @@ static void test_default_presenter(void)
     IMFRateSupport *rate_support;
     IDirect3DDeviceManager9 *dm;
     IMFVideoDeviceID *deviceid;
+    IUnknown *unk, *unk2;
     HWND hwnd, hwnd2;
-    IUnknown *unk;
     DWORD flags;
     float rate;
     HRESULT hr;
@@ -1153,6 +1153,7 @@ static void test_default_presenter(void)
     check_interface(presenter, &IID_IMFVideoPresenter, TRUE);
     check_interface(presenter, &IID_IMFVideoDeviceID, TRUE);
     check_interface(presenter, &IID_IMFQualityAdvise, TRUE);
+    check_interface(presenter, &IID_IDirect3DDeviceManager9, TRUE);
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPositionMapper, TRUE);
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, TRUE);
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPresenter, TRUE);
@@ -1164,8 +1165,24 @@ static void test_default_presenter(void)
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDeviceID, TRUE);
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFQualityAdvise, TRUE);
     check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFTransform, FALSE);
+    check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
     check_service_interface(presenter, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
 
+    /* Query arbitrary supported interface back from device manager wrapper. */
+    hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IDirect3DDeviceManager9, (void **)&dm);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IDirect3DDeviceManager9_QueryInterface(dm, &IID_IQualProp, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    IUnknown_Release(unk);
+    hr = IDirect3DDeviceManager9_QueryInterface(dm, &IID_IUnknown, (void **)&unk);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IUnknown, (void **)&unk2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(unk == unk2, "Unexpected interface.\n");
+    IUnknown_Release(unk2);
+    IUnknown_Release(unk);
+    IDirect3DDeviceManager9_Release(dm);
+
     hr = MFGetService((IUnknown *)presenter, &MR_VIDEO_MIXER_SERVICE, &IID_IUnknown, (void **)&unk);
     ok(hr == MF_E_UNSUPPORTED_SERVICE, "Unexpected hr %#x.\n", hr);
 
-- 
2.29.2




More information about the wine-devel mailing list