Files
86Box-fork/src/qt/qt_rendererstack.hpp
ts-korhonen 7c2cd35965 qt: Add overload protection to renderers
Added atomic_flags for renderer buffers to prevent concurrent usage and
overloading the renderer with draw requests when it's busy.
2021-12-15 00:37:48 +02:00

68 lines
1.6 KiB
C++

#ifndef QT_RENDERERCONTAINER_HPP
#define QT_RENDERERCONTAINER_HPP
#include <QStackedWidget>
#include <QKeyEvent>
#include <QEvent>
#include <vector>
#include <atomic>
namespace Ui {
class RendererStack;
}
class RendererStack : public QStackedWidget
{
Q_OBJECT
public:
explicit RendererStack(QWidget *parent = nullptr);
~RendererStack();
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void wheelEvent(QWheelEvent *event) override;
void leaveEvent(QEvent *event) override;
void keyPressEvent(QKeyEvent* event) override
{
event->ignore();
}
void keyReleaseEvent(QKeyEvent* event) override
{
event->ignore();
}
signals:
void blitToRenderer(const QImage& img, int, int, int, int, std::atomic_flag* in_use);
public slots:
void blit(int x, int y, int w, int h);
void mousePoll();
private slots:
void on_RendererStack_currentChanged(int arg1);
private:
Ui::RendererStack *ui;
struct mouseinputdata {
int deltax, deltay, deltaz;
int mousebuttons;
};
mouseinputdata mousedata;
int x, y, w, h, sx, sy, sw, sh;
// always have a qimage available for writing, which is _probably_ unused
// worst case - it will just get reallocated because it's refcounter is > 1
// when calling bits();
int currentBuf = 0;
QVector<QImage> imagebufs;
/* atomic flag for each buffer to not overload the renderer */
std::vector<std::atomic_flag> buffers_in_use;
};
#endif // QT_RENDERERCONTAINER_HPP