From 3b4738bb20db7bd0da178d6d28c8661db611af2f Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 22 Jun 2020 13:45:31 +0300 Subject: [PATCH] dxva2: Add IDirectXVideoProcessorService stub. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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);