[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