a bit of frontend refactoring
This commit is contained in:
parent
8fd46e5f8c
commit
3efbf1b813
|
@ -27,28 +27,48 @@
|
||||||
namespace Frontend
|
namespace Frontend
|
||||||
{
|
{
|
||||||
|
|
||||||
|
enum ScreenLayout
|
||||||
|
{
|
||||||
|
screenLayout_Natural, // top screen above bottom screen always
|
||||||
|
screenLayout_Horizontal,
|
||||||
|
screenLayout_Vertical,
|
||||||
|
screenLayout_Hybrid,
|
||||||
|
screenLayout_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ScreenRotation
|
||||||
|
{
|
||||||
|
screenRot_0Deg,
|
||||||
|
screenRot_90Deg,
|
||||||
|
screenRot_180Deg,
|
||||||
|
screenRot_270Deg,
|
||||||
|
screenRot_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ScreenSizing
|
||||||
|
{
|
||||||
|
screenSizing_Even, // both screens get same size
|
||||||
|
screenSizing_EmphTop, // make top screen as big as possible, fit bottom screen in remaining space
|
||||||
|
screenSizing_EmphBot,
|
||||||
|
screenSizing_Auto, // not applied in SetupScreenLayout
|
||||||
|
screenSizing_TopOnly,
|
||||||
|
screenSizing_BotOnly,
|
||||||
|
screenSizing_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
// setup the display layout based on the provided display size and parameters
|
// setup the display layout based on the provided display size and parameters
|
||||||
// * screenWidth/screenHeight: size of the host display
|
// * screenWidth/screenHeight: size of the host display
|
||||||
// * screenLayout: how the DS screens are laid out
|
// * screenLayout: how the DS screens are laid out
|
||||||
// 0 = natural (top screen above bottom screen always)
|
// * rotation: angle at which the DS screens are presented
|
||||||
// 1 = vertical
|
|
||||||
// 2 = horizontal
|
|
||||||
// 3 = hybrid
|
|
||||||
// * rotation: angle at which the DS screens are presented: 0/1/2/3 = 0/90/180/270
|
|
||||||
// * sizing: how the display size is shared between the two screens
|
// * sizing: how the display size is shared between the two screens
|
||||||
// 0 = even (both screens get same size)
|
// * screenGap: size of the gap between the two screens in pixels
|
||||||
// 1 = emphasize top screen (make top screen as big as possible, fit bottom screen in remaining space)
|
|
||||||
// 2 = emphasize bottom screen
|
|
||||||
// 4 = top only
|
|
||||||
// 5 = bottom only
|
|
||||||
// * screenGap: size of the gap between the two screens
|
|
||||||
// * integerScale: force screens to be scaled up at integer scaling factors
|
// * integerScale: force screens to be scaled up at integer scaling factors
|
||||||
// * screenSwap: whether to swap the position of both screens
|
// * screenSwap: whether to swap the position of both screens
|
||||||
// * topAspect/botAspect: ratio by which to scale the top and bottom screen respectively
|
// * topAspect/botAspect: ratio by which to scale the top and bottom screen respectively
|
||||||
void SetupScreenLayout(int screenWidth, int screenHeight,
|
void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
int screenLayout,
|
ScreenLayout screenLayout,
|
||||||
int rotation,
|
ScreenRotation rotation,
|
||||||
int sizing,
|
ScreenSizing sizing,
|
||||||
int screenGap,
|
int screenGap,
|
||||||
bool integerScale,
|
bool integerScale,
|
||||||
bool swapScreens,
|
bool swapScreens,
|
||||||
|
|
|
@ -123,9 +123,9 @@ void M23_Transform(float* m, float& x, float& y)
|
||||||
|
|
||||||
|
|
||||||
void SetupScreenLayout(int screenWidth, int screenHeight,
|
void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
int screenLayout,
|
ScreenLayout screenLayout,
|
||||||
int rotation,
|
ScreenRotation rotation,
|
||||||
int sizing,
|
ScreenSizing sizing,
|
||||||
int screenGap,
|
int screenGap,
|
||||||
bool integerScale,
|
bool integerScale,
|
||||||
bool swapScreens,
|
bool swapScreens,
|
||||||
|
@ -134,8 +134,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
HybEnable = screenLayout == 3;
|
HybEnable = screenLayout == 3;
|
||||||
if (HybEnable)
|
if (HybEnable)
|
||||||
{
|
{
|
||||||
screenLayout = 0;
|
screenLayout = screenLayout_Natural;
|
||||||
sizing = 0;
|
sizing = screenSizing_Even;
|
||||||
HybScreen = swapScreens ? 1 : 0;
|
HybScreen = swapScreens ? 1 : 0;
|
||||||
swapScreens = false;
|
swapScreens = false;
|
||||||
topAspect = botAspect = 1;
|
topAspect = botAspect = 1;
|
||||||
|
@ -149,7 +149,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
{0, 0}, {256, 192}
|
{0, 0}, {256, 192}
|
||||||
};
|
};
|
||||||
|
|
||||||
int layout = screenLayout == 0
|
int layout = screenLayout == screenLayout_Natural
|
||||||
? rotation % 2
|
? rotation % 2
|
||||||
: screenLayout - 1;
|
: screenLayout - 1;
|
||||||
|
|
||||||
|
@ -187,11 +187,11 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
int posRefPointOffset = 0;
|
int posRefPointOffset = 0;
|
||||||
int posRefPointCount = HybEnable ? 6 : 4;
|
int posRefPointCount = HybEnable ? 6 : 4;
|
||||||
|
|
||||||
if (sizing == 4 || sizing == 5)
|
if (sizing == screenSizing_TopOnly || sizing == screenSizing_BotOnly)
|
||||||
{
|
{
|
||||||
float* mtx = sizing == 4 ? TopScreenMtx : BotScreenMtx;
|
float* mtx = sizing == screenSizing_TopOnly ? TopScreenMtx : BotScreenMtx;
|
||||||
int primOffset = sizing == 4 ? 0 : 2;
|
int primOffset = sizing == screenSizing_TopOnly ? 0 : 2;
|
||||||
int secOffset = sizing == 5 ? 2 : 0;
|
int secOffset = sizing == screenSizing_BotOnly ? 2 : 0;
|
||||||
|
|
||||||
float hSize = fabsf(refpoints[primOffset][0] - refpoints[primOffset+1][0]);
|
float hSize = fabsf(refpoints[primOffset][0] - refpoints[primOffset+1][0]);
|
||||||
float vSize = fabsf(refpoints[primOffset][1] - refpoints[primOffset+1][1]);
|
float vSize = fabsf(refpoints[primOffset][1] - refpoints[primOffset+1][1]);
|
||||||
|
@ -200,8 +200,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
if (integerScale)
|
if (integerScale)
|
||||||
scale = floorf(scale);
|
scale = floorf(scale);
|
||||||
|
|
||||||
TopEnable = sizing == 4;
|
TopEnable = sizing == screenSizing_TopOnly;
|
||||||
BotEnable = sizing == 5;
|
BotEnable = sizing == screenSizing_BotOnly;
|
||||||
botScale = scale;
|
botScale = scale;
|
||||||
|
|
||||||
M23_Scale(mtx, scale);
|
M23_Scale(mtx, scale);
|
||||||
|
@ -245,7 +245,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
|
|
||||||
// scale
|
// scale
|
||||||
{
|
{
|
||||||
if (sizing == 0)
|
if (sizing == screenSizing_Even)
|
||||||
{
|
{
|
||||||
float minX = refpoints[0][0], maxX = minX;
|
float minX = refpoints[0][0], maxX = minX;
|
||||||
float minY = refpoints[0][1], maxY = minY;
|
float minY = refpoints[0][1], maxY = minY;
|
||||||
|
@ -299,7 +299,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
? (scale * vSize * 4) / 3
|
? (scale * vSize * 4) / 3
|
||||||
: (scale * hSize * 4) / 3;
|
: (scale * hSize * 4) / 3;
|
||||||
|
|
||||||
if (rotation > 1)
|
if (rotation > screenRot_90Deg)
|
||||||
hybWidth *= -1;
|
hybWidth *= -1;
|
||||||
|
|
||||||
M23_Translate(TopScreenMtx, (layout==0)?hybWidth:0, (layout==1)?hybWidth:0);
|
M23_Translate(TopScreenMtx, (layout==0)?hybWidth:0, (layout==1)?hybWidth:0);
|
||||||
|
@ -311,8 +311,8 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
|
|
||||||
botTrans[2+layout] += hybWidth;
|
botTrans[2+layout] += hybWidth;
|
||||||
|
|
||||||
hybTrans[0] = scale * (rotation == 0 || rotation == 3 ? minX : maxX);
|
hybTrans[0] = scale * (rotation == screenRot_0Deg || rotation == screenRot_270Deg ? minX : maxX);
|
||||||
hybTrans[1] = scale * (rotation == 0 || rotation == 1 ? minY : maxY);
|
hybTrans[1] = scale * (rotation == screenRot_0Deg || rotation == screenRot_90Deg ? minY : maxY);
|
||||||
M23_Translate(HybScreenMtx, hybTrans[0], hybTrans[1]);
|
M23_Translate(HybScreenMtx, hybTrans[0], hybTrans[1]);
|
||||||
|
|
||||||
M23_Transform(HybScreenMtx, refpoints[4][0], refpoints[4][1]);
|
M23_Transform(HybScreenMtx, refpoints[4][0], refpoints[4][1]);
|
||||||
|
@ -321,10 +321,10 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int primOffset = (sizing == 1) ? 0 : 2;
|
int primOffset = (sizing == screenSizing_EmphTop) ? 0 : 2;
|
||||||
int secOffset = (sizing == 1) ? 2 : 0;
|
int secOffset = (sizing == screenSizing_EmphTop) ? 2 : 0;
|
||||||
float* primMtx = (sizing == 1) ? TopScreenMtx : BotScreenMtx;
|
float* primMtx = (sizing == screenSizing_EmphTop) ? TopScreenMtx : BotScreenMtx;
|
||||||
float* secMtx = (sizing == 1) ? BotScreenMtx : TopScreenMtx;
|
float* secMtx = (sizing == screenSizing_EmphTop) ? BotScreenMtx : TopScreenMtx;
|
||||||
|
|
||||||
float primMinX = refpoints[primOffset][0], primMaxX = primMinX;
|
float primMinX = refpoints[primOffset][0], primMaxX = primMinX;
|
||||||
float primMinY = refpoints[primOffset][1], primMaxY = primMinY;
|
float primMinY = refpoints[primOffset][1], primMaxY = primMinY;
|
||||||
|
@ -386,7 +386,7 @@ void SetupScreenLayout(int screenWidth, int screenHeight,
|
||||||
refpoints[secOffset+1][0] *= secScale;
|
refpoints[secOffset+1][0] *= secScale;
|
||||||
refpoints[secOffset+1][1] *= secScale;
|
refpoints[secOffset+1][1] *= secScale;
|
||||||
|
|
||||||
botScale = (sizing == 1) ? secScale : primScale;
|
botScale = (sizing == screenSizing_EmphTop) ? secScale : primScale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,17 +42,6 @@ enum
|
||||||
HK_MAX
|
HK_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
screenSizing_Even,
|
|
||||||
screenSizing_EmphTop,
|
|
||||||
screenSizing_EmphBot,
|
|
||||||
screenSizing_Auto,
|
|
||||||
screenSizing_TopOnly,
|
|
||||||
screenSizing_BotOnly,
|
|
||||||
screenSizing_MAX,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
micInputType_Silence,
|
micInputType_Silence,
|
||||||
|
|
|
@ -174,13 +174,14 @@ const struct { int id; float ratio; const char* label; } aspectRatios[] =
|
||||||
{ 2, (21.f / 9) / (4.f / 3), "21:9" },
|
{ 2, (21.f / 9) / (4.f / 3), "21:9" },
|
||||||
{ 3, 0, "window" }
|
{ 3, 0, "window" }
|
||||||
};
|
};
|
||||||
|
constexpr int AspectRatiosNum = sizeof(aspectRatios) / sizeof(aspectRatios[0]);
|
||||||
|
|
||||||
|
|
||||||
EmuThread::EmuThread(QObject* parent) : QThread(parent)
|
EmuThread::EmuThread(QObject* parent) : QThread(parent)
|
||||||
{
|
{
|
||||||
EmuStatus = 0;
|
EmuStatus = emuStatus_Exit;
|
||||||
EmuRunning = 2;
|
EmuRunning = emuStatus_Paused;
|
||||||
EmuPause = 0;
|
EmuPauseStack = EmuPauseStackRunning;
|
||||||
RunningSomething = false;
|
RunningSomething = false;
|
||||||
|
|
||||||
connect(this, SIGNAL(windowUpdate()), mainWindow->panelWidget, SLOT(repaint()));
|
connect(this, SIGNAL(windowUpdate()), mainWindow->panelWidget, SLOT(repaint()));
|
||||||
|
@ -353,7 +354,7 @@ void EmuThread::run()
|
||||||
|
|
||||||
char melontitle[100];
|
char melontitle[100];
|
||||||
|
|
||||||
while (EmuRunning != 0)
|
while (EmuRunning != emuStatus_Exit)
|
||||||
{
|
{
|
||||||
Input::Process();
|
Input::Process();
|
||||||
|
|
||||||
|
@ -425,10 +426,10 @@ void EmuThread::run()
|
||||||
DSi_BPTWL::ProcessVolumeSwitchInput(currentTime);
|
DSi_BPTWL::ProcessVolumeSwitchInput(currentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EmuRunning == 1 || EmuRunning == 3)
|
if (EmuRunning == emuStatus_Running || EmuRunning == emuStatus_FrameStep)
|
||||||
{
|
{
|
||||||
EmuStatus = 1;
|
EmuStatus = emuStatus_Running;
|
||||||
if (EmuRunning == 3) EmuRunning = 2;
|
if (EmuRunning == emuStatus_FrameStep) EmuRunning = emuStatus_Paused;
|
||||||
|
|
||||||
// update render settings if needed
|
// update render settings if needed
|
||||||
// HACK:
|
// HACK:
|
||||||
|
@ -473,7 +474,7 @@ void EmuThread::run()
|
||||||
AudioInOut::MicProcess();
|
AudioInOut::MicProcess();
|
||||||
|
|
||||||
// auto screen layout
|
// auto screen layout
|
||||||
if (Config::ScreenSizing == screenSizing_Auto)
|
if (Config::ScreenSizing == Frontend::screenSizing_Auto)
|
||||||
{
|
{
|
||||||
mainScreenPos[2] = mainScreenPos[1];
|
mainScreenPos[2] = mainScreenPos[1];
|
||||||
mainScreenPos[1] = mainScreenPos[0];
|
mainScreenPos[1] = mainScreenPos[0];
|
||||||
|
@ -485,14 +486,14 @@ void EmuThread::run()
|
||||||
{
|
{
|
||||||
// constant flickering, likely displaying 3D on both screens
|
// constant flickering, likely displaying 3D on both screens
|
||||||
// TODO: when both screens are used for 2D only...???
|
// TODO: when both screens are used for 2D only...???
|
||||||
guess = screenSizing_Even;
|
guess = Frontend::screenSizing_Even;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (mainScreenPos[0] == 1)
|
if (mainScreenPos[0] == 1)
|
||||||
guess = screenSizing_EmphTop;
|
guess = Frontend::screenSizing_EmphTop;
|
||||||
else
|
else
|
||||||
guess = screenSizing_EmphBot;
|
guess = Frontend::screenSizing_EmphBot;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (guess != autoScreenSizing)
|
if (guess != autoScreenSizing)
|
||||||
|
@ -528,7 +529,7 @@ void EmuThread::run()
|
||||||
MelonCap::Update();
|
MelonCap::Update();
|
||||||
#endif // MELONCAP
|
#endif // MELONCAP
|
||||||
|
|
||||||
if (EmuRunning == 0) break;
|
if (EmuRunning == emuStatus_Exit) break;
|
||||||
|
|
||||||
winUpdateCount++;
|
winUpdateCount++;
|
||||||
if (winUpdateCount >= winUpdateFreq && !oglContext)
|
if (winUpdateCount >= winUpdateFreq && !oglContext)
|
||||||
|
@ -632,21 +633,21 @@ void EmuThread::run()
|
||||||
if (oglContext)
|
if (oglContext)
|
||||||
drawScreenGL();
|
drawScreenGL();
|
||||||
|
|
||||||
int contextRequest = ContextRequest;
|
ContextRequestKind contextRequest = ContextRequest;
|
||||||
if (contextRequest == 1)
|
if (contextRequest == contextRequest_InitGL)
|
||||||
{
|
{
|
||||||
initOpenGL();
|
initOpenGL();
|
||||||
ContextRequest = 0;
|
ContextRequest = contextRequest_None;
|
||||||
}
|
}
|
||||||
else if (contextRequest == 2)
|
else if (contextRequest == contextRequest_DeInitGL)
|
||||||
{
|
{
|
||||||
deinitOpenGL();
|
deinitOpenGL();
|
||||||
ContextRequest = 0;
|
ContextRequest = contextRequest_None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EmuStatus = 0;
|
EmuStatus = emuStatus_Exit;
|
||||||
|
|
||||||
GPU::DeInitRenderer();
|
GPU::DeInitRenderer();
|
||||||
NDS::DeInit();
|
NDS::DeInit();
|
||||||
|
@ -660,8 +661,8 @@ void EmuThread::changeWindowTitle(char* title)
|
||||||
|
|
||||||
void EmuThread::emuRun()
|
void EmuThread::emuRun()
|
||||||
{
|
{
|
||||||
EmuRunning = 1;
|
EmuRunning = emuStatus_Running;
|
||||||
EmuPause = 0;
|
EmuPauseStack = EmuPauseStackRunning;
|
||||||
RunningSomething = true;
|
RunningSomething = true;
|
||||||
|
|
||||||
// checkme
|
// checkme
|
||||||
|
@ -671,34 +672,34 @@ void EmuThread::emuRun()
|
||||||
|
|
||||||
void EmuThread::initContext()
|
void EmuThread::initContext()
|
||||||
{
|
{
|
||||||
ContextRequest = 1;
|
ContextRequest = contextRequest_InitGL;
|
||||||
while (ContextRequest != 0);
|
while (ContextRequest != contextRequest_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::deinitContext()
|
void EmuThread::deinitContext()
|
||||||
{
|
{
|
||||||
ContextRequest = 2;
|
ContextRequest = contextRequest_DeInitGL;
|
||||||
while (ContextRequest != 0);
|
while (ContextRequest != contextRequest_None);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::emuPause()
|
void EmuThread::emuPause()
|
||||||
{
|
{
|
||||||
EmuPause++;
|
EmuPauseStack++;
|
||||||
if (EmuPause > 1) return;
|
if (EmuPauseStack > EmuPauseStackPauseThreshold) return;
|
||||||
|
|
||||||
PrevEmuStatus = EmuRunning;
|
PrevEmuStatus = EmuRunning;
|
||||||
EmuRunning = 2;
|
EmuRunning = emuStatus_Paused;
|
||||||
while (EmuStatus != 2);
|
while (EmuStatus != emuStatus_Paused);
|
||||||
|
|
||||||
AudioInOut::Disable();
|
AudioInOut::Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::emuUnpause()
|
void EmuThread::emuUnpause()
|
||||||
{
|
{
|
||||||
if (EmuPause < 1) return;
|
if (EmuPauseStack < EmuPauseStackPauseThreshold) return;
|
||||||
|
|
||||||
EmuPause--;
|
EmuPauseStack--;
|
||||||
if (EmuPause > 0) return;
|
if (EmuPauseStack >= EmuPauseStackPauseThreshold) return;
|
||||||
|
|
||||||
EmuRunning = PrevEmuStatus;
|
EmuRunning = PrevEmuStatus;
|
||||||
|
|
||||||
|
@ -707,21 +708,21 @@ void EmuThread::emuUnpause()
|
||||||
|
|
||||||
void EmuThread::emuStop()
|
void EmuThread::emuStop()
|
||||||
{
|
{
|
||||||
EmuRunning = 0;
|
EmuRunning = emuStatus_Exit;
|
||||||
EmuPause = 0;
|
EmuPauseStack = EmuPauseStackRunning;
|
||||||
|
|
||||||
AudioInOut::Disable();
|
AudioInOut::Disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::emuFrameStep()
|
void EmuThread::emuFrameStep()
|
||||||
{
|
{
|
||||||
if (EmuPause < 1) emit windowEmuPause();
|
if (EmuPauseStack < EmuPauseStackPauseThreshold) emit windowEmuPause();
|
||||||
EmuRunning = 3;
|
EmuRunning = emuStatus_FrameStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmuThread::emuIsRunning()
|
bool EmuThread::emuIsRunning()
|
||||||
{
|
{
|
||||||
return (EmuRunning == 1);
|
return EmuRunning == emuStatus_Running;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmuThread::emuIsActive()
|
bool EmuThread::emuIsActive()
|
||||||
|
@ -830,9 +831,9 @@ void ScreenHandler::screenSetupLayout(int w, int h)
|
||||||
aspectBot = ((float) w / h) / (4.f / 3.f);
|
aspectBot = ((float) w / h) / (4.f / 3.f);
|
||||||
|
|
||||||
Frontend::SetupScreenLayout(w, h,
|
Frontend::SetupScreenLayout(w, h,
|
||||||
Config::ScreenLayout,
|
static_cast<Frontend::ScreenLayout>(Config::ScreenLayout),
|
||||||
Config::ScreenRotation,
|
static_cast<Frontend::ScreenRotation>(Config::ScreenRotation),
|
||||||
sizing,
|
static_cast<Frontend::ScreenSizing>(sizing),
|
||||||
Config::ScreenGap,
|
Config::ScreenGap,
|
||||||
Config::IntegerScaling != 0,
|
Config::IntegerScaling != 0,
|
||||||
Config::ScreenSwap != 0,
|
Config::ScreenSwap != 0,
|
||||||
|
@ -844,32 +845,34 @@ void ScreenHandler::screenSetupLayout(int w, int h)
|
||||||
|
|
||||||
QSize ScreenHandler::screenGetMinSize(int factor = 1)
|
QSize ScreenHandler::screenGetMinSize(int factor = 1)
|
||||||
{
|
{
|
||||||
bool isHori = (Config::ScreenRotation == 1 || Config::ScreenRotation == 3);
|
bool isHori = (Config::ScreenRotation == Frontend::screenRot_90Deg
|
||||||
|
|| Config::ScreenRotation == Frontend::screenRot_270Deg);
|
||||||
int gap = Config::ScreenGap * factor;
|
int gap = Config::ScreenGap * factor;
|
||||||
|
|
||||||
int w = 256 * factor;
|
int w = 256 * factor;
|
||||||
int h = 192 * factor;
|
int h = 192 * factor;
|
||||||
|
|
||||||
if (Config::ScreenSizing == 4 || Config::ScreenSizing == 5)
|
if (Config::ScreenSizing == Frontend::screenSizing_TopOnly
|
||||||
|
|| Config::ScreenSizing == Frontend::screenSizing_BotOnly)
|
||||||
{
|
{
|
||||||
return QSize(w, h);
|
return QSize(w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config::ScreenLayout == 0) // natural
|
if (Config::ScreenLayout == Frontend::screenLayout_Natural)
|
||||||
{
|
{
|
||||||
if (isHori)
|
if (isHori)
|
||||||
return QSize(h+gap+h, w);
|
return QSize(h+gap+h, w);
|
||||||
else
|
else
|
||||||
return QSize(w, h+gap+h);
|
return QSize(w, h+gap+h);
|
||||||
}
|
}
|
||||||
else if (Config::ScreenLayout == 1) // vertical
|
else if (Config::ScreenLayout == Frontend::screenLayout_Vertical)
|
||||||
{
|
{
|
||||||
if (isHori)
|
if (isHori)
|
||||||
return QSize(h, w+gap+w);
|
return QSize(h, w+gap+w);
|
||||||
else
|
else
|
||||||
return QSize(w, h+gap+h);
|
return QSize(w, h+gap+h);
|
||||||
}
|
}
|
||||||
else if (Config::ScreenLayout == 2) // horizontal
|
else if (Config::ScreenLayout == Frontend::screenLayout_Horizontal)
|
||||||
{
|
{
|
||||||
if (isHori)
|
if (isHori)
|
||||||
return QSize(h+gap+h, w);
|
return QSize(h+gap+h, w);
|
||||||
|
@ -1610,7 +1613,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
QMenu* submenu = menu->addMenu("Screen rotation");
|
QMenu* submenu = menu->addMenu("Screen rotation");
|
||||||
grpScreenRotation = new QActionGroup(submenu);
|
grpScreenRotation = new QActionGroup(submenu);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < Frontend::screenRot_MAX; i++)
|
||||||
{
|
{
|
||||||
int data = i*90;
|
int data = i*90;
|
||||||
actScreenRotation[i] = submenu->addAction(QString("%1°").arg(data));
|
actScreenRotation[i] = submenu->addAction(QString("%1°").arg(data));
|
||||||
|
@ -1644,7 +1647,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
|
|
||||||
const char* screenlayout[] = {"Natural", "Vertical", "Horizontal", "Hybrid"};
|
const char* screenlayout[] = {"Natural", "Vertical", "Horizontal", "Hybrid"};
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < Frontend::screenLayout_MAX; i++)
|
||||||
{
|
{
|
||||||
actScreenLayout[i] = submenu->addAction(QString(screenlayout[i]));
|
actScreenLayout[i] = submenu->addAction(QString(screenlayout[i]));
|
||||||
actScreenLayout[i]->setActionGroup(grpScreenLayout);
|
actScreenLayout[i]->setActionGroup(grpScreenLayout);
|
||||||
|
@ -1666,7 +1669,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
|
|
||||||
const char* screensizing[] = {"Even", "Emphasize top", "Emphasize bottom", "Auto", "Top only", "Bottom only"};
|
const char* screensizing[] = {"Even", "Emphasize top", "Emphasize bottom", "Auto", "Top only", "Bottom only"};
|
||||||
|
|
||||||
for (int i = 0; i < screenSizing_MAX; i++)
|
for (int i = 0; i < Frontend::screenSizing_MAX; i++)
|
||||||
{
|
{
|
||||||
actScreenSizing[i] = submenu->addAction(QString(screensizing[i]));
|
actScreenSizing[i] = submenu->addAction(QString(screensizing[i]));
|
||||||
actScreenSizing[i]->setActionGroup(grpScreenSizing);
|
actScreenSizing[i]->setActionGroup(grpScreenSizing);
|
||||||
|
@ -1686,8 +1689,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
QMenu* submenu = menu->addMenu("Aspect ratio");
|
QMenu* submenu = menu->addMenu("Aspect ratio");
|
||||||
grpScreenAspectTop = new QActionGroup(submenu);
|
grpScreenAspectTop = new QActionGroup(submenu);
|
||||||
grpScreenAspectBot = new QActionGroup(submenu);
|
grpScreenAspectBot = new QActionGroup(submenu);
|
||||||
actScreenAspectTop = new QAction*[sizeof(aspectRatios) / sizeof(aspectRatios[0])];
|
actScreenAspectTop = new QAction*[AspectRatiosNum];
|
||||||
actScreenAspectBot = new QAction*[sizeof(aspectRatios) / sizeof(aspectRatios[0])];
|
actScreenAspectBot = new QAction*[AspectRatiosNum];
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
|
@ -1701,7 +1704,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
actions = actScreenAspectBot;
|
actions = actScreenAspectBot;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < sizeof(aspectRatios) / sizeof(aspectRatios[0]); j++)
|
for (int j = 0; j < AspectRatiosNum; j++)
|
||||||
{
|
{
|
||||||
auto ratio = aspectRatios[j];
|
auto ratio = aspectRatios[j];
|
||||||
QString label = QString("%1 %2").arg(i ? "Bottom" : "Top", ratio.label);
|
QString label = QString("%1 %2").arg(i ? "Bottom" : "Top", ratio.label);
|
||||||
|
@ -1806,7 +1809,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
||||||
|
|
||||||
actScreenSwap->setChecked(Config::ScreenSwap);
|
actScreenSwap->setChecked(Config::ScreenSwap);
|
||||||
|
|
||||||
for (int i = 0; i < sizeof(aspectRatios) / sizeof(aspectRatios[0]); i++)
|
for (int i = 0; i < AspectRatiosNum; i++)
|
||||||
{
|
{
|
||||||
if (Config::ScreenAspectTop == aspectRatios[i].id)
|
if (Config::ScreenAspectTop == aspectRatios[i].id)
|
||||||
actScreenAspectTop[i]->setChecked(true);
|
actScreenAspectTop[i]->setChecked(true);
|
||||||
|
@ -3011,18 +3014,18 @@ void MainWindow::onChangeScreenSwap(bool checked)
|
||||||
Config::ScreenSwap = checked?1:0;
|
Config::ScreenSwap = checked?1:0;
|
||||||
|
|
||||||
// Swap between top and bottom screen when displaying one screen.
|
// Swap between top and bottom screen when displaying one screen.
|
||||||
if (Config::ScreenSizing == screenSizing_TopOnly)
|
if (Config::ScreenSizing == Frontend::screenSizing_TopOnly)
|
||||||
{
|
{
|
||||||
// Bottom Screen.
|
// Bottom Screen.
|
||||||
Config::ScreenSizing = screenSizing_BotOnly;
|
Config::ScreenSizing = Frontend::screenSizing_BotOnly;
|
||||||
actScreenSizing[screenSizing_TopOnly]->setChecked(false);
|
actScreenSizing[Frontend::screenSizing_TopOnly]->setChecked(false);
|
||||||
actScreenSizing[Config::ScreenSizing]->setChecked(true);
|
actScreenSizing[Config::ScreenSizing]->setChecked(true);
|
||||||
}
|
}
|
||||||
else if (Config::ScreenSizing == screenSizing_BotOnly)
|
else if (Config::ScreenSizing == Frontend::screenSizing_BotOnly)
|
||||||
{
|
{
|
||||||
// Top Screen.
|
// Top Screen.
|
||||||
Config::ScreenSizing = screenSizing_TopOnly;
|
Config::ScreenSizing = Frontend::screenSizing_TopOnly;
|
||||||
actScreenSizing[screenSizing_BotOnly]->setChecked(false);
|
actScreenSizing[Frontend::screenSizing_BotOnly]->setChecked(false);
|
||||||
actScreenSizing[Config::ScreenSizing]->setChecked(true);
|
actScreenSizing[Config::ScreenSizing]->setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3111,13 +3114,13 @@ void MainWindow::onFullscreenToggled()
|
||||||
void MainWindow::onScreenEmphasisToggled()
|
void MainWindow::onScreenEmphasisToggled()
|
||||||
{
|
{
|
||||||
int currentSizing = Config::ScreenSizing;
|
int currentSizing = Config::ScreenSizing;
|
||||||
if (currentSizing == screenSizing_EmphTop)
|
if (currentSizing == Frontend::screenSizing_EmphTop)
|
||||||
{
|
{
|
||||||
Config::ScreenSizing = screenSizing_EmphBot;
|
Config::ScreenSizing = Frontend::screenSizing_EmphBot;
|
||||||
}
|
}
|
||||||
else if (currentSizing == screenSizing_EmphBot)
|
else if (currentSizing == Frontend::screenSizing_EmphBot)
|
||||||
{
|
{
|
||||||
Config::ScreenSizing = screenSizing_EmphTop;
|
Config::ScreenSizing = Frontend::screenSizing_EmphTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit screenLayoutChange();
|
emit screenLayoutChange();
|
||||||
|
@ -3279,12 +3282,12 @@ int main(int argc, char** argv)
|
||||||
SANITIZE(Config::AudioInterp, 0, 3);
|
SANITIZE(Config::AudioInterp, 0, 3);
|
||||||
SANITIZE(Config::AudioVolume, 0, 256);
|
SANITIZE(Config::AudioVolume, 0, 256);
|
||||||
SANITIZE(Config::MicInputType, 0, (int)micInputType_MAX);
|
SANITIZE(Config::MicInputType, 0, (int)micInputType_MAX);
|
||||||
SANITIZE(Config::ScreenRotation, 0, 3);
|
SANITIZE(Config::ScreenRotation, 0, (int)Frontend::screenRot_MAX);
|
||||||
SANITIZE(Config::ScreenGap, 0, 500);
|
SANITIZE(Config::ScreenGap, 0, 500);
|
||||||
SANITIZE(Config::ScreenLayout, 0, 3);
|
SANITIZE(Config::ScreenLayout, 0, (int)Frontend::screenLayout_MAX);
|
||||||
SANITIZE(Config::ScreenSizing, 0, (int)screenSizing_MAX);
|
SANITIZE(Config::ScreenSizing, 0, (int)Frontend::screenSizing_MAX);
|
||||||
SANITIZE(Config::ScreenAspectTop, 0, 4);
|
SANITIZE(Config::ScreenAspectTop, 0, AspectRatiosNum);
|
||||||
SANITIZE(Config::ScreenAspectBot, 0, 4);
|
SANITIZE(Config::ScreenAspectBot, 0, AspectRatiosNum);
|
||||||
#undef SANITIZE
|
#undef SANITIZE
|
||||||
|
|
||||||
AudioInOut::Init();
|
AudioInOut::Init();
|
||||||
|
|
|
@ -94,12 +94,29 @@ private:
|
||||||
void initOpenGL();
|
void initOpenGL();
|
||||||
void deinitOpenGL();
|
void deinitOpenGL();
|
||||||
|
|
||||||
std::atomic<int> EmuStatus;
|
enum EmuStatusKind
|
||||||
int PrevEmuStatus;
|
{
|
||||||
int EmuRunning;
|
emuStatus_Exit,
|
||||||
int EmuPause;
|
emuStatus_Running,
|
||||||
|
emuStatus_Paused,
|
||||||
|
emuStatus_FrameStep,
|
||||||
|
};
|
||||||
|
std::atomic<EmuStatusKind> EmuStatus;
|
||||||
|
|
||||||
std::atomic<int> ContextRequest = 0;
|
EmuStatusKind PrevEmuStatus;
|
||||||
|
EmuStatusKind EmuRunning;
|
||||||
|
|
||||||
|
constexpr static int EmuPauseStackRunning = 0;
|
||||||
|
constexpr static int EmuPauseStackPauseThreshold = 1;
|
||||||
|
int EmuPauseStack;
|
||||||
|
|
||||||
|
enum ContextRequestKind
|
||||||
|
{
|
||||||
|
contextRequest_None = 0,
|
||||||
|
contextRequest_InitGL,
|
||||||
|
contextRequest_DeInitGL
|
||||||
|
};
|
||||||
|
std::atomic<ContextRequestKind> ContextRequest = contextRequest_None;
|
||||||
|
|
||||||
GL::Context* oglContext = nullptr;
|
GL::Context* oglContext = nullptr;
|
||||||
GLuint screenVertexBuffer, screenVertexArray;
|
GLuint screenVertexBuffer, screenVertexArray;
|
||||||
|
@ -404,14 +421,14 @@ public:
|
||||||
QAction* actSavestateSRAMReloc;
|
QAction* actSavestateSRAMReloc;
|
||||||
QAction* actScreenSize[4];
|
QAction* actScreenSize[4];
|
||||||
QActionGroup* grpScreenRotation;
|
QActionGroup* grpScreenRotation;
|
||||||
QAction* actScreenRotation[4];
|
QAction* actScreenRotation[Frontend::screenRot_MAX];
|
||||||
QActionGroup* grpScreenGap;
|
QActionGroup* grpScreenGap;
|
||||||
QAction* actScreenGap[6];
|
QAction* actScreenGap[6];
|
||||||
QActionGroup* grpScreenLayout;
|
QActionGroup* grpScreenLayout;
|
||||||
QAction* actScreenLayout[4];
|
QAction* actScreenLayout[Frontend::screenLayout_MAX];
|
||||||
QAction* actScreenSwap;
|
QAction* actScreenSwap;
|
||||||
QActionGroup* grpScreenSizing;
|
QActionGroup* grpScreenSizing;
|
||||||
QAction* actScreenSizing[6];
|
QAction* actScreenSizing[Frontend::screenSizing_MAX];
|
||||||
QAction* actIntegerScaling;
|
QAction* actIntegerScaling;
|
||||||
QActionGroup* grpScreenAspectTop;
|
QActionGroup* grpScreenAspectTop;
|
||||||
QAction** actScreenAspectTop;
|
QAction** actScreenAspectTop;
|
||||||
|
|
Loading…
Reference in New Issue