From f1bfe4883218d02f8452af1d22671052a7b08b52 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 19 Sep 2025 14:50:30 +0600 Subject: [PATCH 1/2] Software renderer no longer uses QRasterWindow --- src/qt/qt_softwarerenderer.cpp | 33 ++++++++++++++++++++++++++++++--- src/qt/qt_softwarerenderer.hpp | 12 ++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index bb6c7508b..45c929db9 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -21,6 +21,7 @@ #include "qt_softwarerenderer.hpp" #include #include +#include extern "C" { #include <86box/86box.h> @@ -31,7 +32,7 @@ SoftwareRenderer::SoftwareRenderer(QWidget *parent) #ifdef __HAIKU__ : QWidget(parent) #else - : QRasterWindow(parent->windowHandle()) + : QWindow(parent->windowHandle()), m_backingStore(new QBackingStore(this)) #endif { RendererCommon::parentWidget = parent; @@ -47,12 +48,30 @@ SoftwareRenderer::SoftwareRenderer(QWidget *parent) #endif } +#ifdef __HAIKU__ void SoftwareRenderer::paintEvent(QPaintEvent *event) { (void) event; onPaint(this); } +#endif + +void +SoftwareRenderer::render() +{ + if (!isExposed()) + return; + + QRect rect(0, 0, width(), height()); + m_backingStore->beginPaint(rect); + + QPaintDevice *device = m_backingStore->paintDevice(); + onPaint(device); + + m_backingStore->endPaint(); + m_backingStore->flush(rect); +} void SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) @@ -70,7 +89,11 @@ SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) if (source != origSource) onResize(this->width(), this->height()); +#ifdef __HAIKU__ update(); +#else + render(); +#endif } void @@ -80,7 +103,8 @@ SoftwareRenderer::resizeEvent(QResizeEvent *event) #ifdef __HAIKU__ QWidget::resizeEvent(event); #else - QRasterWindow::resizeEvent(event); + QWindow::resizeEvent(event); + m_backingStore->resize(event->size()); #endif } @@ -92,7 +116,7 @@ SoftwareRenderer::event(QEvent *event) #ifdef __HAIKU__ return QWidget::event(event); #else - return QRasterWindow::event(event); + return QWindow::event(event); #endif return res; } @@ -112,6 +136,9 @@ SoftwareRenderer::onPaint(QPaintDevice *device) #endif painter.setCompositionMode(QPainter::CompositionMode_Plus); painter.drawImage(destination, *images[cur_image], source); +#ifndef __HAIKU__ + painter.end(); +#endif } std::vector> diff --git a/src/qt/qt_softwarerenderer.hpp b/src/qt/qt_softwarerenderer.hpp index ec64f7000..f8bd91338 100644 --- a/src/qt/qt_softwarerenderer.hpp +++ b/src/qt/qt_softwarerenderer.hpp @@ -2,8 +2,10 @@ #define SOFTWARERENDERER_HPP #include -#include +#include #include +#include +#include #include #include #include "qt_renderercommon.hpp" @@ -12,14 +14,16 @@ class SoftwareRenderer : #ifdef __HAIKU__ public QWidget, #else - public QRasterWindow, + public QWindow, #endif public RendererCommon { Q_OBJECT public: explicit SoftwareRenderer(QWidget *parent = nullptr); +#ifdef __HAIKU__ void paintEvent(QPaintEvent *event) override; +#endif std::vector> getBuffers() override; @@ -33,6 +37,10 @@ protected: void onPaint(QPaintDevice *device); void resizeEvent(QResizeEvent *event) override; bool event(QEvent *event) override; + + void render(); + + QScopedPointer m_backingStore; }; #endif // SOFTWARERENDERER_HPP From cdd72a18b6a635ac92024c97f88871ef2c8745d1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 19 Sep 2025 15:46:36 +0600 Subject: [PATCH 2/2] Fix resize glitches while paused --- src/qt/qt_openglrenderer.cpp | 3 +++ src/qt/qt_softwarerenderer.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index ced74024b..962fa4d30 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -1223,6 +1223,9 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event) destination.y(), destination.width(), destination.height()); + + if (video_framerate == -1) + render(); } void diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index 45c929db9..8dee1dbe3 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -105,6 +105,7 @@ SoftwareRenderer::resizeEvent(QResizeEvent *event) #else QWindow::resizeEvent(event); m_backingStore->resize(event->size()); + render(); #endif }