Make use of new DXGI adapter LUID based device context sharing.
Note that we were using DXGI adapter LUID to open MFT already.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1098>
PROP_QP_B,
PROP_REF,
PROP_D3D11_AWARE,
- PROP_ADAPTER,
+ PROP_ADAPTER_LUID,
};
#define DEFAULT_BITRATE (2 * 1024)
(GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
if (device_caps->d3d11_aware) {
- g_object_class_install_property (gobject_class, PROP_ADAPTER,
- g_param_spec_uint ("adapter", "Adapter",
- "DXGI Adapter index for creating device",
- 0, G_MAXUINT32, device_caps->adapter,
+ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
+ g_param_spec_int64 ("adapter-luid", "Adapter LUID",
+ "DXGI Adapter LUID (Locally Unique Identifier) of created device",
+ G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
case PROP_D3D11_AWARE:
g_value_set_boolean (value, klass->device_caps.d3d11_aware);
break;
- case PROP_ADAPTER:
- g_value_set_uint (value, klass->device_caps.adapter);
+ case PROP_ADAPTER_LUID:
+ g_value_set_int64 (value, klass->device_caps.adapter_luid);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
PROP_QP_B,
PROP_REF,
PROP_D3D11_AWARE,
- PROP_ADAPTER,
+ PROP_ADAPTER_LUID,
};
#define DEFAULT_BITRATE (2 * 1024)
(GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
if (device_caps->d3d11_aware) {
- g_object_class_install_property (gobject_class, PROP_ADAPTER,
- g_param_spec_uint ("adapter", "Adapter",
- "DXGI Adapter index for creating device",
- 0, G_MAXUINT32, device_caps->adapter,
+ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
+ g_param_spec_int64 ("adapter-luid", "Adapter LUID",
+ "DXGI Adapter LUID (Locally Unique Identifier) of created device",
+ G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
case PROP_D3D11_AWARE:
g_value_set_boolean (value, klass->device_caps.d3d11_aware);
break;
- case PROP_ADAPTER:
- g_value_set_uint (value, klass->device_caps.adapter);
+ case PROP_ADAPTER_LUID:
+ g_value_set_int64 (value, klass->device_caps.adapter_luid);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
{
#if GST_MF_HAVE_D3D11
GstMFVideoEnc *self = GST_MF_VIDEO_ENC (element);
+ GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (self);
+ GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps;
- gst_d3d11_handle_set_context (element, context, 0, &self->other_d3d11_device);
+ if (device_caps->d3d11_aware) {
+ gst_d3d11_handle_set_context_for_adapter_luid (element, context,
+ device_caps->adapter_luid, &self->other_d3d11_device);
+ }
#endif
GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
GstMFVideoEncClass *klass = GST_MF_VIDEO_ENC_GET_CLASS (enc);
GstMFVideoEncDeviceCaps *device_caps = &klass->device_caps;
GstMFTransformEnumParams enum_params = { 0, };
- gint64 adapter_luid = 0;
MFT_REGISTER_TYPE_INFO output_type;
gboolean ret;
ComPtr < ID3D10Multithread > multi_thread;
GstD3D11Device *device;
- if (!gst_d3d11_ensure_element_data (GST_ELEMENT_CAST (self),
- device_caps->adapter, &self->other_d3d11_device)) {
+ if (!gst_d3d11_ensure_element_data_for_adapter_luid (GST_ELEMENT (self),
+ device_caps->adapter_luid, &self->other_d3d11_device)) {
GST_ERROR_OBJECT (self, "Other d3d11 device is unavailable");
return FALSE;
}
/* Create our own device with D3D11_CREATE_DEVICE_VIDEO_SUPPORT */
- self->d3d11_device = gst_d3d11_device_new (device_caps->adapter,
+ self->d3d11_device =
+ gst_d3d11_device_new_for_adapter_luid (device_caps->adapter_luid,
D3D11_CREATE_DEVICE_VIDEO_SUPPORT);
if (!self->d3d11_device) {
GST_ERROR_OBJECT (self, "Couldn't create internal d3d11 device");
gst_clear_object (&self->d3d11_device);
return FALSE;
}
-
- g_object_get (self->d3d11_device, "adapter-luid", &adapter_luid, NULL);
}
#endif
enum_params.device_index = klass->device_index;
if (device_caps->d3d11_aware)
- enum_params.adapter_luid = adapter_luid;
+ enum_params.adapter_luid = device_caps->adapter_luid;
GST_DEBUG_OBJECT (self,
"Create MFT with enum flags: 0x%x, device index: %d, d3d11 aware: %d, "
"adapter-luid %" G_GINT64_FORMAT, klass->enum_flags, klass->device_index,
- device_caps->d3d11_aware, adapter_luid);
+ device_caps->d3d11_aware, device_caps->adapter_luid);
self->transform = gst_mf_transform_new (&enum_params);
ret = !!self->transform;
}
if (d3d11_device && (have_NV12 || have_P010) && d3d11_aware) {
- guint adapter = 0;
+ gint64 adapter_luid = 0;
GValue d3d11_formats = G_VALUE_INIT;
- g_object_get (d3d11_device, "adapter", &adapter, NULL);
+ g_object_get (d3d11_device, "adapter-luid", &adapter_luid, NULL);
d3d11_caps = gst_caps_copy (sink_caps);
gst_caps_set_features_simple (d3d11_caps,
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY));
device_caps->d3d11_aware = TRUE;
- device_caps->adapter = adapter;
+ device_caps->adapter_luid = adapter_luid;
}
#endif
/* TRUE if MFT support d3d11 and also we can use d3d11 interop */
gboolean d3d11_aware;
- /* DXGI adapter index to use, ignored if d3d11-unaware */
- guint adapter;
+ /* DXGI adapter LUID, valid only when d3d11_aware == TRUE */
+ gint64 adapter_luid;
};
struct _GstMFVideoEncClassData
PROP_CONTENT_TYPE,
PROP_LOW_LATENCY,
PROP_D3D11_AWARE,
- PROP_ADAPTER,
+ PROP_ADAPTER_LUID,
};
#define DEFAULT_BITRATE (2 * 1024)
(GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
if (device_caps->d3d11_aware) {
- g_object_class_install_property (gobject_class, PROP_ADAPTER,
- g_param_spec_uint ("adapter", "Adapter",
- "DXGI Adapter index for creating device",
- 0, G_MAXUINT32, device_caps->adapter,
+ g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
+ g_param_spec_int64 ("adapter-luid", "Adapter LUID",
+ "DXGI Adapter LUID (Locally Unique Identifier) of created device",
+ G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
case PROP_D3D11_AWARE:
g_value_set_boolean (value, klass->device_caps.d3d11_aware);
break;
- case PROP_ADAPTER:
- g_value_set_uint (value, klass->device_caps.adapter);
+ case PROP_ADAPTER_LUID:
+ g_value_set_int64 (value, klass->device_caps.adapter_luid);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);