Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC
Commits: ba85af7d by Fatih Uzunoglu at 2026-06-09T14:03:34+02:00 qt: add `priority` parameter in `AsyncTask::start()` - - - - - cb361557 by Fatih Uzunoglu at 2026-06-09T14:03:34+02:00 qt: do asynchronous rhi probing at start in a separate thread Qt Rhi docs clearly notes [1] that QRhi instance may be created in any thread. With this change, we make sure to not slow down the start. Non-threaded asynchronous probing does not guarantee that the start of the interface is not slowed down, because many things in the interface depends on queued events. [1] https://doc.qt.io/qt-6/qrhi.html#threading - - - - - 2 changed files: - modules/gui/qt/qt.cpp - modules/gui/qt/util/asynctask.hpp Changes: ===================================== modules/gui/qt/qt.cpp ===================================== @@ -61,6 +61,8 @@ extern "C" char **environ; #include <QTranslator> #ifdef _WIN32 #include <QOperatingSystemVersion> +#include <QThreadPool> +#include "util/asynctask.hpp" #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) #include <rhi/qrhi.h> #include <QOffscreenSurface> @@ -1062,19 +1064,42 @@ static void *Thread( void *obj ) // item. Currently the player waits for the interface, and QQuickWindow initialization // is therefore not enforced to be synchronous (`QWindow::setVisible(true)` which // initializes the scene graph thus rhi is asynchronous). - QMetaObject::invokeMethod(&app, [&app, settings = QPointer(p_intf->mainSettings)]() { + + class RhiProbeTask : public AsyncTask<QPair<QSGRendererInterface::GraphicsApi, bool>> + { + public: + RhiProbeTask() = default; + + QPair<QSGRendererInterface::GraphicsApi, bool> execute() override + { + return probeRhi(); + } + }; + + const auto rhiProbeTask = QPointer(new RhiProbeTask); + QObject::connect(rhiProbeTask, &BaseAsyncTask::result, qApp, [rhiProbeTask, settings = QPointer(p_intf->mainSettings)]() { // We can not use `QQuickWindow::setGraphicsApi()` here, as QQuickWindow // may have already tried to initialize the scene graph hence rhi. If the // cached graphics api is not optimal or not available anymore, the next // startup will use the refreshed value. That's the best we can do here // without forcing QQuickWindow to wait (hence delaying startup). assert(settings); - const auto rhiResult = probeRhi(); + const QPair<QSGRendererInterface::GraphicsApi, bool> rhiResult = rhiProbeTask->takeResult(); settings->setValue(graphicsApiKey, static_cast<int>(rhiResult.first)); settings->setValue(graphicsApiRhiSoftwareKey, rhiResult.second); settings->sync(); - app.setProperty(asyncRhiProbeCompletedProperty, true); - }, Qt::QueuedConnection); // Asynchronous, so probing here does not cause start-up slowdown. + qApp->setProperty(asyncRhiProbeCompletedProperty, true); + qDebug() << "Asynchronous rhi re-probe completed. Graphics api (QSGRendererInterface::GraphicsApi):" + << rhiResult.first + << "Prefer software renderer:" + << rhiResult.second; + rhiProbeTask->abandon(); + }, Qt::QueuedConnection); + + const auto globalThreadPool = QThreadPool::globalInstance(); + assert(globalThreadPool); + + rhiProbeTask->start(*globalThreadPool, -1); } else { ===================================== modules/gui/qt/util/asynctask.hpp ===================================== @@ -157,11 +157,11 @@ public: /** * Start the task on the thread pool */ - void start(QThreadPool &threadPool) + void start(QThreadPool &threadPool, int priority = 0) { m_threadPool = &threadPool; m_runnable = std::make_unique<Runnable>(this); - threadPool.start(&*m_runnable); + threadPool.start(&*m_runnable, priority); } /** View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e8f4a3d3ac7e94b95762e0bbc8b7010c06ad1d2b...cb361557b790d891fbf6b1fd3eb030f5bfc018da -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/e8f4a3d3ac7e94b95762e0bbc8b7010c06ad1d2b...cb361557b790d891fbf6b1fd3eb030f5bfc018da You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
