don't need the reqUpdate_() slot, update is already a slot. lock the image data with a mutex

This commit is contained in:
Joakim L. Gilje
2021-12-03 12:57:56 +01:00
parent 363f582a81
commit 4c98de9bcd
2 changed files with 26 additions and 30 deletions

View File

@@ -60,20 +60,14 @@ void GLESWidget::resizeGL(int w, int h)
void GLESWidget::initializeGL() void GLESWidget::initializeGL()
{ {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
connect(this, &GLESWidget::reqUpdate, this, &GLESWidget::reqUpdate_); connect(this, &GLESWidget::reqUpdate, this, static_cast<void (GLESWidget::*)()>(&GLESWidget::update));
} }
void GLESWidget::paintGL() void GLESWidget::paintGL()
{ {
std::scoped_lock lock(image_mx);
QPainter painter(this); QPainter painter(this);
painter.drawImage(QRect(0, 0, width(), height()), m_image.convertToFormat(QImage::Format_RGBX8888), QRect(sx, sy, sw, sh)); painter.drawImage(QRect(0, 0, width(), height()), m_image.convertToFormat(QImage::Format_RGBX8888), QRect(sx, sy, sw, sh));
painter.end();
firstupdate = true;
}
void GLESWidget::reqUpdate_()
{
update();
} }
void GLESWidget::mouseReleaseEvent(QMouseEvent *event) void GLESWidget::mouseReleaseEvent(QMouseEvent *event)
@@ -136,26 +130,28 @@ void GLESWidget::mouseMoveEvent(QMouseEvent *event)
void GLESWidget::qt_real_blit(int x, int y, int w, int h) void GLESWidget::qt_real_blit(int x, int y, int w, int h)
{ {
if ((w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || !firstupdate)
{ {
std::scoped_lock lock(image_mx);
if ((w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL))
{
video_blit_complete();
return;
}
sx = x;
sy = y;
sw = this->w = w;
sh = this->h = h;
static auto imagebits = m_image.bits();
for (int y1 = y; y1 < (y + h - 1); y1++)
{
auto scanline = imagebits + (y1 * (2048 + 64) * 4);
video_copy(scanline + (x * 4), &(buffer32->line[y1][x]), w * 4);
}
if (screenshots)
{
video_screenshot((uint32_t *)imagebits, 0, 0, 2048 + 64);
}
video_blit_complete(); video_blit_complete();
return;
} }
sx = x; reqUpdate();
sy = y;
sw = this->w = w;
sh = this->h = h;
static auto imagebits = m_image.bits();
for (int y1 = y; y1 < (y + h - 1); y1++)
{
auto scanline = imagebits + (y1 * (2048 + 64) * 4);
video_copy(scanline + (x * 4), &(buffer32->line[y1][x]), w * 4);
}
if (screenshots)
{
video_screenshot((uint32_t *)imagebits, 0, 0, 2048 + 64);
}
video_blit_complete();
firstupdate = false;
this->reqUpdate();
} }

View File

@@ -7,7 +7,8 @@
#include <QKeyEvent> #include <QKeyEvent>
#include <atomic> #include <atomic>
#include <qapplication.h> #include <mutex>
#include <QApplication>
#ifdef WAYLAND #ifdef WAYLAND
#include "wl_mouse.hpp" #include "wl_mouse.hpp"
@@ -19,6 +20,7 @@ class GLESWidget : public QOpenGLWidget, protected QOpenGLFunctions
private: private:
QImage m_image{QSize(2048 + 64, 2048 + 64), QImage::Format_RGB32}; QImage m_image{QSize(2048 + 64, 2048 + 64), QImage::Format_RGB32};
std::mutex image_mx;
int x, y, w, h, sx, sy, sw, sh; int x, y, w, h, sx, sy, sw, sh;
bool wayland = false; bool wayland = false;
public: public:
@@ -58,7 +60,6 @@ signals:
public slots: public slots:
void qt_real_blit(int x, int y, int w, int h); void qt_real_blit(int x, int y, int w, int h);
void qt_mouse_poll(); void qt_mouse_poll();
void reqUpdate_();
private: private:
struct mouseinputdata { struct mouseinputdata {
@@ -66,5 +67,4 @@ private:
int mousebuttons; int mousebuttons;
}; };
mouseinputdata mousedata; mouseinputdata mousedata;
std::atomic<bool> firstupdate{false};
}; };