diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2022-12-12 19:37:52 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2023-01-04 19:22:16 +0000 |
commit | f486d1f4d2dd5340c6ca84815abc12618e648c04 (patch) | |
tree | b166a3f1a07a3f0f1aaa22fe654e60a0d13c8d0e /src/gui/rhi/qrhi.cpp | |
parent | a2e38207da61d6b177628ff8123b7fa90d157ba7 (diff) |
rhi: metal: Add enablers for pre-querying window stuff on the gui thread
Pick-to: 6.5
Task-number: QTBUG-97518
Change-Id: Ia8fb5128149c9f91ebedfa914d1fe3e3d49774dc
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/gui/rhi/qrhi.cpp')
-rw-r--r-- | src/gui/rhi/qrhi.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index ccb6db445b..cbb2280a44 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -5637,6 +5637,49 @@ bool QRhi::probe(QRhi::Implementation impl, QRhiInitParams *params) } /*! + \struct QRhiSwapChainProxyData + \internal + \inmodule QtGui + */ + +/*! + Generates and returns a QRhiSwapChainProxyData struct containing opaque + data specific to the backend and graphics API specified by \a impl. \a + window is the QWindow a swapchain is targeting. + + The returned struct can be passed to QRhiSwapChain::setProxyData(). This + makes sense in threaded rendering systems: this static function is expected + to be called on the \b{main (gui) thread}, unlike all QRhi operations, then + transferred to the thread working with the QRhi and QRhiSwapChain and passed + on to the swapchain. This allows doing native platform queries that are + only safe to be called on the main thread, for example to query the + CAMetalLayer from a NSView, and then passing on the data to the + QRhiSwapChain living on the rendering thread. With the Metal example, doing + the view.layer access on a dedicated rendering thread causes a warning in + the Xcode Thread Checker. With the data proxy mechanism, this is avoided. + + When threads are not involved, generating and passing on the + QRhiSwapChainProxyData is not required: backends are guaranteed to be able + to query whatever is needed on their own, and if everything lives on the + main (gui) thread, that should be sufficient. + + \note \a impl should match what the QRhi is created with. For example, + calling with QRhi::Metal on a non-Apple platform will not generate any + useful data. + */ +QRhiSwapChainProxyData QRhi::updateSwapChainProxyData(QRhi::Implementation impl, QWindow *window) +{ +#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) + if (impl == Metal) + return QRhiMetal::updateSwapChainProxyData(window); +#else + Q_UNUSED(impl); + Q_UNUSED(window); +#endif + return {}; +} + +/*! \return the backend type for this QRhi. */ QRhi::Implementation QRhi::backend() const |