summaryrefslogtreecommitdiff
path: root/src/graphicsmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphicsmanager.cpp')
-rw-r--r--src/graphicsmanager.cpp1724
1 files changed, 0 insertions, 1724 deletions
diff --git a/src/graphicsmanager.cpp b/src/graphicsmanager.cpp
deleted file mode 100644
index 108facc73..000000000
--- a/src/graphicsmanager.cpp
+++ /dev/null
@@ -1,1724 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2012-2017 The ManaPlus Developers
- *
- * This file is part of The ManaPlus Client.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "graphicsmanager.h"
-
-#ifdef USE_OPENGL
-#ifndef WIN32
-
-#ifdef ANDROID
-#include <GLES2/gl2.h>
-#include <GLES/glext.h>
-#include <EGL/egl.h>
-
-#ifndef USE_SDL2
-PRAGMA48(GCC diagnostic push)
-PRAGMA48(GCC diagnostic ignored "-Wshadow")
-#include <SDL_android.h>
-PRAGMA48(GCC diagnostic pop)
-#endif // USE_SDL2
-#elif defined(__native_client__)
-#include <GL/Regal.h>
-#include "render/opengl/naclglfunctions.h"
-#else // ANDROID
-#ifdef USE_X11
-#include <GL/glx.h>
-#endif // USE_X11
-#endif // ANDROID
-#endif // WIN32
-#endif // USE_OPENGL
-
-#include "settings.h"
-
-#ifdef USE_OPENGL
-#include "render/mobileopengl2graphics.h"
-#include "render/mobileopenglgraphics.h"
-#include "render/modernopenglgraphics.h"
-#include "render/normalopenglgraphics.h"
-#include "render/safeopenglgraphics.h"
-
-#include "render/opengl/mgl.h"
-#include "render/opengl/mglcheck.h"
-#include "render/opengl/mglemu.h"
-#endif // USE_OPENGL
-
-#include "render/sdlgraphics.h"
-
-#ifdef USE_OPENGL
-#include "resources/openglimagehelper.h"
-#include "resources/openglscreenshothelper.h"
-#ifndef ANDROID
-#include "resources/mobileopenglscreenshothelper.h"
-#include "resources/safeopenglimagehelper.h"
-#endif // ANDROID
-#include "render/opengl/mglfunctions.h"
-#endif // USE_OPENGL
-
-#include "resources/sdlimagehelper.h"
-#include "resources/sdlscreenshothelper.h"
-
-#ifdef USE_SDL2
-#include "render/sdl2softwaregraphics.h"
-
-#include "resources/sdl2softwareimagehelper.h"
-#include "resources/sdl2softwarescreenshothelper.h"
-#include "resources/surfaceimagehelper.h"
-#endif // USE_SDL2
-
-#include "utils/delete2.h"
-#include "utils/sdlhelper.h"
-
-#ifdef USE_OPENGL
-#include "test/testmain.h"
-#else // USE_OPENGL
-#include "configuration.h"
-
-#include "render/renderers.h"
-#endif // USE_OPENGL
-
-PRAGMA48(GCC diagnostic push)
-PRAGMA48(GCC diagnostic ignored "-Wshadow")
-#include <SDL_syswm.h>
-PRAGMA48(GCC diagnostic pop)
-
-#include "debug.h"
-
-#ifdef USE_OPENGL
-#ifndef GL_MAX_RENDERBUFFER_SIZE
-#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
-#endif // GL_MAX_RENDERBUFFER_SIZE
-#define useCompression(name) \
- OpenGLImageHelper::setInternalTextureType(name); \
- logger->log("using " #name " texture compression");
-#endif // USE_OPENGL
-
-GraphicsManager graphicsManager;
-
-RenderType openGLMode = RENDER_SOFTWARE;
-
-ScreenshotHelper *screenshortHelper = nullptr;
-
-const int densitySize = 6;
-
-const std::string densityNames[] =
-{
- "low",
- "medium",
- "tv",
- "high",
- "xhigh",
- "xxhigh"
-};
-
-#ifdef USE_OPENGL
-GLenum GraphicsManager::mLastError(GL_NO_ERROR);
-#endif // USE_OPENGL
-
-GraphicsManager::GraphicsManager() :
- mExtensions(),
- mPlatformExtensions(),
- mGlVersionString(),
- mGlVendor(),
- mGlRenderer(),
- mGlShaderVersionString(),
- mMinor(0),
- mMajor(0),
- mSLMinor(0),
- mSLMajor(0),
- mPlatformMinor(0),
- mPlatformMajor(0),
- mMaxVertices(500),
- mMaxFboSize(0),
- mMaxWidth(0),
- mMaxHeight(0),
- mWidthMM(0),
- mHeightMM(0),
- mDensity(-1),
-#ifdef USE_OPENGL
- mUseTextureSampler(true),
- mTextureSampler(0),
- mSupportDebug(0),
- mSupportModernOpengl(false),
- mGles(false),
-#endif // USE_OPENGL
- mUseAtlases(false)
-{
-}
-
-GraphicsManager::~GraphicsManager()
-{
-#ifdef USE_OPENGL
- if (isGLNotNull(mglGenSamplers) && mTextureSampler)
- mglDeleteSamplers(1, &mTextureSampler);
-#endif // USE_OPENGL
-}
-
-#ifdef USE_OPENGL
-TestMain *GraphicsManager::startDetection()
-{
- TestMain *const test = new TestMain;
- test->exec(false);
- return test;
-}
-
-int GraphicsManager::detectGraphics()
-{
- logger->log1("start detecting best mode...");
- logger->log1("enable opengl mode");
- int textureSampler = 0;
- int compressTextures = 0;
-#if !defined(ANDROID) && !defined(__native_client__)
- mainGraphics = new NormalOpenGLGraphics;
-#endif // !defined(ANDROID) && !defined(__native_client__)
-
- SDL_Window *const window = createWindow(100, 100, 0,
- SDL_ANYFORMAT | SDL_OPENGL);
- mainGraphics->setWindow(window, 100, 100);
- mainGraphics->createGLContext(false);
-
- initOpenGL();
- logVersion();
-
- RenderType mode = RENDER_NORMAL_OPENGL;
-
- // detecting features by known renderers or vendors
- if (findI(mGlRenderer, "gdi generic") != std::string::npos)
- {
- // windows gdi OpenGL emulation
- logger->log("detected gdi drawing");
- logger->log("disable OpenGL");
- mode = RENDER_SOFTWARE;
- }
- else if (findI(mGlRenderer, "Software Rasterizer") != std::string::npos)
- {
- // software OpenGL emulation
- logger->log("detected software drawing");
- logger->log("disable OpenGL");
- mode = RENDER_SOFTWARE;
- }
- else if (findI(mGlRenderer, "Indirect") != std::string::npos)
- {
- // indirect OpenGL drawing
- logger->log("detected indirect drawing");
- logger->log("disable OpenGL");
- mode = RENDER_SOFTWARE;
- }
- else if (findI(mGlVendor, "VMWARE") != std::string::npos)
- {
- // vmware emulation
- logger->log("detected VMWARE driver");
- logger->log("disable OpenGL");
- mode = RENDER_SOFTWARE;
- }
- else if (findI(mGlVendor, "NVIDIA") != std::string::npos)
- {
- // hope it can work well
- logger->log("detected NVIDIA driver");
- config.setValue("useTextureSampler", true);
- textureSampler = 1;
- mode = RENDER_NORMAL_OPENGL;
- }
-
- // detecting feature based on OpenGL version
- if (!checkGLVersion(1, 1))
- {
- // very old OpenGL version
- logger->log("OpenGL version too old");
- mode = RENDER_SOFTWARE;
- }
-
- if (mode != RENDER_SOFTWARE && findI(mGlVersionString, "Mesa")
- != std::string::npos)
- {
- // Mesa detected. In latest Mesa look like compression broken.
- config.setValue("compresstextures", false);
- compressTextures = 0;
- }
-
- config.setValue("opengl", CAST_S32(mode));
- config.setValue("videoconfigured", true);
- config.write();
-
- logger->log("detection complete");
- return CAST_U32(mode)
- | (1024 * textureSampler) | (2048 * compressTextures);
-}
-
-#ifdef USE_SDL2
-#define RENDER_SOFTWARE_INIT \
- imageHelper = new SDL2SoftwareImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new SDL2SoftwareGraphics; \
- screenshortHelper = new Sdl2SoftwareScreenshotHelper;
-#define RENDER_SDL2_DEFAULT_INIT \
- imageHelper = new SDLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new SDLGraphics; \
- screenshortHelper = new SdlScreenshotHelper; \
- mainGraphics->setRendererFlags(SDL_RENDERER_ACCELERATED); \
- mUseTextureSampler = false;
-#else // USE_SDL2
-#define RENDER_SOFTWARE_INIT \
- imageHelper = new SDLImageHelper; \
- surfaceImageHelper = imageHelper; \
- mainGraphics = new SDLGraphics; \
- screenshortHelper = new SdlScreenshotHelper;
-#define RENDER_SDL2_DEFAULT_INIT
-#endif // USE_SDL2
-
-#if defined(ANDROID) || defined(__native_client__)
-#define RENDER_NORMAL_OPENGL_INIT
-#define RENDER_MODERN_OPENGL_INIT
-#else // defined(ANDROID) || defined(__native_client__)
-#define RENDER_NORMAL_OPENGL_INIT \
- imageHelper = new OpenGLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new NormalOpenGLGraphics; \
- screenshortHelper = new OpenGLScreenshotHelper; \
- mUseTextureSampler = true;
-#define RENDER_MODERN_OPENGL_INIT \
- imageHelper = new OpenGLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new ModernOpenGLGraphics; \
- screenshortHelper = new OpenGLScreenshotHelper; \
- mUseTextureSampler = true;
-#endif // defined(ANDROID) || defined(__native_client__)
-
-#if defined(ANDROID)
-#define RENDER_SAFE_OPENGL_INIT
-#define RENDER_GLES2_OPENGL_INIT
-#else // defined(ANDROID)
-#define RENDER_SAFE_OPENGL_INIT \
- imageHelper = new SafeOpenGLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new SafeOpenGLGraphics; \
- screenshortHelper = new OpenGLScreenshotHelper; \
- mUseTextureSampler = false;
-#define RENDER_GLES2_OPENGL_INIT \
- imageHelper = new OpenGLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new MobileOpenGL2Graphics; \
- screenshortHelper = new MobileOpenGLScreenshotHelper; \
- mUseTextureSampler = false;
-#endif // defined(ANDROID)
-
-#if defined(__native_client__)
-#define RENDER_GLES_OPENGL_INIT
-#else // defined(__native_client__)
-#define RENDER_GLES_OPENGL_INIT \
- imageHelper = new OpenGLImageHelper; \
- surfaceImageHelper = new SurfaceImageHelper; \
- mainGraphics = new MobileOpenGLGraphics; \
- screenshortHelper = new OpenGLScreenshotHelper; \
- mUseTextureSampler = false;
-#endif // defined(__native_client__)
-
-void GraphicsManager::createRenderers()
-{
- RenderType useOpenGL = RENDER_SOFTWARE;
- if (!settings.options.noOpenGL)
- {
- if (settings.options.renderer < 0)
- {
- useOpenGL = intToRenderType(config.getIntValue("opengl"));
- settings.options.renderer = CAST_S32(useOpenGL);
- }
- else
- {
- useOpenGL = intToRenderType(settings.options.renderer);
- }
- }
-
- // Setup image loading for the right image format
- ImageHelper::setOpenGlMode(useOpenGL);
-
- // Create the graphics context
- switch (useOpenGL)
- {
- case RENDER_SOFTWARE:
- RENDER_SOFTWARE_INIT
- mUseTextureSampler = false;
- break;
- case RENDER_LAST:
- case RENDER_NULL:
- default:
- break;
- case RENDER_NORMAL_OPENGL:
- RENDER_NORMAL_OPENGL_INIT
- break;
- case RENDER_SAFE_OPENGL:
- RENDER_SAFE_OPENGL_INIT
- break;
- case RENDER_MODERN_OPENGL:
- RENDER_MODERN_OPENGL_INIT
- break;
- case RENDER_GLES2_OPENGL:
- RENDER_GLES2_OPENGL_INIT
- break;
- case RENDER_GLES_OPENGL:
- RENDER_GLES_OPENGL_INIT
- break;
- case RENDER_SDL2_DEFAULT:
- RENDER_SDL2_DEFAULT_INIT
- break;
- };
- mUseAtlases = (useOpenGL == RENDER_NORMAL_OPENGL ||
- useOpenGL == RENDER_SAFE_OPENGL ||
- useOpenGL == RENDER_MODERN_OPENGL ||
- useOpenGL == RENDER_GLES_OPENGL ||
- useOpenGL == RENDER_GLES2_OPENGL) &&
- config.getBoolValue("useAtlases");
-
-#else // USE_OPENGL
-
-void GraphicsManager::createRenderers()
-{
- RenderType useOpenGL = RENDER_SOFTWARE;
- if (!settings.options.noOpenGL)
- useOpenGL = intToRenderType(config.getIntValue("opengl"));
-
- // Setup image loading for the right image format
- ImageHelper::setOpenGlMode(useOpenGL);
-
- // Create the graphics context
- switch (useOpenGL)
- {
- case RENDER_SOFTWARE:
- case RENDER_SAFE_OPENGL:
- case RENDER_GLES_OPENGL:
- case RENDER_GLES2_OPENGL:
- case RENDER_MODERN_OPENGL:
- case RENDER_NORMAL_OPENGL:
- case RENDER_NULL:
- case RENDER_LAST:
- default:
-#ifndef USE_SDL2
- case RENDER_SDL2_DEFAULT:
- imageHelper = new SDLImageHelper;
- surfaceImageHelper = imageHelper;
- mainGraphics = new SDLGraphics;
- screenshortHelper = new SdlScreenshotHelper;
-#else // USE_SDL2
-
- imageHelper = new SDL2SoftwareImageHelper;
- surfaceImageHelper = new SurfaceImageHelper;
- mainGraphics = new SDL2SoftwareGraphics;
- screenshortHelper = new Sdl2SoftwareScreenshotHelper;
-
-#endif // USE_SDL2
-
- break;
-#ifdef USE_SDL2
- case RENDER_SDL2_DEFAULT:
- imageHelper = new SDLImageHelper;
- surfaceImageHelper = new SurfaceImageHelper;
- mainGraphics = new SDLGraphics;
- mainGraphics->setRendererFlags(SDL_RENDERER_ACCELERATED);
- screenshortHelper = new SdlScreenshotHelper;
- break;
-#endif // USE_SDL2
- };
-#endif // USE_OPENGL
-}
-
-void GraphicsManager::deleteRenderers()
-{
- delete2(mainGraphics);
- if (imageHelper != surfaceImageHelper)
- delete surfaceImageHelper;
- surfaceImageHelper = nullptr;
- delete2(imageHelper);
-}
-
-void GraphicsManager::setVideoMode()
-{
- const int bpp = 0;
- const bool fullscreen = config.getBoolValue("screen");
- const bool hwaccel = config.getBoolValue("hwaccel");
- const bool enableResize = config.getBoolValue("enableresize");
- const bool noFrame = config.getBoolValue("noframe");
- const bool allowHighDPI = config.getBoolValue("allowHighDPI");
-
-#ifdef ANDROID
-// int width = config.getValue("screenwidth", 0);
-// int height = config.getValue("screenheight", 0);
- StringVect videoModes;
- SDL::getAllVideoModes(videoModes);
- if (videoModes.empty())
- logger->error("no video modes detected");
- STD_VECTOR<int> res;
- splitToIntVector(res, videoModes[0], 'x');
- if (res.size() != 2)
- logger->error("no video modes detected");
-
- int width = res[0];
- int height = res[1];
-#elif defined __native_client__
-#ifdef USE_SDL2
- // not implemented
-#else // USE_SDL2
-
- const SDL_VideoInfo* info = SDL_GetVideoInfo();
- int width = info->current_w;
- int height = info->current_h;
-#endif // USE_SDL2
-#else // defined __native_client__
-
- int width = config.getIntValue("screenwidth");
- int height = config.getIntValue("screenheight");
-#endif // defined __native_client__
-
- const int scale = config.getIntValue("scale");
-
- // Try to set the desired video mode
- if (!mainGraphics->setVideoMode(width, height, scale, bpp,
- fullscreen, hwaccel, enableResize, noFrame, allowHighDPI))
- {
- logger->log(strprintf("Couldn't set %dx%dx%d video mode: %s",
- width, height, bpp, SDL_GetError()));
-
- const int oldWidth = config.getValueInt("oldscreenwidth", -1);
- const int oldHeight = config.getValueInt("oldscreenheight", -1);
- const int oldFullscreen = config.getValueInt("oldscreen", -1);
- if (oldWidth != -1 && oldHeight != -1 && oldFullscreen != -1)
- {
- config.deleteKey("oldscreenwidth");
- config.deleteKey("oldscreenheight");
- config.deleteKey("oldscreen");
-
- config.setValueInt("screenwidth", oldWidth);
- config.setValueInt("screenheight", oldHeight);
- config.setValue("screen", oldFullscreen == 1);
- if (!mainGraphics->setVideoMode(oldWidth, oldHeight,
- scale,
- bpp,
- oldFullscreen != 0,
- hwaccel,
- enableResize,
- noFrame,
- allowHighDPI))
- {
- logger->safeError(strprintf("Couldn't restore %dx%dx%d "
- "video mode: %s", oldWidth, oldHeight, bpp,
- SDL_GetError()));
- }
- }
- }
-}
-
-void GraphicsManager::initGraphics()
-{
- openGLMode = intToRenderType(config.getIntValue("opengl"));
-#ifdef USE_OPENGL
- OpenGLImageHelper::setBlur(config.getBoolValue("blur"));
-#ifndef ANDROID
- SafeOpenGLImageHelper::setBlur(config.getBoolValue("blur"));
-#endif // ANDROID
- SurfaceImageHelper::SDLSetEnableAlphaCache(
- config.getBoolValue("alphaCache") &&
- openGLMode == RENDER_SOFTWARE);
- ImageHelper::setEnableAlpha((config.getFloatValue("guialpha") != 1.0F ||
- openGLMode != RENDER_SOFTWARE) &&
- config.getBoolValue("enableGuiOpacity"));
-#else // USE_OPENGL
- SurfaceImageHelper::SDLSetEnableAlphaCache(
- config.getBoolValue("alphaCache"));
- ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0F &&
- config.getBoolValue("enableGuiOpacity"));
-#endif // USE_OPENGL
- createRenderers();
- setVideoMode();
- detectPixelSize();
-#ifdef USE_OPENGL
- if (config.getBoolValue("checkOpenGLVersion") == true)
- {
- const RenderType oldOpenGLMode = openGLMode;
- if (openGLMode == RENDER_MODERN_OPENGL)
- {
- if (!mSupportModernOpengl || !checkGLVersion(3, 0))
- {
- logger->log("Fallback to normal OpenGL mode");
- openGLMode = RENDER_NORMAL_OPENGL;
- }
- }
- if (openGLMode == RENDER_NORMAL_OPENGL)
- {
- if (!checkGLVersion(2, 0))
- {
- logger->log("Fallback to safe OpenGL mode");
- openGLMode = RENDER_SAFE_OPENGL;
- }
- }
- if (openGLMode == RENDER_GLES_OPENGL)
- {
- if (!checkGLVersion(2, 0) && !checkGLesVersion(1, 0))
- {
- logger->log("Fallback to safe OpenGL mode");
- openGLMode = RENDER_SAFE_OPENGL;
- }
- }
- if (openGLMode == RENDER_GLES2_OPENGL)
- {
- // +++ here need check also not implemented gles flag
- if (!checkGLVersion(2, 0))
- {
- logger->log("Fallback to software mode");
- openGLMode = RENDER_SOFTWARE;
- }
- }
-
- if (openGLMode != oldOpenGLMode)
- {
- deleteRenderers();
- settings.options.renderer = CAST_S32(openGLMode);
- config.setValue("opengl", settings.options.renderer);
- createRenderers();
- setVideoMode();
- detectPixelSize();
- }
- }
-#if !defined(ANDROID) && !defined(__APPLE__)
- const std::string str = config.getStringValue("textureSize");
- STD_VECTOR<int> sizes;
- splitToIntVector(sizes, str, ',');
- const size_t pos = CAST_SIZE(openGLMode);
- if (sizes.size() <= pos)
- settings.textureSize = 1024;
- else
- settings.textureSize = sizes[pos];
- logger->log("Detected max texture size: %u", settings.textureSize);
-#endif // !defined(ANDROID) && !defined(__APPLE__)
-#endif // USE_OPENGL
-}
-
-#ifdef USE_SDL2
-SDL_Window *GraphicsManager::createWindow(const int w, const int h,
- const int bpp A_UNUSED,
- const int flags)
-{
- return SDL_CreateWindow("ManaPlus", SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED, w, h, flags);
-}
-
-SDL_Renderer *GraphicsManager::createRenderer(SDL_Window *const window,
- const int flags)
-{
- SDL::setRendererHint(config.getStringValue("sdlDriver"));
- SDL_Renderer *const renderer = SDL_CreateRenderer(window, -1, flags);
- SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
- return renderer;
-}
-#else // USE_SDL2
-
-SDL_Window *GraphicsManager::createWindow(const int w, const int h,
- const int bpp, const int flags)
-{
- return SDL_SetVideoMode(w, h, bpp, flags);
-}
-#endif // USE_SDL2
-
-#ifdef USE_OPENGL
-void GraphicsManager::updateExtensions()
-{
- mExtensions.clear();
- logger->log1("opengl extensions: ");
- if (checkGLVersion(3, 0))
- { // get extensions in new way
- assignFunction2(glGetStringi, "glGetStringi");
- std::string extList;
- int num = 0;
- glGetIntegerv(GL_NUM_EXTENSIONS, &num);
- for (int f = 0; f < num; f ++)
- {
- std::string str = reinterpret_cast<const char*>(
- mglGetStringi(GL_EXTENSIONS, f));
- mExtensions.insert(str);
- extList.append(str).append(" ");
- }
- logger->log1(extList.c_str());
- }
- else
- { // get extensions in old way
- char const *extensions = reinterpret_cast<char const *>(
- mglGetString(GL_EXTENSIONS));
- if (extensions)
- {
- logger->log1(extensions);
- splitToStringSet(mExtensions, extensions, ' ');
- }
- }
-}
-
-void GraphicsManager::updatePlanformExtensions()
-{
- SDL_SysWMinfo info;
- SDL_VERSION(&info.version);
- if (SDL::getWindowWMInfo(mainGraphics->getWindow(), &info))
- {
-#ifdef WIN32
- if (!mwglGetExtensionsString)
- return;
-
- HDC hdc = GetDC(info.window);
- if (hdc)
- {
- const char *const extensions = mwglGetExtensionsString(hdc);
- if (extensions)
- {
- logger->log1("wGL extensions:");
- logger->log1(extensions);
- splitToStringSet(mPlatformExtensions, extensions, ' ');
- }
- }
-#elif defined USE_X11
- Display *const display = info.info.x11.display;
- if (display)
- {
- Screen *const screen = XDefaultScreenOfDisplay(display);
- if (!screen)
- return;
-
- const int screenNum = XScreenNumberOfScreen(screen);
- const char *const extensions = glXQueryExtensionsString(
- display, screenNum);
- if (extensions)
- {
- logger->log1("glx extensions:");
- logger->log1(extensions);
- splitToStringSet(mPlatformExtensions, extensions, ' ');
- }
- glXQueryVersion(display, &mPlatformMajor, &mPlatformMinor);
- if (checkPlatformVersion(1, 1))
- {
- const char *const vendor1 = glXQueryServerString(
- display, screenNum, GLX_VENDOR);
- if (vendor1)
- logger->log("glx server vendor: %s", vendor1);
- const char *const version1 = glXQueryServerString(
- display, screenNum, GLX_VERSION);
- if (version1)
- logger->log("glx server version: %s", version1);
- const char *const extensions1 = glXQueryServerString(
- display, screenNum, GLX_EXTENSIONS);
- if (extensions1)
- {
- logger->log1("glx server extensions:");
- logger->log1(extensions1);
- }
-
- const char *const vendor2 = glXGetClientString(
- display, GLX_VENDOR);
- if (vendor2)
- logger->log("glx client vendor: %s", vendor2);
- const char *const version2 = glXGetClientString(
- display, GLX_VERSION);
- if (version2)
- logger->log("glx client version: %s", version2);
- const char *const extensions2 = glXGetClientString(
- display, GLX_EXTENSIONS);
- if (extensions2)
- {
- logger->log1("glx client extensions:");
- logger->log1(extensions2);
- }
- }
- logger->log("width=%d", DisplayWidth(display, screenNum));
- }
-#endif // WIN32
- }
-}
-
-bool GraphicsManager::supportExtension(const std::string &ext) const
-{
- return mExtensions.find(ext) != mExtensions.end();
-}
-
-void GraphicsManager::updateTextureCompressionFormat() const
-{
- const int compressionFormat = config.getIntValue("compresstextures");
- // using extensions if can
- if (checkGLVersion(3, 1) ||
- checkGLesVersion(2, 0) ||
- supportExtension("GL_ARB_texture_compression"))
- {
- GLint num = 0;
- mglGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &num);
- logger->log("support %d compressed formats", num);
- GLint *const formats = new GLint[num > 10
- ? CAST_SIZE(num) : 10];
- mglGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);
- for (int f = 0; f < num; f ++)
- logger->log(" 0x%x", CAST_U32(formats[f]));
-
- if (compressionFormat)
- {
- for (int f = 0; f < num; f ++)
- {
- switch (formats[f])
- {
- case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
- if (compressionFormat == 1)
- {
- delete []formats;
- useCompression(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT);
- return;
- }
- break;
- case GL_COMPRESSED_RGBA_FXT1_3DFX:
- if (compressionFormat == 2)
- {
- delete []formats;
- useCompression(GL_COMPRESSED_RGBA_FXT1_3DFX);
- return;
- }
- break;
- case GL_COMPRESSED_RGBA_BPTC_UNORM_ARB:
- if (compressionFormat == 4)
- {
- delete []formats;
- useCompression(GL_COMPRESSED_RGBA_BPTC_UNORM_ARB);
- return;
- }
- break;
- default:
- break;
- }
- }
- if (compressionFormat == 3)
- {
- delete []formats;
- useCompression(GL_COMPRESSED_RGBA_ARB);
- return;
- }
-
- // workaround for MESA bptc compression detection
- if (compressionFormat == 4
- && supportExtension("GL_ARB_texture_compression_bptc"))
- {
- delete []formats;
- useCompression(GL_COMPRESSED_RGBA_BPTC_UNORM_ARB);
- return;
- }
- }
- delete []formats;
- if (compressionFormat)
- logger->log1("no correct compression format found");
- }
- else
- {
- if (compressionFormat)
- logger->log1("no correct compression format found");
- }
-}
-
-void GraphicsManager::updateTextureFormat()
-{
- const int renderer = settings.options.renderer;
-
- // using default formats
- if (renderer == RENDER_MODERN_OPENGL ||
- renderer == RENDER_GLES_OPENGL ||
- renderer == RENDER_GLES2_OPENGL ||
- config.getBoolValue("newtextures"))
- {
- OpenGLImageHelper::setInternalTextureType(GL_RGBA);
-#ifndef ANDROID
- SafeOpenGLImageHelper::setInternalTextureType(GL_RGBA);
-#endif // ANDROID
-
- logger->log1("using RGBA texture format");
- }
- else
- {
- OpenGLImageHelper::setInternalTextureType(4);
-#ifndef ANDROID
- SafeOpenGLImageHelper::setInternalTextureType(4);
-#endif // ANDROID
-
- logger->log1("using 4 texture format");
- }
-}
-
-void GraphicsManager::logString(const char *const format, const int num)
-{
- const char *str = reinterpret_cast<const char*>(mglGetString(num));
- if (!str)
- logger->log(format, "?");
- else
- logger->log(format, str);
-}
-
-std::string GraphicsManager::getGLString(const int num)
-{
- const char *str = reinterpret_cast<const char*>(mglGetString(num));
- return str ? str : "";
-}
-
-void GraphicsManager::setGLVersion()
-{
- mGlVersionString = getGLString(GL_VERSION);
- std::string version = mGlVersionString;
- if (findCutFirst(version, "OpenGL ES "))
- mGles = true;
- sscanf(version.c_str(), "%5d.%5d", &mMajor, &mMinor);
- logger->log("Detected gl version: %d.%d", mMajor, mMinor);
- mGlVendor = getGLString(GL_VENDOR);
- mGlRenderer = getGLString(GL_RENDERER);
- mGlShaderVersionString = getGLString(GL_SHADING_LANGUAGE_VERSION);
- version = mGlShaderVersionString;
- cutFirst(version, "OpenGL ES GLSL ES ");
- cutFirst(version, "OpenGL ES GLSL ");
- cutFirst(version, "OpenGL ES ");
- sscanf(version.c_str(), "%5d.%5d", &mSLMajor, &mSLMinor);
- logger->log("Detected glsl version: %d.%d", mSLMajor, mSLMinor);
-#ifdef ANDROID
- if (!mMajor && !mMinor)
- {
- logger->log("Overriding detected OpenGL version on Android to 1.0");
- mGles = true;
- mMajor = 1;
- mMinor = 0;
- }
-#endif // ANDROID
-}
-
-void GraphicsManager::logVersion() const
-{
- logger->log("gl vendor: " + mGlVendor);
- logger->log("gl renderer: " + mGlRenderer);
- logger->log("gl version: " + mGlVersionString);
- logger->log("glsl version: " + mGlShaderVersionString);
-}
-
-bool GraphicsManager::checkGLVersion(const int major, const int minor) const
-{
- return mMajor > major || (mMajor == major && mMinor >= minor);
-}
-
-bool GraphicsManager::checkSLVersion(const int major, const int minor) const
-{
- return mSLMajor > major || (mSLMajor == major && mSLMinor >= minor);
-}
-
-bool GraphicsManager::checkGLesVersion(const int major, const int minor) const
-{
- return mGles && (mMajor > major || (mMajor == major && mMinor >= minor));
-}
-
-bool GraphicsManager::checkPlatformVersion(const int major,
- const int minor) const
-{
- return mPlatformMajor > major || (mPlatformMajor == major
- && mPlatformMinor >= minor);
-}
-
-void GraphicsManager::createFBO(const int width, const int height,
- FBOInfo *const fbo)
-{
- if (!fbo)
- return;
-
- // create a texture object
- glGenTextures(1, &fbo->textureId);
- glBindTexture(OpenGLImageHelper::mTextureType, fbo->textureId);
- glTexParameterf(OpenGLImageHelper::mTextureType,
- GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(OpenGLImageHelper::mTextureType,
- GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(OpenGLImageHelper::mTextureType,
- GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(OpenGLImageHelper::mTextureType,
- GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(OpenGLImageHelper::mTextureType, 0, GL_RGBA8, width, height,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
- glBindTexture(OpenGLImageHelper::mTextureType, 0);
-
- // create a renderbuffer object to store depth info
- mglGenRenderbuffers(1, &fbo->rboId);
- mglBindRenderbuffer(GL_RENDERBUFFER, fbo->rboId);
- mglRenderbufferStorage(GL_RENDERBUFFER,
- GL_DEPTH_COMPONENT, width, height);
- mglBindRenderbuffer(GL_RENDERBUFFER, 0);
-
- // create a framebuffer object
- mglGenFramebuffers(1, &fbo->fboId);
- mglBindFramebuffer(GL_FRAMEBUFFER, fbo->fboId);
-
- // attach the texture to FBO color attachment point
- mglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- OpenGLImageHelper::mTextureType, fbo->textureId, 0);
-
- // attach the renderbuffer to depth attachment point
- mglFramebufferRenderbuffer(GL_FRAMEBUFFER,
- GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo->rboId);
-
- mglBindFramebuffer(GL_FRAMEBUFFER, fbo->fboId);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-}
-
-void GraphicsManager::deleteFBO(FBOInfo *const fbo)
-{
- if (!fbo)
- return;
-
- mglBindFramebuffer(GL_FRAMEBUFFER, 0);
- if (fbo->fboId)
- {
- mglDeleteFramebuffers(1, &fbo->fboId);
- fbo->fboId = 0;
- }
- mglBindRenderbuffer(GL_RENDERBUFFER, 0);
- if (fbo->rboId)
- {
- mglDeleteRenderbuffers(1, &fbo->rboId);
- fbo->rboId = 0;
- }
- if (fbo->textureId)
- {
- glDeleteTextures(1, &fbo->textureId);
- fbo->textureId = 0;
- }
-}
-
-void GraphicsManager::initOpenGLFunctions()
-{
-#ifdef __native_client__
- emulateFunction(glTextureSubImage2DEXT);
-#else // __native_client__
-
- const bool is10 = checkGLVersion(1, 0);
- const bool is11 = checkGLVersion(1, 1);
- const bool is12 = checkGLVersion(1, 2);
- const bool is13 = checkGLVersion(1, 3);
- const bool is15 = checkGLVersion(1, 5);
- const bool is20 = checkGLVersion(2, 0);
- const bool is21 = checkGLVersion(2, 1);
- const bool is30 = checkGLVersion(3, 0);
- const bool is33 = checkGLVersion(3, 3);
- const bool is41 = checkGLVersion(4, 1);
- const bool is42 = checkGLVersion(4, 2);
- const bool is43 = checkGLVersion(4, 3);
- const bool is44 = checkGLVersion(4, 4);
- const bool is45 = checkGLVersion(4, 5);
- mSupportModernOpengl = true;
-
- // Texture sampler
- if (is10 && (is33 || supportExtension("GL_ARB_sampler_objects")))
- {
- logger->log1("found GL_ARB_sampler_objects");
- assignFunction(glGenSamplers);
- assignFunction(glDeleteSamplers);
- assignFunction(glBindSampler);
- assignFunction(glSamplerParameteri);
- if (isGLNotNull(mglGenSamplers)
- && config.getBoolValue("useTextureSampler"))
- {
- mUseTextureSampler &= true;
- }
- else
- {
- mUseTextureSampler = false;
- }
- }
- else
- {
- logger->log1("texture sampler not found");
- mUseTextureSampler = false;
- }
-
- if (!is11)
- {
- mSupportModernOpengl = false;
- emulateFunction(glTextureSubImage2DEXT);
- return;
- }
-
-/*
- if (findI(mGlVendor, "NVIDIA") != std::string::npos ||
- mGlVersionString.find("Mesa 10.6.") != std::string::npos ||
- mGlVersionString.find("Mesa 11.1.1") != std::string::npos ||
- mGlVersionString.find("Mesa 11.1.2") != std::string::npos ||
- mGlVersionString.find("Mesa 11.1.3") != std::string::npos ||
- mGlVersionString.find("Mesa 11.2") != std::string::npos ||
- (findI(mGlRenderer, "AMD Radeon HD") != std::string::npos &&
- (mGlVersionString.find(
- "Compatibility Profile Context 14.") != std::string::npos ||
- mGlVersionString.find(
- "Compatibility Profile Context 15.") != std::string::npos)))
- {
- logger->log1("Not checked for DSA because on "
- "NVIDIA or AMD or in Mesa it broken");
- emulateFunction(glTextureSubImage2DEXT);
- }
- else
-*/
- { // not for NVIDIA. in NVIDIA atleast in windows drivers DSA is broken
- // Mesa 10.6.3 show support for DSA, but it broken. Works in 10.7 dev
- if (config.getBoolValue("enableDSA") == true)
- {
- if (is45)
- {
- logger->log1("found GL_EXT_direct_state_access");
- assignFunction(glTextureSubImage2D);
- }
- else if (supportExtension("GL_EXT_direct_state_access"))
- {
- logger->log1("found GL_EXT_direct_state_access");
- assignFunctionEmu2(glTextureSubImage2DEXT,
- "glTextureSubImage2DEXT");
- }
- else if (supportExtension("GL_ARB_direct_state_access"))
- {
- logger->log1("found GL_ARB_direct_state_access");
- logger->log1("GL_EXT_direct_state_access not found");
- assignFunction(glTextureSubImage2D);
- }
- else
- {
- logger->log1("GL_EXT_direct_state_access not found");
- logger->log1("GL_ARB_direct_state_access not found");
- emulateFunction(glTextureSubImage2DEXT);
- }
- }
- else
- {
- logger->log1("Direct state access disabled in settings");
- emulateFunction(glTextureSubImage2DEXT);
- }
- }
-
- if (is12 && (is42 || supportExtension("GL_ARB_texture_storage")))
- {
- logger->log1("found GL_ARB_texture_storage");
- assignFunction(glTexStorage2D);
- }
- else
- {
- logger->log1("GL_ARB_texture_storage not found");
- }
-
- if (is13 || supportExtension("GL_ARB_multitexture"))
- {
- logger->log1("found GL_ARB_multitexture or OpenGL 1.3");
- assignFunction(glActiveTexture);
- }
- else
- {
- emulateFunction(glActiveTexture);
- logger->log1("GL_ARB_multitexture not found");
- }
-
- if (is20 || supportExtension("GL_ARB_explicit_attrib_location"))
- {
- logger->log1("found GL_ARB_explicit_attrib_location or OpenGL 2.0");
- assignFunction(glBindAttribLocation);
- }
- else
- {
- logger->log1("GL_ARB_explicit_attrib_location not found");
- }
-
- if (is30 || supportExtension("GL_ARB_framebuffer_object"))
- { // frame buffer supported
- logger->log1("found GL_ARB_framebuffer_object");
- assignFunction(glGenRenderbuffers);
- assignFunction(glBindRenderbuffer);
- assignFunction(glRenderbufferStorage);
- assignFunction(glGenFramebuffers);
- assignFunction(glBindFramebuffer);
- assignFunction(glFramebufferTexture2D);
- assignFunction(glFramebufferRenderbuffer);
- assignFunction(glDeleteFramebuffers);
- assignFunction(glDeleteRenderbuffers);
- assignFunction(glCheckFramebufferStatus);
- }
- else if (supportExtension("GL_EXT_framebuffer_object"))
- { // old frame buffer extension
- logger->log1("found GL_EXT_framebuffer_object");
- assignFunctionEXT(glGenRenderbuffers);
- assignFunctionEXT(glBindRenderbuffer);
- assignFunctionEXT(glRenderbufferStorage);
- assignFunctionEXT(glGenFramebuffers);
- assignFunctionEXT(glBindFramebuffer);
- assignFunctionEXT(glFramebufferTexture2D);
- assignFunctionEXT(glFramebufferRenderbuffer);
- assignFunctionEXT(glDeleteFramebuffers);
- assignFunctionEXT(glDeleteRenderbuffers);
- }
- else
- { // no frame buffer support
- logger->log1("GL_ARB_framebuffer_object or "
- "GL_EXT_framebuffer_object not found");
- config.setValue("usefbo", false);
- }
-
- // debug extensions
- if (is43 || supportExtension("GL_KHR_debug"))
- {
- logger->log1("found GL_KHR_debug");
- assignFunction(glDebugMessageControl);
- assignFunction(glDebugMessageCallback);
- assignFunction(glPushDebugGroup);
- assignFunction(glPopDebugGroup);
- assignFunction(glObjectLabel);
- mSupportDebug = 2;
- }
- else if (supportExtension("GL_ARB_debug_output"))
- {
- logger->log1("found GL_ARB_debug_output");
- assignFunctionARB(glDebugMessageControl);
- assignFunctionARB(glDebugMessageCallback);
- mSupportDebug = 1;
- }
- else
- {
- logger->log1("debug extensions not found");
- mSupportDebug = 0;
- }
-
- if (supportExtension("GL_GREMEDY_frame_terminator"))
- {
- logger->log1("found GL_GREMEDY_frame_terminator");
- assignFunction2(glFrameTerminator, "glFrameTerminatorGREMEDY");
- }
- else
- {
- logger->log1("GL_GREMEDY_frame_terminator not found");
- }
- if (is44 || supportExtension("GL_EXT_debug_label"))
- {
- logger->log1("found GL_EXT_debug_label");
- assignFunction2(glLabelObject, "glObjectLabel");
- if (isGLNull(mglLabelObject))
- assignFunctionEXT(glLabelObject);
- assignFunctionEXT(glGetObjectLabel);
- }
- else
- {
- logger->log1("GL_EXT_debug_label not found");
- }
- if (supportExtension("GL_GREMEDY_string_marker"))
- {
- logger->log1("found GL_GREMEDY_string_marker");
- assignFunction2(glPushGroupMarker, "glStringMarkerGREMEDY");
- }
- else
- {
- logger->log1("GL_GREMEDY_string_marker not found");
- }
- if (supportExtension("GL_EXT_debug_marker"))
- {
- logger->log1("found GL_EXT_debug_marker");
- assignFunctionEXT(glInsertEventMarker);
- assignFunctionEXT(glPushGroupMarker);
- assignFunctionEXT(glPopGroupMarker);
- }
- else
- {
- logger->log1("GL_EXT_debug_marker not found");
- }
- if (is15 && (is30 || supportExtension("GL_EXT_timer_query")))
- {
- logger->log1("found GL_EXT_timer_query");
- assignFunction(glGenQueries);
- assignFunction(glBeginQuery);
- assignFunction(glEndQuery);
- assignFunction(glDeleteQueries);
- assignFunction(glGetQueryObjectiv);
- assignFunctionEXT(glGetQueryObjectui64v);
- }
- else
- {
- logger->log1("GL_EXT_timer_query not supported");
- }
- if (is20 && (is43 || supportExtension("GL_ARB_invalidate_subdata")))
- {
- logger->log1("found GL_ARB_invalidate_subdata");
- assignFunction(glInvalidateTexImage);
- }
- else
- {
- logger->log1("GL_ARB_invalidate_subdata not supported");
- }
- if (is21 && (is30 || supportExtension("GL_ARB_vertex_array_object")))
- {
- logger->log1("found GL_ARB_vertex_array_object");
- assignFunction(glGenVertexArrays);
- assignFunction(glBindVertexArray);
- assignFunction(glDeleteVertexArrays);
- assignFunction(glVertexAttribPointer);
- assignFunction(glEnableVertexAttribArray);
- assignFunction(glDisableVertexAttribArray);
- assignFunction(glVertexAttribIPointer);
- }
- else
- {
- mSupportModernOpengl = false;
- logger->log1("GL_ARB_vertex_array_object not found");
- }
- if (is20 || supportExtension("GL_ARB_vertex_buffer_object"))
- {
- assignFunction(glGenBuffers);
- assignFunction(glDeleteBuffers);
- assignFunction(glBindBuffer);
- assignFunction(glBufferData);
- assignFunction(glIsBuffer);
- }
- else
- {
- mSupportModernOpengl = false;
- logger->log1("buffers extension not found");
- }
- if (is43 || supportExtension("GL_ARB_copy_image"))
- {
- logger->log1("found GL_ARB_copy_image");
- assignFunction(glCopyImageSubData);
- }
- else
- {
- logger->log1("GL_ARB_copy_image not found");
- }
- if (is44 || supportExtension("GL_ARB_clear_texture"))
- {
- logger->log1("found GL_ARB_clear_texture");
- assignFunction(glClearTexImage);
- assignFunction(glClearTexSubImage);
- }
- else
- {
- logger->log1("GL_ARB_clear_texture not found");
- }
- if (is20 || supportExtension("GL_ARB_shader_objects"))
- {
- logger->log1("found GL_ARB_shader_objects");
- assignFunction(glCreateShader);
- assignFunction(glDeleteShader);
- assignFunction(glGetShaderiv);
- assignFunction(glGetShaderInfoLog);
- assignFunction(glGetShaderSource);
- assignFunction(glShaderSource);
- assignFunction(glCompileShader);
- assignFunction(glLinkProgram);
- assignFunction(glGetProgramInfoLog);
- assignFunction(glDeleteProgram);
- assignFunction(glCreateProgram);
- assignFunction(glAttachShader);
- assignFunction(glDetachShader);
- assignFunction(glGetAttachedShaders);
- assignFunction(glGetUniformLocation);
- assignFunction(glGetActiveUniform);
- assignFunction(glGetProgramiv);
- assignFunction(glUseProgram);
- assignFunction(glValidateProgram);
- assignFunction(glGetAttribLocation);
- assignFunction(glUniform1f);
- assignFunction(glUniform2f);
- assignFunction(glUniform3f);
- assignFunction(glUniform4f);
-
- if (is30 || supportExtension("GL_EXT_gpu_shader4"))
- {
- logger->log1("found GL_EXT_gpu_shader4");
- assignFunction(glBindFragDataLocation);
- }
- else
- {
- mSupportModernOpengl = false;
- logger->log1("GL_EXT_gpu_shader4 not supported");
- }
- if (is41 || supportExtension("GL_ARB_separate_shader_objects"))
- {
- logger->log1("found GL_ARB_separate_shader_objects");
- assignFunction(glProgramUniform1f);
- assignFunction(glProgramUniform2f);
- assignFunction(glProgramUniform3f);
- assignFunction(glProgramUniform4f);
- }
- else
- {
- logger->log1("GL_ARB_separate_shader_objects not supported");
- }
- if (is43 || supportExtension("GL_ARB_vertex_attrib_binding"))
- {
- logger->log1("found GL_ARB_vertex_attrib_binding");
- assignFunction(glBindVertexBuffer);
- assignFunction(glVertexAttribBinding);
- assignFunction(glVertexAttribFormat);
- assignFunction(glVertexAttribIFormat);
- }
- else
- {
- mSupportModernOpengl = false;
- logger->log1("GL_ARB_vertex_attrib_binding not supported");
- }
- if (is44 || supportExtension("GL_ARB_multi_bind"))
- {
- logger->log1("found GL_ARB_multi_bind");
- assignFunction(glBindVertexBuffers);
- }
- else
- {
- logger->log1("GL_ARB_multi_bind not supported");
- }
- }
- else
- {
- mSupportModernOpengl = false;
- logger->log1("shaders not supported");
- }
-
-#ifdef WIN32
- assignFunctionARB(wglGetExtensionsString);
-#endif // WIN32
-#endif // __native_client__
-}
-
-void GraphicsManager::updateLimits()
-{
- GLint value = 0;
-#ifdef __native_client__
- mMaxVertices = 500;
-#else // __native_client__
-
- glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &value);
- logger->log("GL_MAX_ELEMENTS_VERTICES: %d", value);
-
- mMaxVertices = value;
-
- value = 0;
- glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &value);
- logger->log("GL_MAX_ELEMENTS_INDICES: %d", value);
- if (value < mMaxVertices)
- mMaxVertices = value;
- if (!mMaxVertices)
- {
- logger->log("Got 0 max amount of vertices or indicies. "
- "Overriding to 500");
- mMaxVertices = 500;
- }
-#endif // __native_client__
-
- value = 0;
- glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &value);
- logger->log("Max FBO size: %d", value);
- mMaxFboSize = value;
-}
-
-void GraphicsManager::initOpenGL()
-{
- setGLVersion();
- updateExtensions();
- initOpenGLFunctions();
- updatePlanformExtensions();
- updateDebugLog();
- createTextureSampler();
- updateLimits();
-}
-
-void GraphicsManager::createTextureSampler()
-{
- GLenum err = getLastError();
- if (err)
- logger->log(errorToString(err));
- if (mUseTextureSampler)
- {
- logger->log1("using texture sampler");
- mglGenSamplers(1, &mTextureSampler);
- if (getLastError() != GL_NO_ERROR)
- {
- mUseTextureSampler = false;
- logger->log1("texture sampler error");
- OpenGLImageHelper::setUseTextureSampler(mUseTextureSampler);
- return;
- }
- OpenGLImageHelper::initTextureSampler(mTextureSampler);
- mglBindSampler(0, mTextureSampler);
- if (getLastError() != GL_NO_ERROR)
- {
- mUseTextureSampler = false;
- logger->log1("texture sampler error");
- }
- }
- OpenGLImageHelper::setUseTextureSampler(mUseTextureSampler);
-#ifndef ANDROID
- SafeOpenGLImageHelper::setUseTextureSampler(false);
-#endif // ANDROID
-}
-
-GLenum GraphicsManager::getLastError()
-{
- GLenum tmp = glGetError();
- GLenum error = GL_NO_ERROR;
- while (tmp != GL_NO_ERROR)
- {
- error = tmp;
- mLastError = tmp;
- tmp = glGetError();
- }
- return error;
-}
-
-std::string GraphicsManager::errorToString(const GLenum error)
-{
- if (error)
- {
- std::string errmsg("Unknown error");
- switch (error)
- {
- case GL_INVALID_ENUM:
- errmsg = "GL_INVALID_ENUM";
- break;
- case GL_INVALID_VALUE:
- errmsg = "GL_INVALID_VALUE";
- break;
- case GL_INVALID_OPERATION:
- errmsg = "GL_INVALID_OPERATION";
- break;
- case GL_STACK_OVERFLOW:
- errmsg = "GL_STACK_OVERFLOW";
- break;
- case GL_STACK_UNDERFLOW:
- errmsg = "GL_STACK_UNDERFLOW";
- break;
- case GL_OUT_OF_MEMORY:
- errmsg = "GL_OUT_OF_MEMORY";
- break;
- default:
- break;
- }
- return "OpenGL error: " + errmsg;
- }
- return "";
-}
-
-void GraphicsManager::logError()
-{
- const GLenum error = GraphicsManager::getLastError();
- if (error != GL_NO_ERROR)
- logger->log(errorToString(error));
-}
-
-void GraphicsManager::detectVideoSettings()
-{
- config.setValue("videodetected", true);
- TestMain *const test = startDetection();
-
- if (test)
- {
- const Configuration &conf = test->getConfig();
- int val = conf.getValueInt("opengl", -1);
- if (val >= 0 && val < CAST_S32(RENDER_LAST))
- {
- config.setValue("opengl", val);
- val = conf.getValue("useTextureSampler", -1);
- if (val != -1)
- config.setValue("useTextureSampler", val);
- val = conf.getValue("compresstextures", -1);
- if (val != -1)
- config.setValue("compresstextures", val);
- }
- config.setValue("textureSize", conf.getValue("textureSize",
- "1024,1024,1024,1024,1024,1024"));
- config.setValue("testInfo", conf.getValue("testInfo", ""));
- config.setValue("sound", conf.getValue("sound", 0));
- delete test;
- }
-}
-
-static CALLBACK void debugCallback(GLenum source, GLenum type, GLuint id,
- GLenum severity, GLsizei length,
- const GLchar *text, GLvoid *userParam A_UNUSED)
-{
- std::string message("OPENGL:");
- switch (source)
- {
- case GL_DEBUG_SOURCE_API:
- message.append(" API");
- break;
- case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
- message.append(" WM");
- break;
- case GL_DEBUG_SOURCE_SHADER_COMPILER:
- message.append(" SHADERS");
- break;
- case GL_DEBUG_SOURCE_THIRD_PARTY:
- message.append(" THIRD_PARTY");
- break;
- case GL_DEBUG_SOURCE_APPLICATION:
- message.append(" APP");
- break;
- case GL_DEBUG_SOURCE_OTHER:
- message.append(" OTHER");
- break;
- default:
- message.append(" ?").append(toString(source));
- break;
- }
- switch (type)
- {
- case GL_DEBUG_TYPE_ERROR:
- message.append(" ERROR");
- break;
- case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
- message.append(" DEPRECATED");
- break;
- case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
- message.append(" UNDEFINED");
- break;
- case GL_DEBUG_TYPE_PORTABILITY:
- message.append(" PORTABILITY");
- break;
- case GL_DEBUG_TYPE_PERFORMANCE:
- message.append(" PERFORMANCE");
- break;
- case GL_DEBUG_TYPE_OTHER:
- message.append(" OTHER");
- break;
- case GL_DEBUG_TYPE_MARKER:
- message.append(" MARKER");
- break;
- case GL_DEBUG_TYPE_PUSH_GROUP:
- message.append(" PUSH GROUP");
- break;
- case GL_DEBUG_TYPE_POP_GROUP:
- message.append(" POP GROUP");
- break;
- default:
- message.append(" ?").append(toString(type));
- break;
- }
- message.append(" ").append(toString(id));
- switch (severity)
- {
- case GL_DEBUG_SEVERITY_NOTIFICATION:
- message.append(" N");
- break;
- case GL_DEBUG_SEVERITY_HIGH:
- message.append(" H");
- break;
- case GL_DEBUG_SEVERITY_MEDIUM:
- message.append(" M");
- break;
- case GL_DEBUG_SEVERITY_LOW:
- message.append(" L");
- break;
- default:
- message.append(" ?").append(toString(type));
- break;
- }
- char *const buf = new char[CAST_SIZE(length + 1)];
- memcpy(buf, text, length);
- buf[length] = 0;
- message.append(" ").append(buf);
- delete [] buf;
- logger->log(message);
-}
-
-void GraphicsManager::updateDebugLog() const
-{
- if (mSupportDebug && config.getIntValue("debugOpenGL"))
- {
- logger->log1("Enable OpenGL debug log");
- glEnable(GL_DEBUG_OUTPUT);
- glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-
- mglDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE,
- 0, nullptr, GL_TRUE);
- mglDebugMessageCallback(&debugCallback, this);
- }
-}
-#endif // USE_OPENGL
-
-void GraphicsManager::detectPixelSize()
-{
- SDL_SysWMinfo info;
- SDL_VERSION(&info.version);
- if (SDL::getWindowWMInfo(mainGraphics->getWindow(), &info))
- {
-#ifdef WIN32
- HDC hdc = GetDC(info.window);
- if (hdc)
- {
-// SetProcessDPIAware();
- mMaxWidth = GetDeviceCaps(hdc, HORZRES);
- mMaxHeight = GetDeviceCaps(hdc, VERTRES);
- mWidthMM = GetDeviceCaps(hdc, HORZSIZE);
- mHeightMM = GetDeviceCaps(hdc, VERTSIZE);
- }
-#elif defined USE_X11
- Display *const display = info.info.x11.display;
- if (display)
- {
- Screen *const screen = XDefaultScreenOfDisplay(display);
- if (!screen)
- return;
-
- const int screenNum = XScreenNumberOfScreen(screen);
- mMaxWidth = DisplayWidth(display, screenNum);
- mMaxHeight = DisplayHeight(display, screenNum);
- mWidthMM = DisplayWidthMM(display, screenNum);
- mHeightMM = DisplayHeightMM(display, screenNum);
- }
-#endif // WIN32
- }
-#if defined ANDROID
-#ifdef USE_SDL2
- const int dpi = atoi(getenv("DISPLAY_DPI"));
- if (dpi <= 120)
- mDensity = 0;
- else if (dpi <= 160)
- mDensity = 1;
- else if (dpi <= 213)
- mDensity = 2;
- else if (dpi <= 240)
- mDensity = 3;
- else if (dpi <= 320)
- mDensity = 4;
-// else if (dpi <= 480)
- else
- mDensity = 5;
- mMaxWidth = atoi(getenv("DISPLAY_RESOLUTION_WIDTH"));
- mMaxHeight = atoi(getenv("DISPLAY_RESOLUTION_HEIGHT"));
- mWidthMM = atoi(getenv("DISPLAY_WIDTH_MM"));
- mHeightMM = atoi(getenv("DISPLAY_HEIGHT_MM"));
-#else // USE_SDL2
-
- SDL_ANDROID_GetMetrics(&mMaxWidth, &mMaxHeight,
- &mWidthMM, &mHeightMM, &mDensity);
-#endif // USE_SDL2
-#endif // defined ANDROID
-
- logger->log("screen size in pixels: %ux%u", mMaxWidth, mMaxHeight);
- logger->log("screen size in millimeters: %ux%u", mWidthMM, mHeightMM);
- logger->log("actual screen density: " + getDensityString());
- const int density = config.getIntValue("screenDensity");
- if (density > 0 && density <= densitySize)
- {
- mDensity = density - 1;
- logger->log("selected screen density: " + getDensityString());
- }
-}
-
-std::string GraphicsManager::getDensityString() const
-{
- if (mDensity >= 0 && mDensity < densitySize)
- return densityNames[mDensity];
- return "";
-}