mirror of https://github.com/mgba-emu/mgba.git
Switch: Allow switching between CPU and GPU renderers without reloading
This commit is contained in:
parent
47d70582c0
commit
853c64b326
1
CHANGES
1
CHANGES
|
@ -155,6 +155,7 @@ Misc:
|
||||||
- Qt: Better initial shortcut editor column sizes
|
- Qt: Better initial shortcut editor column sizes
|
||||||
- SDL: Fall back to sw blit if OpenGL init fails
|
- SDL: Fall back to sw blit if OpenGL init fails
|
||||||
- Switch: Optimize font rendering (fixes mgba.io/i/2078)
|
- Switch: Optimize font rendering (fixes mgba.io/i/2078)
|
||||||
|
- Switch: Allow switching between CPU and GPU renderers without reloading
|
||||||
- Util: Reset vector size on deinit
|
- Util: Reset vector size on deinit
|
||||||
- VFS: Change semantics of VFile.sync on mapped files (fixes mgba.io/i/1730)
|
- VFS: Change semantics of VFile.sync on mapped files (fixes mgba.io/i/1730)
|
||||||
|
|
||||||
|
|
|
@ -248,6 +248,19 @@ static enum GUICursorState _pollCursor(unsigned* x, unsigned* y) {
|
||||||
return GUI_CURSOR_DOWN;
|
return GUI_CURSOR_DOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _updateRenderer(struct mGUIRunner* runner, bool gl) {
|
||||||
|
if (gl) {
|
||||||
|
runner->core->setVideoGLTex(runner->core, tex);
|
||||||
|
usePbo = false;
|
||||||
|
} else {
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, tex);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
runner->core->setVideoBuffer(runner->core, frameBuffer, 256);
|
||||||
|
usePbo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _setup(struct mGUIRunner* runner) {
|
static void _setup(struct mGUIRunner* runner) {
|
||||||
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_A, GBA_KEY_A);
|
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_A, GBA_KEY_A);
|
||||||
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_B, GBA_KEY_B);
|
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_B, GBA_KEY_B);
|
||||||
|
@ -260,17 +273,11 @@ static void _setup(struct mGUIRunner* runner) {
|
||||||
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_L, GBA_KEY_L);
|
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_L, GBA_KEY_L);
|
||||||
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_R, GBA_KEY_R);
|
_mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_R, GBA_KEY_R);
|
||||||
|
|
||||||
int fakeBool;
|
int fakeBool = false;
|
||||||
if (mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool) && fakeBool && runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) {
|
if (runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) {
|
||||||
runner->core->setVideoGLTex(runner->core, tex);
|
mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool);
|
||||||
usePbo = false;
|
|
||||||
} else {
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, tex);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
runner->core->setVideoBuffer(runner->core, frameBuffer, 256);
|
|
||||||
usePbo = true;
|
|
||||||
}
|
}
|
||||||
|
_updateRenderer(runner, fakeBool);
|
||||||
|
|
||||||
runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble.d);
|
runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble.d);
|
||||||
runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation);
|
runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation);
|
||||||
|
@ -323,9 +330,16 @@ static void _gameLoaded(struct mGUIRunner* runner) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int scale;
|
if (runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) {
|
||||||
if (mCoreConfigGetUIntValue(&runner->config, "videoScale", &scale)) {
|
if (mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool) && fakeBool == usePbo) {
|
||||||
runner->core->reloadConfigOption(runner->core, "videoScale", &runner->config);
|
_updateRenderer(runner, fakeBool);
|
||||||
|
runner->core->reloadConfigOption(runner->core, "hwaccelVideo", &runner->config);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned scale;
|
||||||
|
if (mCoreConfigGetUIntValue(&runner->config, "videoScale", &scale)) {
|
||||||
|
runner->core->reloadConfigOption(runner->core, "videoScale", &runner->config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rumble.up = 0;
|
rumble.up = 0;
|
||||||
|
@ -889,7 +903,7 @@ int main(int argc, char* argv[]) {
|
||||||
.nStates = 16
|
.nStates = 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "GPU-accelerated renderer (requires game reload)",
|
.title = "GPU-accelerated renderer",
|
||||||
.data = "hwaccelVideo",
|
.data = "hwaccelVideo",
|
||||||
.submenu = 0,
|
.submenu = 0,
|
||||||
.state = 0,
|
.state = 0,
|
||||||
|
|
Loading…
Reference in New Issue