From 7c0652b7aceac9193753f1b5951345fee03beaaa Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 Jul 2021 16:29:15 +0300 Subject: [PATCH] QmlPuppet: Small optimization to rendering 2D content in 3D scene There is no need to read back the texture into image when rendering 2D content for embedding into 3D scene, so don't do that. Change-Id: If84619bdc20e6997733effc4745a496fab69e5b8 Reviewed-by: Mahmoud Badri --- .../qt5informationnodeinstanceserver.cpp | 3 +-- .../instances/qt5nodeinstanceserver.cpp | 19 +++++++++++++++++++ .../instances/qt5nodeinstanceserver.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 5f50446b9e8..94f71cd52ff 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -800,8 +800,7 @@ void Qt5InformationNodeInstanceServer::doRender3DEditView() #else if (m_render2D) { // Render 2D content, as it might be used by 3D content - grabWindow(); - m_render2D = false; + m_render2D = !renderWindow(); } renderImage = grabRenderControl(m_editView3DData); #endif diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index a669aad6fc9..3e75228b86c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -308,6 +308,25 @@ QImage Qt5NodeInstanceServer::grabRenderControl(RenderViewData &viewData) return renderImage; } +// This method simply renders the window without grabbing it +bool Qt5NodeInstanceServer::renderWindow() +{ +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + if (!m_viewData.rootItem || (m_viewData.bufferDirty && !initRhi(m_viewData))) + return false; + + m_viewData.renderControl->polishItems(); + m_viewData.renderControl->beginFrame(); + m_viewData.renderControl->sync(); + m_viewData.renderControl->render(); + m_viewData.renderControl->endFrame(); + return true; +#else + Q_UNUSED(viewData) +#endif + return false; +} + QImage Qt5NodeInstanceServer::grabWindow() { if (m_viewData.rootItem) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h index e6a2754f997..9a7d43635df 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -94,6 +94,7 @@ protected: virtual bool initRhi(RenderViewData &viewData); virtual QImage grabRenderControl(RenderViewData &viewData); + virtual bool renderWindow(); private: RenderViewData m_viewData;