[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