mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-29 13:11:06 +00:00
d3d12device: Hold d3d11on12 device to be shared
d3d11on12 device seems to be occupying a bit of GPU memory Hold the instance in GstD3D12Device so that it can be shared Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6697>
This commit is contained in:
parent
8e4fe98361
commit
cd97275a19
5 changed files with 123 additions and 4 deletions
|
@ -67,5 +67,26 @@
|
|||
|
||||
#define GST_D3D12_CALL_ONCE_END )
|
||||
|
||||
#endif /* __cplusplus */
|
||||
class GstD3D12Device11on12LockGuard
|
||||
{
|
||||
public:
|
||||
explicit GstD3D12Device11on12LockGuard(GstD3D12Device * device) : device_ (device)
|
||||
{
|
||||
if (device_)
|
||||
gst_d3d12_device_11on12_lock (device_);
|
||||
}
|
||||
|
||||
~GstD3D12Device11on12LockGuard()
|
||||
{
|
||||
if (device_)
|
||||
gst_d3d12_device_11on12_unlock (device_);
|
||||
}
|
||||
|
||||
GstD3D12Device11on12LockGuard(const GstD3D12Device11on12LockGuard&) = delete;
|
||||
GstD3D12Device11on12LockGuard& operator=(const GstD3D12Device11on12LockGuard&) = delete;
|
||||
|
||||
private:
|
||||
GstD3D12Device *device_;
|
||||
};
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
|
|
@ -52,5 +52,14 @@ void gst_d3d12_device_d3d12_debug (GstD3D12Device * device,
|
|||
const gchar * function,
|
||||
gint line);
|
||||
|
||||
GST_D3D12_API
|
||||
IUnknown * gst_d3d12_device_get_11on12_handle (GstD3D12Device * device);
|
||||
|
||||
GST_D3D12_API
|
||||
void gst_d3d12_device_11on12_lock (GstD3D12Device * device);
|
||||
|
||||
GST_D3D12_API
|
||||
void gst_d3d12_device_11on12_unlock (GstD3D12Device * device);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "gstd3d12-private.h"
|
||||
#include "gstd3d12commandlistpool.h"
|
||||
#include <directx/d3dx12.h>
|
||||
#include <d3d11on12.h>
|
||||
#include <wrl.h>
|
||||
#include <vector>
|
||||
#include <string.h>
|
||||
|
@ -39,6 +40,7 @@
|
|||
#include <queue>
|
||||
#include <unordered_map>
|
||||
#include <thread>
|
||||
#include <gmodule.h>
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (gst_d3d12_sdk_debug);
|
||||
|
||||
|
@ -56,6 +58,30 @@ ensure_debug_category (void)
|
|||
}
|
||||
#endif /* GST_DISABLE_GST_DEBUG */
|
||||
|
||||
static PFN_D3D11ON12_CREATE_DEVICE GstD3D11On12CreateDevice = nullptr;
|
||||
|
||||
static gboolean
|
||||
load_d3d11on12_symbol (void)
|
||||
{
|
||||
static gboolean ret = FALSE;
|
||||
static GModule *d3d11_lib_module = nullptr;
|
||||
GST_D3D12_CALL_ONCE_BEGIN {
|
||||
d3d11_lib_module = g_module_open ("d3d11.dll", G_MODULE_BIND_LAZY);
|
||||
if (!d3d11_lib_module)
|
||||
return;
|
||||
|
||||
if (!g_module_symbol (d3d11_lib_module, "D3D11On12CreateDevice",
|
||||
(gpointer *) & GstD3D11On12CreateDevice)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ret = TRUE;
|
||||
}
|
||||
GST_D3D12_CALL_ONCE_END;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
@ -146,8 +172,10 @@ struct DeviceInner
|
|||
ComPtr<ID3D12Device> device;
|
||||
ComPtr<IDXGIAdapter1> adapter;
|
||||
ComPtr<IDXGIFactory2> factory;
|
||||
ComPtr<ID3D11On12Device> device11on12;
|
||||
std::unordered_map<GstVideoFormat, GstD3D12Format> format_table;
|
||||
std::recursive_mutex extern_lock;
|
||||
std::recursive_mutex device11on12_lock;
|
||||
std::mutex lock;
|
||||
|
||||
ComPtr<ID3D12InfoQueue> info_queue;
|
||||
|
@ -1356,3 +1384,64 @@ gst_d3d12_device_is_equal (GstD3D12Device * device1, GstD3D12Device * device2)
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
IUnknown *
|
||||
gst_d3d12_device_get_11on12_handle (GstD3D12Device * device)
|
||||
{
|
||||
g_return_val_if_fail (GST_IS_D3D12_DEVICE (device), nullptr);
|
||||
|
||||
auto priv = device->priv->inner;
|
||||
std::lock_guard < std::mutex > lk (priv->lock);
|
||||
|
||||
if (!priv->device11on12) {
|
||||
if (!load_d3d11on12_symbol ()) {
|
||||
GST_WARNING_OBJECT (device, "D3D11On12CreateDevice symbol was not found");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static const D3D_FEATURE_LEVEL feature_levels[] = {
|
||||
D3D_FEATURE_LEVEL_12_1,
|
||||
D3D_FEATURE_LEVEL_12_0,
|
||||
D3D_FEATURE_LEVEL_11_1,
|
||||
D3D_FEATURE_LEVEL_11_0,
|
||||
};
|
||||
|
||||
IUnknown *cq[] =
|
||||
{ gst_d3d12_command_queue_get_handle (priv->direct_queue) };
|
||||
ComPtr < ID3D11Device > device11;
|
||||
auto hr = GstD3D11On12CreateDevice (priv->device.Get (),
|
||||
D3D11_CREATE_DEVICE_BGRA_SUPPORT, feature_levels,
|
||||
G_N_ELEMENTS (feature_levels), cq, 1, 0, &device11, nullptr, nullptr);
|
||||
if (FAILED (hr)) {
|
||||
GST_WARNING_OBJECT (device, "Couldn't create 11on12 device, hr: 0x%x",
|
||||
(guint) hr);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
hr = device11.As (&priv->device11on12);
|
||||
if (FAILED (hr)) {
|
||||
GST_ERROR_OBJECT (device, "Couldn't get 11on12 interface");
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
return priv->device11on12.Get ();
|
||||
}
|
||||
|
||||
void
|
||||
gst_d3d12_device_11on12_lock (GstD3D12Device * device)
|
||||
{
|
||||
g_return_if_fail (GST_IS_D3D12_DEVICE (device));
|
||||
|
||||
auto priv = device->priv->inner;
|
||||
priv->device11on12_lock.lock ();
|
||||
}
|
||||
|
||||
void
|
||||
gst_d3d12_device_11on12_unlock (GstD3D12Device * device)
|
||||
{
|
||||
g_return_if_fail (GST_IS_D3D12_DEVICE (device));
|
||||
|
||||
auto priv = device->priv->inner;
|
||||
priv->device11on12_lock.unlock ();
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ endif
|
|||
sdk_headers = [
|
||||
'dxgi1_6.h',
|
||||
'd3d11_1.h',
|
||||
'd3d11on12.h',
|
||||
]
|
||||
|
||||
have_d3d12_headers = true
|
||||
|
@ -125,12 +126,12 @@ endif
|
|||
|
||||
pkg_name = 'gstreamer-d3d12-' + api_version
|
||||
gstd3d12 = library('gstd3d12-' + api_version,
|
||||
d3d12_sources + hlsl_precompiled,
|
||||
d3d12_sources,
|
||||
c_args : gst_plugins_bad_args + extra_args,
|
||||
cpp_args: gst_plugins_bad_args + extra_args,
|
||||
include_directories : [configinc, libsinc],
|
||||
dependencies : [gstbase_dep, gstvideo_dep, gstd3dshader_dep, d3d12_lib,
|
||||
dxgi_lib, dx_headers_dep] + extra_deps,
|
||||
dxgi_lib, dx_headers_dep, gmodule_dep] + extra_deps,
|
||||
version : libversion,
|
||||
install : true,
|
||||
)
|
||||
|
|
|
@ -127,7 +127,6 @@ endif
|
|||
|
||||
d3d12_headers = [
|
||||
'd3d11.h',
|
||||
'd3d11on12.h',
|
||||
'd2d1.h',
|
||||
]
|
||||
|
||||
|
|
Loading…
Reference in a new issue