Rebase against 449b8c7e9212d0a80e28babff20f2755b7370872.

This commit is contained in:
Zebediah Figura
2020-06-22 17:21:09 -05:00
parent 102af10c89
commit 6274392d27
12 changed files with 84 additions and 798 deletions

View File

@@ -1,305 +0,0 @@
From 32344f3d3cb10c07b4dc2c5547d2226e293f730b Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Tue, 10 Feb 2015 16:34:05 +0100
Subject: [PATCH] dxva2: Implement semi-stub for Direct3DDeviceManager9
interface.
---
dlls/dxva2/Makefile.in | 2 +
dlls/dxva2/devicemanager.c | 213 +++++++++++++++++++++++++++++++++++++
dlls/dxva2/dxva2_private.h | 21 ++++
dlls/dxva2/main.c | 7 +-
4 files changed, 241 insertions(+), 2 deletions(-)
create mode 100644 dlls/dxva2/devicemanager.c
create mode 100644 dlls/dxva2/dxva2_private.h
diff --git a/dlls/dxva2/Makefile.in b/dlls/dxva2/Makefile.in
index 44e125e9b5..5c3e3842d7 100644
--- a/dlls/dxva2/Makefile.in
+++ b/dlls/dxva2/Makefile.in
@@ -1,6 +1,8 @@
MODULE = dxva2.dll
+IMPORTS = ole32
EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
+ devicemanager.c \
main.c
diff --git a/dlls/dxva2/devicemanager.c b/dlls/dxva2/devicemanager.c
new file mode 100644
index 0000000000..bba0fbc619
--- /dev/null
+++ b/dlls/dxva2/devicemanager.c
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2014 Sebastian Lackner for Pipelight
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+
+#include "wine/debug.h"
+
+#define COBJMACROS
+#include "d3d9.h"
+#include "dxva2api.h"
+#include "dxva2_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dxva2);
+
+typedef struct
+{
+ IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface;
+ LONG refCount;
+ UINT token;
+ IDirect3DDevice9 *device;
+} Direct3DDeviceManager9Impl;
+
+static inline Direct3DDeviceManager9Impl *impl_from_Direct3DDeviceManager9( IDirect3DDeviceManager9 *iface )
+{
+ return CONTAINING_RECORD(iface, Direct3DDeviceManager9Impl, IDirect3DDeviceManager9_iface);
+}
+
+/*****************************************************************************
+ * IDirect3DDeviceManager9 interface
+ */
+
+static HRESULT WINAPI Direct3DDeviceManager9_QueryInterface( IDirect3DDeviceManager9 *iface, REFIID riid, LPVOID *ppv )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+ TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), ppv);
+
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirect3DDeviceManager9))
+ *ppv = &This->IDirect3DDeviceManager9_iface;
+
+ if (*ppv)
+ {
+ IUnknown_AddRef((IUnknown *)(*ppv));
+ return S_OK;
+ }
+
+ FIXME("No interface for %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Direct3DDeviceManager9_AddRef( IDirect3DDeviceManager9 *iface )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+ ULONG refCount = InterlockedIncrement(&This->refCount);
+
+ TRACE("(%p)->() AddRef from %d\n", This, refCount - 1);
+
+ return refCount;
+}
+
+static ULONG WINAPI Direct3DDeviceManager9_Release( IDirect3DDeviceManager9 *iface )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+ ULONG refCount = InterlockedDecrement(&This->refCount);
+
+ TRACE("(%p)->() Release from %d\n", This, refCount + 1);
+
+ if (!refCount)
+ {
+ TRACE("Destroying\n");
+
+ if (This->device)
+ IDirect3DDevice9_Release(This->device);
+
+ CoTaskMemFree(This);
+ }
+
+ return refCount;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_ResetDevice( IDirect3DDeviceManager9 *iface, IDirect3DDevice9 *pDevice, UINT resetToken )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p, %u): semi-stub\n", This, pDevice, resetToken);
+
+ if (This->device)
+ return E_FAIL;
+
+ if (resetToken != This->token)
+ return E_INVALIDARG;
+
+ This->device = pDevice;
+ IDirect3DDevice9_AddRef(This->device);
+
+ /* TODO: Reset the device, verify token ... */
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_OpenDeviceHandle( IDirect3DDeviceManager9 *iface, HANDLE *phDevice )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p): semi-stub\n", This, phDevice);
+
+ *phDevice = (HANDLE)This->device;
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_CloseDeviceHandle( IDirect3DDeviceManager9 *iface, HANDLE hDevice )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p): stub\n", This, hDevice);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_TestDevice( IDirect3DDeviceManager9 *iface, HANDLE hDevice )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+ static int once = 0;
+
+ if (!once++)
+ FIXME("(%p)->(%p): stub\n", This, hDevice);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_LockDevice( IDirect3DDeviceManager9 *iface, HANDLE hDevice, IDirect3DDevice9 **ppDevice, BOOL fBlock )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p, %p, %d): semi-stub\n", This, hDevice, ppDevice, fBlock);
+
+ *ppDevice = (IDirect3DDevice9 *)hDevice;
+ IDirect3DDevice9_AddRef(*ppDevice);
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_UnlockDevice( IDirect3DDeviceManager9 *iface, HANDLE hDevice, BOOL fSaveState )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p, %d): stub\n", This, hDevice, fSaveState);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI Direct3DDeviceManager9_GetVideoService( IDirect3DDeviceManager9 *iface, HANDLE hDevice, REFIID riid, void **ppService )
+{
+ Direct3DDeviceManager9Impl *This = impl_from_Direct3DDeviceManager9(iface);
+
+ FIXME("(%p)->(%p, %p, %p): stub\n", This, hDevice, riid, ppService);
+
+ return E_NOTIMPL;
+}
+
+static const IDirect3DDeviceManager9Vtbl Direct3DDeviceManager9_VTable =
+{
+ Direct3DDeviceManager9_QueryInterface,
+ Direct3DDeviceManager9_AddRef,
+ Direct3DDeviceManager9_Release,
+ Direct3DDeviceManager9_ResetDevice,
+ Direct3DDeviceManager9_OpenDeviceHandle,
+ Direct3DDeviceManager9_CloseDeviceHandle,
+ Direct3DDeviceManager9_TestDevice,
+ Direct3DDeviceManager9_LockDevice,
+ Direct3DDeviceManager9_UnlockDevice,
+ Direct3DDeviceManager9_GetVideoService
+};
+
+HRESULT devicemanager_create( UINT *resetToken, void **ppv )
+{
+ Direct3DDeviceManager9Impl *devicemanager;
+
+ if (!resetToken || !ppv)
+ return E_INVALIDARG;
+
+ *ppv = NULL;
+
+ devicemanager = CoTaskMemAlloc(sizeof(Direct3DDeviceManager9Impl));
+ if (!devicemanager)
+ return E_OUTOFMEMORY;
+
+ devicemanager->IDirect3DDeviceManager9_iface.lpVtbl = &Direct3DDeviceManager9_VTable;
+ devicemanager->refCount = 1;
+ devicemanager->token = 0xdeadbeef; /* FIXME: provide some better value? */
+ devicemanager->device = NULL;
+
+ *resetToken = devicemanager->token;
+ *ppv = devicemanager;
+ return S_OK;
+}
diff --git a/dlls/dxva2/dxva2_private.h b/dlls/dxva2/dxva2_private.h
new file mode 100644
index 0000000000..d6e59fc6da
--- /dev/null
+++ b/dlls/dxva2/dxva2_private.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2014 Michael Müller for Pipelight
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "dxva2api.h"
+
+extern HRESULT devicemanager_create( UINT *resetToken, void **ppv ) DECLSPEC_HIDDEN;
diff --git a/dlls/dxva2/main.c b/dlls/dxva2/main.c
index 782f0dfa3d..df8f203010 100644
--- a/dlls/dxva2/main.c
+++ b/dlls/dxva2/main.c
@@ -19,8 +19,11 @@
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
+
+#define INITGUID
#include "d3d9.h"
#include "dxva2api.h"
+#include "dxva2_private.h"
#include "physicalmonitorenumerationapi.h"
#include "lowlevelmonitorconfigurationapi.h"
#include "highlevelmonitorconfigurationapi.h"
@@ -39,9 +42,9 @@ BOOL WINAPI CapabilitiesRequestAndCapabilitiesReply( HMONITOR monitor, LPSTR buf
HRESULT WINAPI DXVA2CreateDirect3DDeviceManager9( UINT *resetToken, IDirect3DDeviceManager9 **dxvManager )
{
- FIXME("(%p, %p): stub\n", resetToken, dxvManager);
+ TRACE("(%p, %p)\n", resetToken, dxvManager);
- return E_NOTIMPL;
+ return devicemanager_create( resetToken, (void **)dxvManager );
}
HRESULT WINAPI DXVA2CreateVideoService( IDirect3DDevice9 *device, REFIID riid, void **ppv )
--
2.17.1

View File

@@ -1,2 +1,4 @@
Fixes: Support for MPEG2 DXVA2 GPU video decoding through vaapi
Fixes: Support for H264 DXVA2 GPU video decoding through vaapi
# In the process of upstreaming...
Disabled: true