[PATCH 3/3] dxva2: Add IDirectXVideoProcessorService stub.
Nikolay Sivov
nsivov at codeweavers.com
Mon Jun 22 05:45:31 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dxva2/main.c | 141 ++++++++++++++++++++++++++++++++++++++-
dlls/dxva2/tests/dxva2.c | 5 +-
2 files changed, 140 insertions(+), 6 deletions(-)
diff --git a/dlls/dxva2/main.c b/dlls/dxva2/main.c
index 7e983a43dd6..7ba8d9806b1 100644
--- a/dlls/dxva2/main.c
+++ b/dlls/dxva2/main.c
@@ -47,6 +47,7 @@ struct device_handle
struct device_manager
{
IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface;
+ IDirectXVideoProcessorService IDirectXVideoProcessorService_iface;
LONG refcount;
IDirect3DDevice9 *device;
@@ -91,6 +92,115 @@ static struct device_manager *impl_from_IDirect3DDeviceManager9(IDirect3DDeviceM
return CONTAINING_RECORD(iface, struct device_manager, IDirect3DDeviceManager9_iface);
}
+static struct device_manager *impl_from_IDirectXVideoProcessorService(IDirectXVideoProcessorService *iface)
+{
+ return CONTAINING_RECORD(iface, struct device_manager, IDirectXVideoProcessorService_iface);
+}
+
+static HRESULT WINAPI device_manager_processor_service_QueryInterface(IDirectXVideoProcessorService *iface,
+ REFIID riid, void **obj)
+{
+ if (IsEqualIID(riid, &IID_IDirectXVideoProcessorService) ||
+ IsEqualIID(riid, &IID_IUnknown))
+ {
+ *obj = iface;
+ IDirectXVideoProcessorService_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("Unsupported interface %s.\n", debugstr_guid(riid));
+ *obj = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI device_manager_processor_service_AddRef(IDirectXVideoProcessorService *iface)
+{
+ struct device_manager *manager = impl_from_IDirectXVideoProcessorService(iface);
+ return IDirect3DDeviceManager9_AddRef(&manager->IDirect3DDeviceManager9_iface);
+}
+
+static ULONG WINAPI device_manager_processor_service_Release(IDirectXVideoProcessorService *iface)
+{
+ struct device_manager *manager = impl_from_IDirectXVideoProcessorService(iface);
+ return IDirect3DDeviceManager9_Release(&manager->IDirect3DDeviceManager9_iface);
+}
+
+static HRESULT WINAPI device_manager_processor_service_CreateSurface(IDirectXVideoProcessorService *iface,
+ UINT width, UINT height, UINT backbuffers, D3DFORMAT format, D3DPOOL pool, DWORD usage, DWORD dxvaType,
+ IDirect3DSurface9 **surface, HANDLE *shared_handle)
+{
+ FIXME("%p, %u, %u, %u, %u, %u, %u, %u, %p, %p.\n", iface, width, height, backbuffers, format, pool, usage, dxvaType,
+ surface, shared_handle);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_RegisterVideoProcessorSoftwareDevice(
+ IDirectXVideoProcessorService *iface, void *callbacks)
+{
+ FIXME("%p, %p.\n", iface, callbacks);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorDeviceGuids(
+ IDirectXVideoProcessorService *iface, const DXVA2_VideoDesc *video_desc, UINT *count, GUID **guids)
+{
+ FIXME("%p, %p, %p, %p.\n", iface, video_desc, count, guids);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorRenderTargets(
+ IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc, UINT *count,
+ D3DFORMAT **formats)
+{
+ FIXME("%p, %s, %p, %p, %p.\n", iface, debugstr_guid(deviceguid), video_desc, count, formats);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorSubStreamFormats(
+ IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
+ D3DFORMAT rt_format, UINT *count, D3DFORMAT **formats)
+{
+ FIXME("%p, %s, %p, %u, %p, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, count, formats);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_GetVideoProcessorCaps(
+ IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
+ D3DFORMAT rt_format, DXVA2_VideoProcessorCaps *caps)
+{
+ FIXME("%p, %s, %p, %u, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, caps);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI device_manager_processor_service_GetProcAmpRange(
+ IDirectXVideoProcessorService *iface, REFGUID deviceguid, const DXVA2_VideoDesc *video_desc,
+ D3DFORMAT rt_format, UINT ProcAmpCap, DXVA2_ValueRange *range)
+{
+ FIXME("%p, %s, %p, %u, %u, %p.\n", iface, debugstr_guid(deviceguid), video_desc, rt_format, ProcAmpCap, range);
+
+ return E_NOTIMPL;
+}
+
+static const IDirectXVideoProcessorServiceVtbl device_manager_processor_service_vtbl =
+{
+ device_manager_processor_service_QueryInterface,
+ device_manager_processor_service_AddRef,
+ device_manager_processor_service_Release,
+ device_manager_processor_service_CreateSurface,
+ device_manager_processor_service_RegisterVideoProcessorSoftwareDevice,
+ device_manager_processor_service_GetVideoProcessorDeviceGuids,
+ device_manager_processor_service_GetVideoProcessorRenderTargets,
+ device_manager_processor_service_GetVideoProcessorSubStreamFormats,
+ device_manager_processor_service_GetVideoProcessorCaps,
+ device_manager_processor_service_GetProcAmpRange,
+};
+
static HRESULT WINAPI device_manager_QueryInterface(IDirect3DDeviceManager9 *iface, REFIID riid, void **obj)
{
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
@@ -276,9 +386,35 @@ static HRESULT WINAPI device_manager_UnlockDevice(IDirect3DDeviceManager9 *iface
static HRESULT WINAPI device_manager_GetVideoService(IDirect3DDeviceManager9 *iface, HANDLE hdevice, REFIID riid,
void **obj)
{
- FIXME("%p, %p, %s, %p.\n", iface, hdevice, debugstr_guid(riid), obj);
+ struct device_manager *manager = impl_from_IDirect3DDeviceManager9(iface);
+ HRESULT hr;
+ size_t idx;
- return E_NOTIMPL;
+ TRACE("%p, %p, %s, %p.\n", iface, hdevice, debugstr_guid(riid), obj);
+
+ EnterCriticalSection(&manager->cs);
+ if (SUCCEEDED(hr = device_manager_get_handle_index(manager, hdevice, &idx)))
+ {
+ unsigned int flags = manager->handles[idx].flags;
+
+ if (flags & HANDLE_FLAG_INVALID)
+ hr = DXVA2_E_NEW_VIDEO_DEVICE;
+ else if (!(flags & HANDLE_FLAG_OPEN))
+ hr = E_HANDLE;
+ else if (IsEqualIID(riid, &IID_IDirectXVideoProcessorService))
+ {
+ *obj = &manager->IDirectXVideoProcessorService_iface;
+ IUnknown_AddRef((IUnknown *)*obj);
+ }
+ else
+ {
+ WARN("Unsupported service %s.\n", debugstr_guid(riid));
+ hr = E_UNEXPECTED;
+ }
+ }
+ LeaveCriticalSection(&manager->cs);
+
+ return hr;
}
static const IDirect3DDeviceManager9Vtbl device_manager_vtbl =
@@ -315,6 +451,7 @@ HRESULT WINAPI DXVA2CreateDirect3DDeviceManager9(UINT *token, IDirect3DDeviceMan
return E_OUTOFMEMORY;
object->IDirect3DDeviceManager9_iface.lpVtbl = &device_manager_vtbl;
+ object->IDirectXVideoProcessorService_iface.lpVtbl = &device_manager_processor_service_vtbl;
object->refcount = 1;
object->token = GetTickCount();
InitializeCriticalSection(&object->cs);
diff --git a/dlls/dxva2/tests/dxva2.c b/dlls/dxva2/tests/dxva2.c
index 605a69dd5a5..65771fb5874 100644
--- a/dlls/dxva2/tests/dxva2.c
+++ b/dlls/dxva2/tests/dxva2.c
@@ -134,10 +134,8 @@ static void test_device_manager(void)
hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
(void **)&processor_service);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- if (SUCCEEDED(hr))
- IDirectXVideoProcessorService_Release(processor_service);
+ IDirectXVideoProcessorService_Release(processor_service);
device2 = create_device(d3d, window);
hr = IDirect3DDeviceManager9_ResetDevice(manager, device2, token);
@@ -145,7 +143,6 @@ todo_wine
hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService,
(void **)&processor_service);
-todo_wine
ok(hr == DXVA2_E_NEW_VIDEO_DEVICE, "Unexpected hr %#x.\n", hr);
hr = IDirect3DDeviceManager9_TestDevice(manager, handle);
--
2.27.0
More information about the wine-devel
mailing list