5#if defined(Q_OS_WIN) && defined(QGC_HAS_GST_D3D12_GPU_PATH)
9#include <QtCore/QMutexLocker>
11#include <QtGui/rhi/qrhi.h>
12#include <QtGui/rhi/qrhi_platform.h>
14#include <gst/d3d12/gstd3d12.h>
18namespace GstD3D12ContextBridge {
21GstD3DContextBridgeCommon::BridgeState s_state;
22GstD3D12Device *s_device =
nullptr;
26 if (s_state.primed)
return true;
28 QRhi *rhi = GstD3DContextBridgeCommon::checkRhiBackend(
29 s_state, GstD3D12BridgeLog(),
int(QRhi::D3D12),
"D3D12");
30 if (!rhi)
return false;
32 auto *handles =
static_cast<const QRhiD3D12NativeHandles *
>(rhi->nativeHandles());
33 if (!handles || !handles->dev) {
34 qCWarning(GstD3D12BridgeLog) <<
"QRhiD3D12NativeHandles missing ID3D12Device*";
42 const gint64 luid = (
static_cast<gint64
>(handles->adapterLuidHigh) << 32)
43 |
static_cast<gint64
>(handles->adapterLuidLow);
45 s_device = gst_d3d12_device_new_for_adapter_luid(luid);
47 qCWarning(GstD3D12BridgeLog) <<
"gst_d3d12_device_new_for_adapter_luid failed (luid=" << luid <<
")";
50 s_state.primed =
true;
51 qCInfo(GstD3D12BridgeLog) <<
"D3D12 bridge primed: shared device =" << s_device
53 GstD3DContextBridgeCommon::logAdapterMatch(rhi, luid, s_device,
54 GstD3D12BridgeLog(),
"D3D12");
62 QMutexLocker lock(&s_state.mutex);
66GstD3D12Device *currentDevice()
68 QMutexLocker lock(&s_state.mutex);
69 if (!s_device)
return nullptr;
70 return GST_D3D12_DEVICE_CAST(gst_object_ref(s_device));
73GstBusSyncReply handleSyncMessage(GstMessage *message)
75 GstElement *element = GstD3DContextBridgeCommon::matchNeedContext(
76 message, GST_D3D12_DEVICE_HANDLE_CONTEXT_TYPE);
81 QMutexLocker lock(&s_state.mutex);
82 if (!primeLocked() || !s_device) {
87 GstContext *ctx = gst_d3d12_context_new(s_device);
89 qCWarning(GstD3D12BridgeLog) <<
"gst_d3d12_context_new failed for element"
90 << GST_ELEMENT_NAME(element);
93 gst_element_set_context(element, ctx);
94 gst_context_unref(ctx);
95 gst_message_unref(message);
97 GstD3DContextBridgeCommon::logHandoff(s_state, GstD3D12BridgeLog(), element,
"D3D12");
103 QMutexLocker lock(&s_state.mutex);
104 gst_clear_object(&s_device);
105 s_state.primed =
false;
106 s_state.warnedWrongBackend =
false;
107 qCDebug(GstD3D12BridgeLog) <<
"D3D12 bridge reset";
111struct D3D12BridgeRegistrar {
112 D3D12BridgeRegistrar() {
113 GstContextBridgeRegistry::registerBridgeHandler(&GstD3D12ContextBridge::handleSyncMessage);
114 GstContextBridgeRegistry::registerResetCallback(&GstD3D12ContextBridge::reset);
117static D3D12BridgeRegistrar s_d3d12BridgeRegistrar;
struct _GstElement GstElement
#define QGC_LOGGING_CATEGORY(name, categoryStr)