cudacontext: find associated DXGI Adapter LUID
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1807>
This commit is contained in:
parent
895f11401d
commit
1568db2c3e
@ -25,6 +25,10 @@
|
|||||||
#include "gstcudacontext.h"
|
#include "gstcudacontext.h"
|
||||||
#include "gstcudautils.h"
|
#include "gstcudautils.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_NVCODEC_GST_D3D11
|
||||||
|
#include <gst/d3d11/gstd3d11.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (gst_cuda_context_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_cuda_context_debug);
|
||||||
#define GST_CAT_DEFAULT gst_cuda_context_debug
|
#define GST_CAT_DEFAULT gst_cuda_context_debug
|
||||||
|
|
||||||
@ -35,7 +39,8 @@ G_LOCK_DEFINE_STATIC (list_lock);
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_DEVICE_ID
|
PROP_DEVICE_ID,
|
||||||
|
PROP_DXGI_ADAPTER_LUID,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstCudaContextPrivate
|
struct _GstCudaContextPrivate
|
||||||
@ -43,6 +48,7 @@ struct _GstCudaContextPrivate
|
|||||||
CUcontext context;
|
CUcontext context;
|
||||||
CUdevice device;
|
CUdevice device;
|
||||||
guint device_id;
|
guint device_id;
|
||||||
|
gint64 dxgi_adapter_luid;
|
||||||
|
|
||||||
gint tex_align;
|
gint tex_align;
|
||||||
|
|
||||||
@ -79,6 +85,15 @@ gst_cuda_context_class_init (GstCudaContextClass * klass)
|
|||||||
0, G_MAXUINT, 0,
|
0, G_MAXUINT, 0,
|
||||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
#ifdef HAVE_NVCODEC_GST_D3D11
|
||||||
|
g_object_class_install_property (gobject_class, PROP_DXGI_ADAPTER_LUID,
|
||||||
|
g_param_spec_int64 ("dxgi-adapter-luid", "DXGI Adapter LUID",
|
||||||
|
"Associated DXGI Adapter LUID (Locally Unique Identifier) ",
|
||||||
|
G_MININT64, G_MAXINT64, 0,
|
||||||
|
GST_PARAM_CONDITIONALLY_AVAILABLE | G_PARAM_READABLE |
|
||||||
|
G_PARAM_STATIC_STRINGS));
|
||||||
|
#endif
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (gst_cuda_context_debug,
|
GST_DEBUG_CATEGORY_INIT (gst_cuda_context_debug,
|
||||||
"cudacontext", 0, "CUDA Context");
|
"cudacontext", 0, "CUDA Context");
|
||||||
}
|
}
|
||||||
@ -121,12 +136,64 @@ gst_cuda_context_get_property (GObject * object, guint prop_id,
|
|||||||
case PROP_DEVICE_ID:
|
case PROP_DEVICE_ID:
|
||||||
g_value_set_uint (value, priv->device_id);
|
g_value_set_uint (value, priv->device_id);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DXGI_ADAPTER_LUID:
|
||||||
|
g_value_set_int64 (value, priv->dxgi_adapter_luid);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_NVCODEC_GST_D3D11
|
||||||
|
static gint64
|
||||||
|
gst_cuda_context_find_dxgi_adapter_luid (CUdevice cuda_device)
|
||||||
|
{
|
||||||
|
gint64 ret = 0;
|
||||||
|
HRESULT hr;
|
||||||
|
IDXGIFactory1 *factory = NULL;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
hr = CreateDXGIFactory1 (&IID_IDXGIFactory1, (void **) &factory);
|
||||||
|
if (FAILED (hr))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
IDXGIAdapter1 *adapter;
|
||||||
|
DXGI_ADAPTER_DESC desc;
|
||||||
|
CUdevice other_dev = 0;
|
||||||
|
CUresult cuda_ret;
|
||||||
|
|
||||||
|
hr = IDXGIFactory1_EnumAdapters1 (factory, i, &adapter);
|
||||||
|
if (FAILED (hr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
hr = IDXGIAdapter1_GetDesc (adapter, &desc);
|
||||||
|
if (FAILED (hr)) {
|
||||||
|
IDXGIAdapter1_Release (adapter);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (desc.VendorId != 0x10de) {
|
||||||
|
IDXGIAdapter1_Release (adapter);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cuda_ret = CuD3D11GetDevice (&other_dev, adapter);
|
||||||
|
IDXGIAdapter1_Release (adapter);
|
||||||
|
|
||||||
|
if (cuda_ret == CUDA_SUCCESS && other_dev == cuda_device) {
|
||||||
|
ret = gst_d3d11_luid_to_int64 (&desc.AdapterLuid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IDXGIFactory1_Release (factory);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_cuda_context_constructed (GObject * object)
|
gst_cuda_context_constructed (GObject * object)
|
||||||
{
|
{
|
||||||
@ -179,6 +246,9 @@ gst_cuda_context_constructed (GObject * object)
|
|||||||
|
|
||||||
priv->context = cuda_ctx;
|
priv->context = cuda_ctx;
|
||||||
priv->device = cdev;
|
priv->device = cdev;
|
||||||
|
#ifdef HAVE_NVCODEC_GST_D3D11
|
||||||
|
priv->dxgi_adapter_luid = gst_cuda_context_find_dxgi_adapter_luid (cdev);
|
||||||
|
#endif
|
||||||
|
|
||||||
G_LOCK (list_lock);
|
G_LOCK (list_lock);
|
||||||
g_object_weak_ref (G_OBJECT (object),
|
g_object_weak_ref (G_OBJECT (object),
|
||||||
|
@ -43,7 +43,7 @@ if gstgl_dep.found()
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if gstd3d11_dep.found()
|
if gstd3d11_dep.found()
|
||||||
extra_c_args += ['-DHAVE_NVCODEC_GST_D3D11=1']
|
extra_c_args += ['-DHAVE_NVCODEC_GST_D3D11=1', '-DCOBJMACROS']
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if host_system == 'linux'
|
if host_system == 'linux'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user