This commit is contained in:
Nekotekina 2014-07-10 00:02:45 +04:00
commit 3fdeb72999
11 changed files with 144 additions and 183 deletions

View File

@ -326,9 +326,9 @@ void GLFragmentDecompilerThread::Task()
case 0x02: SetDst("($0 * $1)"); break; //MUL case 0x02: SetDst("($0 * $1)"); break; //MUL
case 0x03: SetDst("($0 + $1)"); break; //ADD case 0x03: SetDst("($0 + $1)"); break; //ADD
case 0x04: SetDst("($0 * $1 + $2)"); break; //MAD case 0x04: SetDst("($0 * $1 + $2)"); break; //MAD
case 0x05: SetDst("vec2(dot($0.xyz, $1.xyz), 0).xxxx"); break; // DP3 case 0x05: SetDst("vec4(dot($0.xyz, $1.xyz))"); break; // DP3
case 0x06: SetDst("vec2(dot($0, $1), 0).xxxx"); break; // DP4 case 0x06: SetDst("vec4(dot($0, $1))"); break; // DP4
case 0x07: SetDst("vec2(distance($0, $1), 0).xxxx"); break; // DST case 0x07: SetDst("vec4(distance($0, $1))"); break; // DST
case 0x08: SetDst("min($0, $1)"); break; // MIN case 0x08: SetDst("min($0, $1)"); break; // MIN
case 0x09: SetDst("max($0, $1)"); break; // MAX case 0x09: SetDst("max($0, $1)"); break; // MAX
case 0x0a: SetDst("vec4(lessThan($0, $1))"); break; // SLT case 0x0a: SetDst("vec4(lessThan($0, $1))"); break; // SLT
@ -379,7 +379,7 @@ void GLFragmentDecompilerThread::Task()
//case 0x35: break; // BEMLUM //case 0x35: break; // BEMLUM
case 0x36: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; // RFL (reflection vector) case 0x36: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; // RFL (reflection vector)
//case 0x37: break; // TIMESWTEX //case 0x37: break; // TIMESWTEX
case 0x38: SetDst("vec2(dot($0.xy, $1.xy)).xxxx"); break; // DP2 case 0x38: SetDst("vec4(dot($0.xy, $1.xy))"); break; // DP2
case 0x39: SetDst("normalize($0.xyz)"); break; // NRM case 0x39: SetDst("normalize($0.xyz)"); break; // NRM
case 0x3a: SetDst("($0 / $1)"); break; // DIV case 0x3a: SetDst("($0 / $1)"); break; // DIV
case 0x3b: SetDst("($0 / sqrt($1))"); break; // DIVSQ case 0x3b: SetDst("($0 / sqrt($1))"); break; // DIVSQ

View File

@ -522,10 +522,10 @@ void GLVertexDecompilerThread::Task()
case 0x02: SetDSTVec("($0 * $1)"); break; //MUL case 0x02: SetDSTVec("($0 * $1)"); break; //MUL
case 0x03: SetDSTVec("($0 + $2)"); break; //ADD case 0x03: SetDSTVec("($0 + $2)"); break; //ADD
case 0x04: SetDSTVec("($0 * $1 + $2)"); break; //MAD case 0x04: SetDSTVec("($0 * $1 + $2)"); break; //MAD
case 0x05: SetDSTVec("vec2(dot($0.xyz, $1.xyz), 0.0).xxxx"); break; //DP3 case 0x05: SetDSTVec("vec4(dot($0.xyz, $1.xyz))"); break; //DP3
case 0x06: SetDSTVec("vec2(dot(vec4($0.xyz, 1.0), $1), 0.0).xxxx"); break; //DPH case 0x06: SetDSTVec("vec4(dot(vec4($0.xyz, 1.0), $1))"); break; //DPH
case 0x07: SetDSTVec("vec2(dot($0, $1), 0.0).xxxx"); break; //DP4 case 0x07: SetDSTVec("vec4(dot($0, $1))"); break; //DP4
case 0x08: SetDSTVec("vec2(distance($0, $1), 0.0).xxxx"); break; //DST case 0x08: SetDSTVec("vec4(distance($0, $1))"); break; //DST
case 0x09: SetDSTVec("min($0, $1)"); break; //MIN case 0x09: SetDSTVec("min($0, $1)"); break; //MIN
case 0x0a: SetDSTVec("max($0, $1)"); break; //MAX case 0x0a: SetDSTVec("max($0, $1)"); break; //MAX
case 0x0b: SetDSTVec("vec4(lessThan($0, $1))"); break; //SLT case 0x0b: SetDSTVec("vec4(lessThan($0, $1))"); break; //SLT

View File

@ -10,6 +10,37 @@
u32 methodRegisters[0xffff]; u32 methodRegisters[0xffff];
void RSXThread::nativeRescale(float width, float height)
{
switch (Ini.GSResolution.GetValue())
{
case 1: // 1920x1080 window size
m_width_scale = 1920 / width * 2.0f;
m_height_scale = 1080 / height * 2.0f;
m_width = 1920;
m_height = 1080;
break;
case 2: // 1280x720 window size
m_width_scale = 1280 / width * 2.0f;
m_height_scale = 720 / height * 2.0f;
m_width = 1280;
m_height = 720;
break;
case 4: // 720x480 window size
m_width_scale = 720 / width * 2.0f;
m_height_scale = 480 / height * 2.0f;
m_width = 720;
m_height = 480;
break;
case 5: // 720x576 window size
m_width_scale = 720 / width * 2.0f;
m_height_scale = 576 / height * 2.0f;
m_width = 720;
m_height = 576;
break;
}
}
u32 GetAddress(u32 offset, u8 location) u32 GetAddress(u32 offset, u8 location)
{ {
switch(location) switch(location)
@ -1338,60 +1369,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
m_width = m_buffer_width = re(buffers[m_gcm_current_buffer].width); m_width = m_buffer_width = re(buffers[m_gcm_current_buffer].width);
m_height = m_buffer_height = re(buffers[m_gcm_current_buffer].height); m_height = m_buffer_height = re(buffers[m_gcm_current_buffer].height);
// Rescale native 1080p to fit 720p/480p window size // Rescale native resolution to fit 1080p/720p/480p/576p window size
if (m_buffer_width == 1920 && m_buffer_height == 1080) nativeRescale((float)m_buffer_width, (float)m_buffer_height);
{
switch (Ini.GSResolution.GetValue())
{
case 2: // 1280x720 window size
m_width_scale = m_height_scale = 1.33f;
m_width = 1280;
m_height = 720;
break;
case 4: // 720x480 window size
m_width_scale = 0.75f;
m_height_scale = 0.88f;
m_width = 720;
m_height = 480;
break;
}
}
// Rescale native 720p to fit 480p window size
if (m_buffer_width == 1280 && m_buffer_height == 720)
{
if (Ini.GSResolution.GetValue() == 4) // 720x480 window size
{
m_width_scale = 1.125f;
m_height_scale = 1.33f;
m_width = 720;
m_height = 480;
}
}
// Rescale native 960x540 to fit 1080p/720p/480p window size
if (m_buffer_width == 960 && m_buffer_height == 540)
{
switch (Ini.GSResolution.GetValue())
{
case 1:// 1920x1080 window size
m_width_scale = m_height_scale = 4.0f;
m_width = 1980;
m_height = 1080;
break;
case 2: // 1280x720 window size
m_width_scale = m_height_scale = 2.66f;
m_width = 1280;
m_height = 720;
break;
case 4: // 720x480 window size
m_width_scale = 1.5f;
m_height_scale = 1.77f;
m_width = 720;
m_height = 480;
break;
}
}
} }
break; break;

View File

@ -595,7 +595,8 @@ protected:
u32 OutOfArgsCount(const uint x, const u32 cmd, const u32 count); u32 OutOfArgsCount(const uint x, const u32 cmd, const u32 count);
void DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u32 count); void DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u32 count);
void nativeRescale(float width, float height);
virtual void OnInit() = 0; virtual void OnInit() = 0;
virtual void OnInitThread() = 0; virtual void OnInitThread() = 0;
virtual void OnExitThread() = 0; virtual void OnExitThread() = 0;

View File

@ -232,8 +232,6 @@ static const CellVideoOutResolution ResolutionTable[] =
{1440, 1080}, //11 - 6 {1440, 1080}, //11 - 6
{1280, 1080}, //12 - 7 {1280, 1080}, //12 - 7
{960, 1080}, //13 - 8 {960, 1080}, //13 - 8
{960, 540}, //14 - 9 (Terraria [BLES01938])
{1024,768}, //15 - 10 (Eskiss Homebrew)
}; };
inline static u32 ResolutionIdToNum(u32 id) inline static u32 ResolutionIdToNum(u32 id)
@ -254,29 +252,25 @@ inline static u32 ResolutionIdToNum(u32 id)
6, //11 6, //11
7, //12 7, //12
8, //13 8, //13
9, //14
10, //15
}; };
return id <= 15 ? res[id] : 0; return id <= 13 ? res[id] : 0;
} }
inline static u32 ResolutionNumToId(u32 num) inline static u32 ResolutionNumToId(u32 num)
{ {
static const u32 res[] = static const u32 res[] =
{ {
0, 0, //0
1, 1, //1
2, 2, //2
4, 4, //3
5, 5, //4
10, 10, //5
11, 11, //6
12, 12, //7
13, 13, //8
14,
15,
}; };
return num <= 10 ? res[num] : 0; return num <= 8 ? res[num] : 0;
} }

View File

@ -1,88 +1,56 @@
#include "glviewer.h" #include "glviewer.h"
#include <QQuickWindow> #include <QQuickWindow>
#include <QOpenGLContext> #include <QOpenGLContext>
#include <QSGSimpleTextureNode>
#include <QCoreApplication> #include <QCoreApplication>
GLViewer::GLViewer(QQuickItem* parent) // This class hooks beforeRendering and allows us to draw a scene and reset GL state.
: QQuickItem(parent), // In future, we will likely want to manually control the update rate.
m_timerID(0),
m_fbo(0)
{
this->setFlag(QQuickItem::ItemHasContents);
}
GLViewer::~GLViewer() void GLRenderer::paint() {
{ // Do GL here
this->cleanup(); 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<QSGSimpleTextureNode*>(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); 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); 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; GLViewer::GLViewer()
m_fbo = 0; : m_renderer(0)
int width = this->width(); {
int height = this->height(); connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(handleWindowChanged(QQuickWindow*)));
if (width && height) { }
m_fbo = new QOpenGLFramebufferObject(width, height);
textureNode->setTexture(this->window()->createTextureFromId(m_fbo->texture(), m_fbo->size())); 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()); m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio());
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;
} }
void GLViewer::cleanup() { void GLViewer::cleanup() {
this->killTimer(m_timerID); if (m_renderer) {
m_timerID = 0; delete m_renderer;
delete m_fbo; m_renderer = 0;
m_fbo = nullptr; }
} }

View File

@ -1,23 +1,35 @@
#pragma once #pragma once
#include <QQuickItem> #include <QQuickItem>
#include <QOpenGLFramebufferObject>
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 class GLViewer : public QQuickItem
{ {
Q_OBJECT Q_OBJECT
public: public:
GLViewer(QQuickItem* parent = 0); GLViewer();
virtual ~GLViewer(); ~GLViewer() { cleanup(); }
protected: public slots:
QSGNode* updatePaintNode(QSGNode* old, UpdatePaintNodeData* data); void sync();
void timerEvent(QTimerEvent* evt); void cleanup();
private slots: private slots:
void cleanup(); void handleWindowChanged(QQuickWindow *win);
private: private:
int m_timerID; GLRenderer *m_renderer;
QOpenGLFramebufferObject* m_fbo;
}; };

View File

@ -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 // by Sacha Refshauge
#include <QGuiApplication> #include <QGuiApplication>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>

View File

@ -1,21 +1,21 @@
import QtQuick 2.1 import QtQuick 2.2
import QtQuick.Controls 1.0 import QtQuick.Controls 1.1
import QtQuick.Window 2.0 import QtQuick.Window 2.1
import GLViewer 1.0 import GLViewer 1.0
ApplicationWindow { ApplicationWindow {
visible: true visible: true
title: qsTr("RPCS3 Qt") title: qsTr("RPCS3 Qt")
width: 500 width: Screen.desktopAvailableWidth / 2
height: 500 height: Screen.desktopAvailableHeight / 2
menuBar: MenuBar { menuBar: MenuBar {
Menu { Menu {
title: qsTr("&Boot") title: qsTr("&Boot")
MenuItem { text: qsTr("&Boot Game...") } MenuItem { text: qsTr("&Boot Game...") }
MenuItem { text: qsTr("&Boot Game and Start...") }
MenuItem { text: qsTr("&Install PKG") } MenuItem { text: qsTr("&Install PKG") }
MenuSeparator {} MenuSeparator {}
MenuItem { text: qsTr("Boot &ELF") } MenuItem { text: qsTr("Boot &(S)ELF") }
MenuItem { text: qsTr("Boot &SELF") }
MenuSeparator {} MenuSeparator {}
MenuItem { text: qsTr("E\&xit"); onTriggered: Qt.quit() } MenuItem { text: qsTr("E\&xit"); onTriggered: Qt.quit() }
} }
@ -30,6 +30,7 @@ ApplicationWindow {
Menu { Menu {
title: qsTr("&Config") title: qsTr("&Config")
MenuItem { text: qsTr("&Settings") } MenuItem { text: qsTr("&Settings") }
MenuItem { text: qsTr("&PAD Settings") }
MenuSeparator {} MenuSeparator {}
MenuItem { text: qsTr("Virtual &File System Manager") } MenuItem { text: qsTr("Virtual &File System Manager") }
MenuItem { text: qsTr("Virtual &HDD Manager") } MenuItem { text: qsTr("Virtual &HDD Manager") }
@ -38,25 +39,25 @@ ApplicationWindow {
title: qsTr("&Tools") title: qsTr("&Tools")
MenuItem { text: qsTr("&ELF Compiler") } MenuItem { text: qsTr("&ELF Compiler") }
MenuItem { text: qsTr("&Memory Viewer") } MenuItem { text: qsTr("&Memory Viewer") }
MenuItem { text: qsTr("&RSX Debugger") }
} }
Menu { Menu {
title: qsTr("&Help") title: qsTr("&Help")
MenuItem { text: qsTr("&About...") } MenuItem { text: qsTr("&About...") }
} }
} }
GLViewer { GLViewer {}
anchors.fill: parent Rectangle {
Rectangle { color: Qt.rgba(0, 0.5, 0.35);
color: Qt.rgba(0, 0.5, 0.35); height: Math.round(parent.height / 2)
height: Math.round(parent.height / 2) width: height
width: height radius: width
radius: width anchors.centerIn: parent
Text {
anchors.centerIn: parent anchors.centerIn: parent
Text { font.pixelSize: parent.height / 2
anchors.centerIn: parent text: "Qt"
font.pixelSize: parent.height / 2
text: "Qt"
}
} }
} }
} }

View File

@ -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 QT += gui opengl quick
CONFIG += c++11 CONFIG += c++11

View File

@ -50,6 +50,10 @@
#endif // _DEBUG #endif // _DEBUG
#endif // MSVC_CRT_MEMLEAK_DETECTION #endif // MSVC_CRT_MEMLEAK_DETECTION
// This header should be frontend-agnostic, so don't assume wx includes everything
#include <cstdio>
#include <cstring>
#include <cassert>
#include <cstdint> #include <cstdint>
typedef unsigned int uint; typedef unsigned int uint;
@ -302,7 +306,9 @@ enum Status
#include "Emu/FS/vfsStreamMemory.h" #include "Emu/FS/vfsStreamMemory.h"
#include "Emu/FS/vfsFile.h" #include "Emu/FS/vfsFile.h"
#include "Emu/FS/vfsDir.h" #include "Emu/FS/vfsDir.h"
#ifndef QT_UI
#include "rpcs3.h" #include "rpcs3.h"
#endif
#define _PRGNAME_ "RPCS3" #define _PRGNAME_ "RPCS3"
#define _PRGVER_ "0.0.0.4" #define _PRGVER_ "0.0.0.4"