GRIM: Check at runtime that shaders are available
This commit is contained in:
parent
6c5df1ca35
commit
3f295ec773
5 changed files with 29 additions and 19 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,33 +232,48 @@ 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() {
|
||||||
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue