From ba3838f54c834f3d7b79970d8a16afda2a6c5649 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 9 Jul 2014 01:58:01 +1000 Subject: [PATCH 1/2] Qt: Update to Qt 5.2 code base. Makes the code much simpler! --- rpcs3/rpcs3qt/glviewer.cpp | 112 +++++++++++++------------------------ rpcs3/rpcs3qt/glviewer.h | 32 +++++++---- rpcs3/rpcs3qt/main.cpp | 2 +- rpcs3/rpcs3qt/qml/main.qml | 29 +++++----- 4 files changed, 77 insertions(+), 98 deletions(-) diff --git a/rpcs3/rpcs3qt/glviewer.cpp b/rpcs3/rpcs3qt/glviewer.cpp index 22128e5c72..f05546ef04 100644 --- a/rpcs3/rpcs3qt/glviewer.cpp +++ b/rpcs3/rpcs3qt/glviewer.cpp @@ -1,88 +1,56 @@ #include "glviewer.h" #include #include -#include #include -GLViewer::GLViewer(QQuickItem* parent) - : QQuickItem(parent), - m_timerID(0), - m_fbo(0) -{ - this->setFlag(QQuickItem::ItemHasContents); -} +// This class hooks beforeRendering and allows us to draw a scene and reset GL state. +// In future, we will likely want to manually control the update rate. -GLViewer::~GLViewer() -{ - this->cleanup(); -} +void GLRenderer::paint() { + // Do GL here + glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height()); -void GLViewer::timerEvent(QTimerEvent* evt) -{ - if (evt && evt->timerId() == m_timerID) - this->update(); -} - -QSGNode* GLViewer::updatePaintNode(QSGNode* node, UpdatePaintNodeData* data) -{ - QSGSimpleTextureNode* textureNode = static_cast(node); - if (!textureNode) - textureNode = new QSGSimpleTextureNode(); - // Push Qt state. - glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); - glPushAttrib(GL_ALL_ATTRIB_BITS); - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - glShadeModel(GL_FLAT); - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDisable(GL_STENCIL_TEST); glDisable(GL_DEPTH_TEST); + + // Draw blue to the window to show that we work + glClearColor(0.2, 0, 0.8, 1); + glClear(GL_COLOR_BUFFER_BIT); + glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + // Put the GL state back to how it was in case it makes SceneGraph angry + ((QQuickWindow*)sender())->resetOpenGLState(); +} - delete m_fbo; - m_fbo = 0; - int width = this->width(); - int height = this->height(); - if (width && height) { - m_fbo = new QOpenGLFramebufferObject(width, height); - textureNode->setTexture(this->window()->createTextureFromId(m_fbo->texture(), m_fbo->size())); +GLViewer::GLViewer() + : m_renderer(0) +{ + connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(handleWindowChanged(QQuickWindow*))); +} + +void GLViewer::handleWindowChanged(QQuickWindow *win) +{ + if (win) { + connect(win, SIGNAL(beforeSynchronizing()), this, SLOT(sync()), Qt::DirectConnection); + connect(win, SIGNAL(sceneGraphInvalidated()), this, SLOT(cleanup()), Qt::DirectConnection); + // We will take over from here + win->setClearBeforeRendering(false); } - else - { - textureNode->setTexture(this->window()->createTextureFromId(0, QSize(0,0))); +} + +void GLViewer::sync() +{ + if (!m_renderer) { + m_renderer = new GLRenderer(); + connect(window(), SIGNAL(beforeRendering()), m_renderer, SLOT(paint()), Qt::DirectConnection); } - textureNode->setRect(this->boundingRect()); - - if (m_fbo) { - m_fbo->bind(); - } - // Restore (pop) Qt state. - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPopAttrib(); - glPopClientAttrib(); - - if (!m_timerID) - m_timerID = this->startTimer(16); - - return textureNode; + m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); } void GLViewer::cleanup() { - this->killTimer(m_timerID); - m_timerID = 0; - delete m_fbo; - m_fbo = nullptr; + if (m_renderer) { + delete m_renderer; + m_renderer = 0; + } } + diff --git a/rpcs3/rpcs3qt/glviewer.h b/rpcs3/rpcs3qt/glviewer.h index 7ff0009158..177e8607f3 100644 --- a/rpcs3/rpcs3qt/glviewer.h +++ b/rpcs3/rpcs3qt/glviewer.h @@ -1,23 +1,35 @@ #pragma once #include -#include + +class GLRenderer : public QObject { + Q_OBJECT +public: + GLRenderer() { } + + void setViewportSize(const QSize &size) { m_viewportSize = size; } + +public slots: + void paint(); + +private: + QSize m_viewportSize; +}; class GLViewer : public QQuickItem { - Q_OBJECT + Q_OBJECT public: - GLViewer(QQuickItem* parent = 0); - virtual ~GLViewer(); + GLViewer(); + ~GLViewer() { cleanup(); } -protected: - QSGNode* updatePaintNode(QSGNode* old, UpdatePaintNodeData* data); - void timerEvent(QTimerEvent* evt); +public slots: + void sync(); + void cleanup(); private slots: - void cleanup(); + void handleWindowChanged(QQuickWindow *win); private: - int m_timerID; - QOpenGLFramebufferObject* m_fbo; + GLRenderer *m_renderer; }; diff --git a/rpcs3/rpcs3qt/main.cpp b/rpcs3/rpcs3qt/main.cpp index 0aef5b2ab2..5bc3c32cc9 100644 --- a/rpcs3/rpcs3qt/main.cpp +++ b/rpcs3/rpcs3qt/main.cpp @@ -1,4 +1,4 @@ -// Qt5.1+ frontend implementation for rpcs3. Known to work on Windows, Linux, Mac +// Qt5.2+ frontend implementation for rpcs3. Known to work on Windows, Linux, Mac // by Sacha Refshauge #include #include diff --git a/rpcs3/rpcs3qt/qml/main.qml b/rpcs3/rpcs3qt/qml/main.qml index d115717bde..0231af1a73 100644 --- a/rpcs3/rpcs3qt/qml/main.qml +++ b/rpcs3/rpcs3qt/qml/main.qml @@ -1,6 +1,6 @@ -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import QtQuick.Window 2.0 +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Window 2.1 import GLViewer 1.0 ApplicationWindow { @@ -44,19 +44,18 @@ ApplicationWindow { MenuItem { text: qsTr("&About...") } } } - GLViewer { - anchors.fill: parent - Rectangle { - color: Qt.rgba(0, 0.5, 0.35); - height: Math.round(parent.height / 2) - width: height - radius: width + GLViewer {} + Rectangle { + color: Qt.rgba(0, 0.5, 0.35); + height: Math.round(parent.height / 2) + width: height + radius: width + anchors.centerIn: parent + Text { anchors.centerIn: parent - Text { - anchors.centerIn: parent - font.pixelSize: parent.height / 2 - text: "Qt" - } + font.pixelSize: parent.height / 2 + text: "Qt" } } + } From 2ba5ada9f81203666297beedc1e85274daa98db3 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 9 Jul 2014 02:26:31 +1000 Subject: [PATCH 2/2] Qt: Update to match rest of emu. --- rpcs3/rpcs3qt/qml/main.qml | 10 ++++++---- rpcs3/rpcs3qt/rpcs3qt.pro | 2 +- rpcs3/stdafx.h | 6 ++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/rpcs3/rpcs3qt/qml/main.qml b/rpcs3/rpcs3qt/qml/main.qml index 0231af1a73..e6307bc49b 100644 --- a/rpcs3/rpcs3qt/qml/main.qml +++ b/rpcs3/rpcs3qt/qml/main.qml @@ -6,16 +6,16 @@ import GLViewer 1.0 ApplicationWindow { visible: true title: qsTr("RPCS3 Qt") - width: 500 - height: 500 + width: Screen.desktopAvailableWidth / 2 + height: Screen.desktopAvailableHeight / 2 menuBar: MenuBar { Menu { title: qsTr("&Boot") MenuItem { text: qsTr("&Boot Game...") } + MenuItem { text: qsTr("&Boot Game and Start...") } MenuItem { text: qsTr("&Install PKG") } MenuSeparator {} - MenuItem { text: qsTr("Boot &ELF") } - MenuItem { text: qsTr("Boot &SELF") } + MenuItem { text: qsTr("Boot &(S)ELF") } MenuSeparator {} MenuItem { text: qsTr("E\&xit"); onTriggered: Qt.quit() } } @@ -30,6 +30,7 @@ ApplicationWindow { Menu { title: qsTr("&Config") MenuItem { text: qsTr("&Settings") } + MenuItem { text: qsTr("&PAD Settings") } MenuSeparator {} MenuItem { text: qsTr("Virtual &File System Manager") } MenuItem { text: qsTr("Virtual &HDD Manager") } @@ -38,6 +39,7 @@ ApplicationWindow { title: qsTr("&Tools") MenuItem { text: qsTr("&ELF Compiler") } MenuItem { text: qsTr("&Memory Viewer") } + MenuItem { text: qsTr("&RSX Debugger") } } Menu { title: qsTr("&Help") diff --git a/rpcs3/rpcs3qt/rpcs3qt.pro b/rpcs3/rpcs3qt/rpcs3qt.pro index 977c740315..6bdf680161 100644 --- a/rpcs3/rpcs3qt/rpcs3qt.pro +++ b/rpcs3/rpcs3qt/rpcs3qt.pro @@ -1,4 +1,4 @@ -# Qt5.1+ project for rpcs3. Works on Windows, Linux and Mac OSX +# Qt5.2+ project for rpcs3. Works on Windows, Linux and Mac OSX QT += gui opengl quick CONFIG += c++11 diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index 77a9cac9b3..4fbb2d8d3e 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -50,6 +50,10 @@ #endif // _DEBUG #endif // MSVC_CRT_MEMLEAK_DETECTION +// This header should be frontend-agnostic, so don't assume wx includes everything +#include +#include +#include #include typedef unsigned int uint; @@ -302,7 +306,9 @@ enum Status #include "Emu/FS/vfsStreamMemory.h" #include "Emu/FS/vfsFile.h" #include "Emu/FS/vfsDir.h" +#ifndef QT_UI #include "rpcs3.h" +#endif #define _PRGNAME_ "RPCS3" #define _PRGVER_ "0.0.0.4"