qml-oled-renderer icon indicating copy to clipboard operation
qml-oled-renderer copied to clipboard

Qt6 migration

Open oskude opened this issue 1 year ago • 0 comments

Anyone having luck porting this to Qt6?

I have no idea what i'm doing, but i got it compiling with this:

diff --git a/main.cpp b/main.cpp
index da016e2..1f0ea25 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,12 +1,14 @@
 #include <QGuiApplication>
 #include <QCommandLineParser>
 #include <QStringList>
+#include <QSGRendererInterface>
 #include "oledrenderer.h"
 #include "ssd1306driver.h"

 int main(int argc, char *argv[])
 {
     QGuiApplication app(argc, argv);
+    QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
     qApp->setApplicationName("QML OLED Renderer");

     QCommandLineParser parser;
diff --git a/oledrenderer.cpp b/oledrenderer.cpp
index 0fd41e2..5ced985 100644
--- a/oledrenderer.cpp
+++ b/oledrenderer.cpp
@@ -1,6 +1,8 @@
 #include "oledrenderer.h"

 #include <QSurfaceFormat>
+#include <QQuickGraphicsDevice>
+#include <QQuickRenderTarget>

 OledRenderer::OledRenderer(QObject *parent)
     : QObject(parent)
@@ -38,7 +40,10 @@ OledRenderer::OledRenderer(QObject *parent)
         m_qmlEngine->setIncubationController(m_quickWindow->incubationController());

     m_context->makeCurrent(m_offscreenSurface);
-    m_renderControl->initialize(m_context);
+
+    m_quickWindow->setGraphicsDevice(QQuickGraphicsDevice::fromOpenGLContext(m_context));
+    if (!m_renderControl->initialize())
+        qWarning("Failed to initialize redirected Qt Quick rendering");
 }

 OledRenderer::~OledRenderer()
@@ -114,7 +119,10 @@ void OledRenderer::cleanup()
 void OledRenderer::createFbo()
 {
     m_fbo = new QOpenGLFramebufferObject(m_size * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil);
-    m_quickWindow->setRenderTarget(m_fbo);
+
+    QQuickRenderTarget rt = QQuickRenderTarget::fromOpenGLRenderBuffer(m_fbo->handle(), m_fbo->size() ,1);
+
+    m_quickWindow->setRenderTarget(rt);
 }

 void OledRenderer::destroyFbo()
@@ -166,9 +174,11 @@ bool OledRenderer::loadQml(const QString &qmlFile, const QSize &size)
 void OledRenderer::renderNext()
 {
     // Polish, synchronize and render the next frame (into our fbo).
+    m_renderControl->beginFrame();
     m_renderControl->polishItems();
     m_renderControl->sync();
     m_renderControl->render();
+    m_renderControl->endFrame();

     m_context->functions()->glFlush();

diff --git a/qml-oled-renderer.pro b/qml-oled-renderer.pro
index 46cb107..d41c21d 100644
--- a/qml-oled-renderer.pro
+++ b/qml-oled-renderer.pro
@@ -1,7 +1,7 @@
 TEMPLATE = app

 QT += qml quick
-CONFIG += c++11
+CONFIG += c++17

 SOURCES += main.cpp \
     oledrenderer.cpp \

Yet running shows a scrambled oled output and following errors:

screen 0 shmid 12
Device: /dev/i2c-1 (I2C_FUNC_I2C I2C_FUNC_SMBUS_BYTE )
Framebuffer incomplete: 0x8cd6
Failed to build texture render target for QQuickRenderTarget
QQuickWindow: No render target (neither swapchain nor custom target was provided)
QQuickWindow: No render target (neither swapchain nor custom target was provided)
QQuickWindow: No render target (neither swapchain nor custom target was provided)
# last line repeated for every renderNext()

FWIW, i'm trying this on raspberry pi 4 and the qt5 code works.

oskude avatar Apr 06 '24 08:04 oskude