ENGINES: Add a new 'renderer' option to replace 'soft_renderer'

'soft_renderer' was a bool and was not useful to select a renderer
in a list with more than two values.
This commit is contained in:
Bastien Bouclet 2015-12-28 16:38:45 +01:00
parent 19cc6b41e7
commit 8d5406720c
11 changed files with 96 additions and 43 deletions

View File

@ -42,6 +42,8 @@
#include "audio/musicplugin.h"
#include "graphics/renderer.h"
#define DETECTOR_TESTING_HACK
#define UPGRADE_ALL_TARGETS_HACK
@ -115,8 +117,7 @@ static const char HELP_STRING[] =
" --talkspeed=NUM Set talk speed for games (default: 179)\n"
" --show-fps Set the turn on display FPS info\n"
" --no-show-fps Set the turn off display FPS info\n"
" --soft-renderer Switch to 3D software renderer\n"
" --no-soft-renderer Switch to 3D hardware renderer\n"
" --renderer=RENDERER Select renderer (software, opengl, opengl_shaders)\n"
" --aspect-ratio Enable aspect ratio correction\n"
#ifdef ENABLE_EVENTRECORDER
" --record-mode=MODE Specify record mode for event recorder (record, playback,\n"
@ -158,7 +159,6 @@ void registerDefaults() {
// Graphics
ConfMan.registerDefault("fullscreen", false);
ConfMan.registerDefault("soft_renderer", false);
ConfMan.registerDefault("show_fps", false);
ConfMan.registerDefault("aspect_ratio", false);
@ -490,7 +490,10 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha
DO_LONG_OPTION("gamma")
END_OPTION
DO_LONG_OPTION_BOOL("soft-renderer")
DO_LONG_OPTION("renderer")
Graphics::RendererType renderer = Graphics::parseRendererTypeCode(option);
if (renderer == Graphics::kRendererTypeDefault)
usage("Unrecognized renderer type '%s'", option);
END_OPTION
DO_LONG_OPTION_BOOL("show-fps")

View File

@ -21,6 +21,7 @@
*/
#include "common/config-manager.h"
#include "graphics/renderer.h"
#include "engines/grim/debugger.h"
#include "engines/grim/md5check.h"
@ -34,7 +35,7 @@ Debugger::Debugger() :
registerCmd("check_gamedata", WRAP_METHOD(Debugger, cmd_checkFiles));
registerCmd("lua_do", WRAP_METHOD(Debugger, cmd_lua_do));
registerCmd("jump", WRAP_METHOD(Debugger, cmd_jump));
registerCmd("swap_renderer", WRAP_METHOD(Debugger, cmd_swap_renderer));
registerCmd("set_renderer", WRAP_METHOD(Debugger, cmd_set_renderer));
registerCmd("save", WRAP_METHOD(Debugger, cmd_save));
registerCmd("load", WRAP_METHOD(Debugger, cmd_load));
}
@ -88,11 +89,22 @@ bool Debugger::cmd_jump(int argc, const char **argv) {
return true;
}
bool Debugger::cmd_swap_renderer(int argc, const char **argv) {
bool accel = ConfMan.getBool("soft_renderer");
ConfMan.setBool("soft_renderer", !accel);
bool Debugger::cmd_set_renderer(int argc, const char **argv) {
if (argc < 2) {
debugPrintf("Usage: set_renderer <renderer>\n");
debugPrintf("Where <renderer> is 'software', 'opengl' or 'opengl_shaders'\n");
return true;
}
Graphics::RendererType renderer = Graphics::parseRendererTypeCode(argv[1]);
if (renderer == Graphics::kRendererTypeDefault) {
debugPrintf("Invalid renderer '%s'\n", argv[1]);
return true;
}
ConfMan.set("renderer", Graphics::getRendererTypeCode(renderer));
g_grim->changeHardwareState();
return true;
return false;
}
bool Debugger::cmd_save(int argc, const char **argv) {

View File

@ -37,7 +37,7 @@ public:
bool cmd_checkFiles(int argc, const char **argv);
bool cmd_lua_do(int argc, const char **argv);
bool cmd_jump(int argc, const char **argv);
bool cmd_swap_renderer(int argc, const char **argv);
bool cmd_set_renderer(int argc, const char **argv);
bool cmd_save(int argc, const char **argv);
bool cmd_load(int argc, const char **argv);
};

View File

@ -308,6 +308,7 @@ protected:
// Factory-like functions:
GfxBase *CreateGfxOpenGL();
GfxBase *CreateGfxOpenGLShader();
GfxBase *CreateGfxTinyGL();
extern GfxBase *g_driver;

View File

@ -205,7 +205,7 @@ Math::Matrix4 makeFrustumMatrix(double left, double right, double bottom, double
return proj;
}
GfxBase *CreateGfxOpenGL() {
GfxBase *CreateGfxOpenGLShader() {
return new GfxOpenGLS();
}

View File

@ -34,6 +34,7 @@
#include "common/translation.h"
#include "graphics/pixelbuffer.h"
#include "graphics/renderer.h"
#include "gui/error.h"
#include "gui/gui-manager.h"
@ -99,7 +100,6 @@ GrimEngine::GrimEngine(OSystem *syst, uint32 gameFlags, GrimGameType gameType, C
g_imuse = nullptr;
//Set default settings
ConfMan.registerDefault("soft_renderer", false);
ConfMan.registerDefault("engine_speed", 60);
ConfMan.registerDefault("fullscreen", false);
ConfMan.registerDefault("show_fps", false);
@ -228,23 +228,32 @@ LuaBase *GrimEngine::createLua() {
return new Lua_V1();
}
void GrimEngine::createRenderer() {
#ifdef USE_OPENGL
_softRenderer = ConfMan.getBool("soft_renderer");
#endif
GfxBase *GrimEngine::createRenderer() {
Common::String rendererConfig = ConfMan.get("renderer");
Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig);
Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType);
if (!_softRenderer && !g_system->hasFeature(OSystem::kFeatureOpenGL)) {
warning("gfx backend doesn't support hardware rendering");
_softRenderer = true;
if (matchingRendererType != desiredRendererType && desiredRendererType != Graphics::kRendererTypeDefault) {
// Display a warning if unable to use the desired renderer
warning("Unable to create a '%s' renderer", rendererConfig.c_str());
}
if (_softRenderer) {
g_driver = CreateGfxTinyGL();
#ifdef USE_OPENGL
} else {
g_driver = CreateGfxOpenGL();
#endif
_softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL;
#if defined(USE_GLES2) || defined(USE_OPENGL_SHADERS)
if (matchingRendererType == Graphics::kRendererTypeOpenGLShaders) {
return CreateGfxOpenGLShader();
}
#elif defined(USE_OPENGL)
if (matchingRendererType == Graphics::kRendererTypeOpenGL) {
return CreateGfxOpenGL();
}
#endif
if (matchingRendererType == Graphics::kRendererTypeTinyGL) {
return CreateGfxTinyGL();
}
error("Unable to create a '%s' renderer", rendererConfig.c_str());
}
const char *GrimEngine::getUpdateFilename() {
@ -317,7 +326,7 @@ Common::Error GrimEngine::run() {
g_sound = new SoundPlayer();
bool fullscreen = ConfMan.getBool("fullscreen");
createRenderer();
g_driver = createRenderer();
g_driver->setupScreen(640, 480, fullscreen);
g_driver->loadEmergFont();
@ -767,7 +776,7 @@ void GrimEngine::mainLoop() {
clearPools();
delete g_driver;
createRenderer();
g_driver = createRenderer();
g_driver->setupScreen(screenWidth, screenHeight, fullscreen);
savegameRestore();

View File

@ -47,6 +47,7 @@ class TextObject;
class PrimitiveObject;
class Debugger;
class LuaBase;
class GfxBase;
enum GrimGameType {
GType_GRIM,
@ -204,7 +205,7 @@ protected:
void cameraPostChangeHandle(int num);
void buildActiveActorsList();
void savegameCallback();
void createRenderer();
GfxBase *createRenderer();
void playAspyrLogo();
virtual LuaBase *createLua();
virtual void updateNormalMode();

View File

@ -26,6 +26,7 @@
#include "common/config-manager.h"
#include "graphics/pixelbuffer.h"
#include "graphics/renderer.h"
#include "graphics/colormasks.h"
#include "math/matrix3.h"
@ -289,7 +290,11 @@ void Lua_V1::Is3DHardwareEnabled() {
void Lua_V1::SetHardwareState() {
// changing only in config setup (software/hardware rendering)
bool accel = getbool(1);
ConfMan.setBool("soft_renderer", !accel);
Graphics::RendererType renderer = accel ? Graphics::kRendererTypeOpenGL : Graphics::kRendererTypeTinyGL;
renderer = Graphics::getBestMatchingAvailableRendererType(renderer);
ConfMan.set("renderer", Graphics::getRendererTypeCode(renderer));
g_grim->changeHardwareState();
}

View File

@ -28,6 +28,9 @@
#include "engines/myst3/gfx.h"
#include "common/config-manager.h"
#include "graphics/renderer.h"
#include "graphics/surface.h"
#include "math/glmath.h"
@ -208,4 +211,30 @@ void BaseRenderer::flipVertical(Graphics::Surface *s) {
}
}
Renderer *createRenderer(OSystem *system) {
Common::String rendererConfig = ConfMan.get("renderer");
Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig);
Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType);
if (matchingRendererType != desiredRendererType && desiredRendererType != Graphics::kRendererTypeDefault) {
// Display a warning if unable to use the desired renderer
warning("Unable to create a '%s' renderer", rendererConfig.c_str());
}
#if defined(USE_GLES2) || defined(USE_OPENGL_SHADERS)
if (matchingRendererType == Graphics::kRendererTypeOpenGLShaders) {
return CreateGfxOpenGLShader(system);
}
#elif defined(USE_OPENGL)
if (matchingRendererType == Graphics::kRendererTypeOpenGL) {
return CreateGfxOpenGL(system);
}
#endif
if (matchingRendererType == Graphics::kRendererTypeTinyGL) {
return CreateGfxTinyGL(system);
}
error("Unable to create a '%s' renderer", rendererConfig.c_str());
}
} // End of namespace Myst3

View File

@ -144,6 +144,7 @@ protected:
Renderer *CreateGfxOpenGL(OSystem *system);
Renderer *CreateGfxOpenGLShader(OSystem *system);
Renderer *CreateGfxTinyGL(OSystem *system);
Renderer *createRenderer(OSystem *system);
} // End of namespace Myst3

View File

@ -52,6 +52,7 @@
#include "image/jpeg.h"
#include "graphics/conversion.h"
#include "graphics/renderer.h"
#include "graphics/yuv_to_rgb.h"
#include "math/vector2d.h"
@ -136,7 +137,10 @@ Myst3Engine::~Myst3Engine() {
bool Myst3Engine::hasFeature(EngineFeature f) const {
// The TinyGL renderer does not support arbitrary resolutions for now
bool softRenderer = ConfMan.getBool("soft_renderer");
Common::String rendererConfig = ConfMan.get("renderer");
Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig);
Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType);
bool softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL;
return
(f == kSupportsRTL) ||
@ -150,19 +154,7 @@ Common::Error Myst3Engine::run() {
return Common::kUserCanceled;
}
bool softRenderer = ConfMan.getBool("soft_renderer");
if (softRenderer) {
_gfx = CreateGfxTinyGL(_system);
} else {
#if defined(USE_GLES2) || defined(USE_OPENGL_SHADERS)
_gfx = CreateGfxOpenGLShader(_system);
#elif defined(USE_OPENGL)
_gfx = CreateGfxOpenGL(_system);
#else
_gfx = CreateGfxTinyGL(_system);
#endif
}
_gfx = createRenderer(_system);
_sound = new Sound(this);
_ambient = new Ambient(this);
_rnd = new Common::RandomSource("sprint");