Nikolay Sivov : mfplat: Explicitly check for d3d device interface in ResetDevice().
Alexandre Julliard
julliard at winehq.org
Fri Nov 26 15:46:29 CST 2021
Module: wine
Branch: master
Commit: 568d0a5db41b5f83f8fc4b1baa52531c510f0abf
URL: https://source.winehq.org/git/wine.git/?a=commit;h=568d0a5db41b5f83f8fc4b1baa52531c510f0abf
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat Nov 27 00:03:57 2021 +0300
mfplat: Explicitly check for d3d device interface in ResetDevice().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfplat/main.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index d7cd0d360d9..a70d7d401a1 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -8570,7 +8570,7 @@ struct dxgi_device_manager
IMFDXGIDeviceManager IMFDXGIDeviceManager_iface;
LONG refcount;
UINT token;
- IDXGIDevice *device;
+ IUnknown *device;
unsigned int *handles;
size_t count;
@@ -8633,7 +8633,7 @@ static ULONG WINAPI dxgi_device_manager_Release(IMFDXGIDeviceManager *iface)
if (!refcount)
{
if (manager->device)
- IDXGIDevice_Release(manager->device);
+ IUnknown_Release(manager->device);
DeleteCriticalSection(&manager->cs);
free(manager->handles);
free(manager);
@@ -8709,7 +8709,7 @@ static HRESULT WINAPI dxgi_device_manager_GetVideoService(IMFDXGIDeviceManager *
if (manager->handles[idx] & DXGI_DEVICE_HANDLE_FLAG_INVALID)
hr = MF_E_DXGI_NEW_VIDEO_DEVICE;
else if (manager->handles[idx] & DXGI_DEVICE_HANDLE_FLAG_OPEN)
- hr = IDXGIDevice_QueryInterface(manager->device, riid, service);
+ hr = IUnknown_QueryInterface(manager->device, riid, service);
else
hr = E_HANDLE;
}
@@ -8738,7 +8738,7 @@ static HRESULT WINAPI dxgi_device_manager_LockDevice(IMFDXGIDeviceManager *iface
}
else if (manager->locking_tid == GetCurrentThreadId())
{
- if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(manager->device, riid, obj)))
+ if (SUCCEEDED(hr = IUnknown_QueryInterface(manager->device, riid, obj)))
dxgi_device_manager_lock_handle(manager, idx);
}
else if (manager->locking_tid && !block)
@@ -8756,7 +8756,7 @@ static HRESULT WINAPI dxgi_device_manager_LockDevice(IMFDXGIDeviceManager *iface
{
if (manager->handles[idx] & DXGI_DEVICE_HANDLE_FLAG_INVALID)
hr = MF_E_DXGI_NEW_VIDEO_DEVICE;
- else if (SUCCEEDED(hr = IDXGIDevice_QueryInterface(manager->device, riid, obj)))
+ else if (SUCCEEDED(hr = IUnknown_QueryInterface(manager->device, riid, obj)))
{
manager->locking_tid = GetCurrentThreadId();
dxgi_device_manager_lock_handle(manager, idx);
@@ -8814,7 +8814,7 @@ static HRESULT WINAPI dxgi_device_manager_OpenDeviceHandle(IMFDXGIDeviceManager
static HRESULT WINAPI dxgi_device_manager_ResetDevice(IMFDXGIDeviceManager *iface, IUnknown *device, UINT token)
{
struct dxgi_device_manager *manager = impl_from_IMFDXGIDeviceManager(iface);
- IDXGIDevice *dxgi_device;
+ IUnknown *d3d_device;
size_t i;
TRACE("%p, %p, %u.\n", iface, device, token);
@@ -8822,8 +8822,14 @@ static HRESULT WINAPI dxgi_device_manager_ResetDevice(IMFDXGIDeviceManager *ifac
if (!device || token != manager->token)
return E_INVALIDARG;
- if (FAILED(IUnknown_QueryInterface(device, &IID_IDXGIDevice, (void **)&dxgi_device)))
- return E_INVALIDARG;
+ if (FAILED(IUnknown_QueryInterface(device, &IID_ID3D11Device, (void **)&d3d_device)))
+ {
+ if (FAILED(IUnknown_QueryInterface(device, &IID_ID3D12Device, (void **)&d3d_device)))
+ {
+ WARN("Unsupported device interface.\n");
+ return E_INVALIDARG;
+ }
+ }
EnterCriticalSection(&manager->cs);
@@ -8836,9 +8842,9 @@ static HRESULT WINAPI dxgi_device_manager_ResetDevice(IMFDXGIDeviceManager *ifac
}
manager->locking_tid = 0;
manager->locks = 0;
- IDXGIDevice_Release(manager->device);
+ IUnknown_Release(manager->device);
}
- manager->device = dxgi_device;
+ manager->device = d3d_device;
LeaveCriticalSection(&manager->cs);
More information about the wine-cvs
mailing list