GRIM: Check at runtime that shaders are available

This commit is contained in:
Bastien Bouclet 2016-01-10 10:09:08 +01:00
parent 6c5df1ca35
commit 3f295ec773
5 changed files with 29 additions and 19 deletions

View file

@ -130,8 +130,6 @@ GfxOpenGL::~GfxOpenGL() {
} }
byte *GfxOpenGL::setupScreen(int screenW, int screenH, bool fullscreen) { byte *GfxOpenGL::setupScreen(int screenW, int screenH, bool fullscreen) {
g_system->setupScreen(screenW, screenH, fullscreen, true);
_pixelFormat = g_system->getScreenPixelBuffer().getFormat(); _pixelFormat = g_system->getScreenPixelBuffer().getFormat();
_screenWidth = screenW; _screenWidth = screenW;
_screenHeight = screenH; _screenHeight = screenH;

View file

@ -405,8 +405,6 @@ void GfxOpenGLS::setupShaders() {
} }
byte *GfxOpenGLS::setupScreen(int screenW, int screenH, bool fullscreen) { byte *GfxOpenGLS::setupScreen(int screenW, int screenH, bool fullscreen) {
g_system->setupScreen(screenW, screenH, fullscreen, true);
_pixelFormat = g_system->getScreenPixelBuffer().getFormat(); _pixelFormat = g_system->getScreenPixelBuffer().getFormat();
_screenWidth = screenW; _screenWidth = screenW;
_screenHeight = screenH; _screenHeight = screenH;

View file

@ -78,8 +78,6 @@ GfxTinyGL::~GfxTinyGL() {
} }
byte *GfxTinyGL::setupScreen(int screenW, int screenH, bool fullscreen) { byte *GfxTinyGL::setupScreen(int screenW, int screenH, bool fullscreen) {
g_system->setupScreen(screenW, screenH, fullscreen, false);
Graphics::PixelBuffer buf = g_system->getScreenPixelBuffer(); Graphics::PixelBuffer buf = g_system->getScreenPixelBuffer();
byte *buffer = buf.getRawBuffer(); byte *buffer = buf.getRawBuffer();

View file

@ -36,6 +36,10 @@
#include "graphics/pixelbuffer.h" #include "graphics/pixelbuffer.h"
#include "graphics/renderer.h" #include "graphics/renderer.h"
#ifdef USE_OPENGL
#include "graphics/opengl/context.h"
#endif
#include "gui/error.h" #include "gui/error.h"
#include "gui/gui-manager.h" #include "gui/gui-manager.h"
#include "gui/message.h" #include "gui/message.h"
@ -228,35 +232,50 @@ LuaBase *GrimEngine::createLua() {
return new Lua_V1(); return new Lua_V1();
} }
GfxBase *GrimEngine::createRenderer() { GfxBase *GrimEngine::createRenderer(int screenW, int screenH) {
Common::String rendererConfig = ConfMan.get("renderer"); Common::String rendererConfig = ConfMan.get("renderer");
Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig); Graphics::RendererType desiredRendererType = Graphics::parseRendererTypeCode(rendererConfig);
Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType); Graphics::RendererType matchingRendererType = Graphics::getBestMatchingAvailableRendererType(desiredRendererType);
bool fullscreen = ConfMan.getBool("fullscreen");
_softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL;
_system->setupScreen(screenW, screenH, fullscreen, !_softRenderer);
#if defined(USE_OPENGL)
// Check the OpenGL context actually supports shaders
if (matchingRendererType == Graphics::kRendererTypeOpenGLShaders && !OpenGLContext.shadersSupported) {
matchingRendererType = Graphics::kRendererTypeOpenGL;
}
#endif
if (matchingRendererType != desiredRendererType && desiredRendererType != Graphics::kRendererTypeDefault) { if (matchingRendererType != desiredRendererType && desiredRendererType != Graphics::kRendererTypeDefault) {
// Display a warning if unable to use the desired renderer // Display a warning if unable to use the desired renderer
warning("Unable to create a '%s' renderer", rendererConfig.c_str()); warning("Unable to create a '%s' renderer", rendererConfig.c_str());
} }
_softRenderer = matchingRendererType == Graphics::kRendererTypeTinyGL; GfxBase *renderer = nullptr;
#if defined(USE_GLES2) || defined(USE_OPENGL_SHADERS) #if defined(USE_GLES2) || defined(USE_OPENGL_SHADERS)
if (matchingRendererType == Graphics::kRendererTypeOpenGLShaders) { if (matchingRendererType == Graphics::kRendererTypeOpenGLShaders) {
return CreateGfxOpenGLShader(); renderer = CreateGfxOpenGLShader();
} }
#endif #endif
#if defined(USE_OPENGL) && !defined(USE_GLES2) #if defined(USE_OPENGL) && !defined(USE_GLES2)
if (matchingRendererType == Graphics::kRendererTypeOpenGL) { if (matchingRendererType == Graphics::kRendererTypeOpenGL) {
return CreateGfxOpenGL(); renderer = CreateGfxOpenGL();
} }
#endif #endif
if (matchingRendererType == Graphics::kRendererTypeTinyGL) { if (matchingRendererType == Graphics::kRendererTypeTinyGL) {
return CreateGfxTinyGL(); renderer = CreateGfxTinyGL();
} }
if (!renderer) {
error("Unable to create a '%s' renderer", rendererConfig.c_str()); error("Unable to create a '%s' renderer", rendererConfig.c_str());
} }
renderer->setupScreen(screenW, screenH, fullscreen);
return renderer;
}
const char *GrimEngine::getUpdateFilename() { const char *GrimEngine::getUpdateFilename() {
if (!(getGameFlags() & ADGF_DEMO)) if (!(getGameFlags() & ADGF_DEMO))
return "gfupd101.exe"; return "gfupd101.exe";
@ -326,9 +345,7 @@ Common::Error GrimEngine::run() {
} }
g_sound = new SoundPlayer(); g_sound = new SoundPlayer();
bool fullscreen = ConfMan.getBool("fullscreen"); g_driver = createRenderer(640, 480);
g_driver = createRenderer();
g_driver->setupScreen(640, 480, fullscreen);
g_driver->loadEmergFont(); g_driver->loadEmergFont();
if (getGameType() == GType_MONKEY4 && SearchMan.hasFile("AMWI.m4b")) { if (getGameType() == GType_MONKEY4 && SearchMan.hasFile("AMWI.m4b")) {
@ -777,8 +794,7 @@ void GrimEngine::mainLoop() {
clearPools(); clearPools();
delete g_driver; delete g_driver;
g_driver = createRenderer(); g_driver = createRenderer(screenWidth, screenHeight);
g_driver->setupScreen(screenWidth, screenHeight, fullscreen);
savegameRestore(); savegameRestore();
if (mode == DrawMode) { if (mode == DrawMode) {

View file

@ -198,7 +198,7 @@ protected:
void cameraPostChangeHandle(int num); void cameraPostChangeHandle(int num);
void buildActiveActorsList(); void buildActiveActorsList();
void savegameCallback(); void savegameCallback();
GfxBase *createRenderer(); GfxBase *createRenderer(int screenW, int screenH);
void playAspyrLogo(); void playAspyrLogo();
virtual LuaBase *createLua(); virtual LuaBase *createLua();
virtual void updateNormalMode(); virtual void updateNormalMode();