5#if defined(Q_OS_WIN) && defined(QGC_HAS_GST_D3D11_GPU_PATH)
9#include <QtCore/QMutexLocker>
11#include <QtGui/rhi/qrhi.h>
12#include <QtGui/rhi/qrhi_platform.h>
14#include <gst/d3d11/gstd3d11.h>
18namespace GstD3D11ContextBridge {
21GstD3DContextBridgeCommon::BridgeState s_state;
22GstD3D11Device *s_device =
nullptr;
26 if (s_state.primed)
return true;
28 QRhi *rhi = GstD3DContextBridgeCommon::checkRhiBackend(
29 s_state, GstD3D11BridgeLog(),
int(QRhi::D3D11),
"D3D11");
30 if (!rhi)
return false;
32 auto *handles =
static_cast<const QRhiD3D11NativeHandles *
>(rhi->nativeHandles());
33 if (!handles || !handles->dev) {
34 qCWarning(GstD3D11BridgeLog) <<
"QRhiD3D11NativeHandles missing ID3D11Device*";
39 s_device = gst_d3d11_device_new_wrapped(
static_cast<ID3D11Device *
>(handles->dev));
41 qCWarning(GstD3D11BridgeLog) <<
"gst_d3d11_device_new_wrapped failed";
44 s_state.primed =
true;
45 qCInfo(GstD3D11BridgeLog) <<
"D3D11 bridge primed: shared device =" << s_device;
47 const gint64 expectedLuid = (
static_cast<gint64
>(handles->adapterLuidHigh) << 32)
48 | (
static_cast<gint64
>(handles->adapterLuidLow) & 0xFFFFFFFFLL);
49 GstD3DContextBridgeCommon::logAdapterMatch(rhi, expectedLuid, s_device,
50 GstD3D11BridgeLog(),
"D3D11");
58 QMutexLocker lock(&s_state.mutex);
62GstD3D11Device *currentDevice()
64 QMutexLocker lock(&s_state.mutex);
65 if (!s_device)
return nullptr;
66 return GST_D3D11_DEVICE_CAST(gst_object_ref(s_device));
69GstBusSyncReply handleSyncMessage(GstMessage *message)
71 GstElement *element = GstD3DContextBridgeCommon::matchNeedContext(
72 message, GST_D3D11_DEVICE_HANDLE_CONTEXT_TYPE);
77 QMutexLocker lock(&s_state.mutex);
78 if (!primeLocked() || !s_device) {
83 GstContext *ctx = gst_d3d11_context_new(s_device);
85 qCWarning(GstD3D11BridgeLog) <<
"gst_d3d11_context_new failed for element"
86 << GST_ELEMENT_NAME(element);
89 gst_element_set_context(element, ctx);
90 gst_context_unref(ctx);
91 gst_message_unref(message);
92 GstD3DContextBridgeCommon::logHandoff(s_state, GstD3D11BridgeLog(), element,
"D3D11");
98 QMutexLocker lock(&s_state.mutex);
99 gst_clear_object(&s_device);
100 s_state.primed =
false;
101 s_state.warnedWrongBackend =
false;
102 qCDebug(GstD3D11BridgeLog) <<
"D3D11 bridge reset";
106struct D3D11BridgeRegistrar {
107 D3D11BridgeRegistrar() {
108 GstContextBridgeRegistry::registerBridgeHandler(&GstD3D11ContextBridge::handleSyncMessage);
109 GstContextBridgeRegistry::registerResetCallback(&GstD3D11ContextBridge::reset);
112static D3D11BridgeRegistrar s_d3d11BridgeRegistrar;
struct _GstElement GstElement
#define QGC_LOGGING_CATEGORY(name, categoryStr)