From 5359b7c20b9ee93989a840e555f0a2102b7bb806 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 1 Sep 2013 17:40:11 +0300 Subject: add SDL2 default render mode. in this mode SDL using own driver with hardware acceleration. --- src/CMakeLists.txt | 3 +- src/Makefile.am | 3 +- src/client.cpp | 3 +- src/graphicsmanager.cpp | 16 ++++- src/gui/debugwindow.cpp | 4 ++ src/gui/setup_video.cpp | 2 +- src/render/graphics.h | 3 + src/render/renderers.h | 3 +- src/render/rendererslist.h | 115 ------------------------------- src/render/rendererslistsdl.h | 127 ++++++++++++++++++++++++++++++++++ src/render/rendererslistsdl2.h | 133 ++++++++++++++++++++++++++++++++++++ src/render/sdl2graphics.cpp | 3 +- src/render/sdl2graphics.h | 4 ++ src/resources/image.cpp | 4 +- src/resources/openglimagehelper.cpp | 1 + 15 files changed, 299 insertions(+), 125 deletions(-) delete mode 100644 src/render/rendererslist.h create mode 100644 src/render/rendererslistsdl.h create mode 100644 src/render/rendererslistsdl2.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5c61747fe..6e2aede86 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -682,7 +682,8 @@ SET(SRCS render/nullopenglgraphics.h render/renderers.cpp render/renderers.h - render/rendererslist.h + render/rendererslistsdl.h + render/rendererslistsdl2.h particle/particle.cpp particle/particle.h particle/particlecontainer.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 4e9dec8bb..84a9444a9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -691,7 +691,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ render/nullopenglgraphics.h \ render/renderers.cpp \ render/renderers.h \ - render/rendererslist.h \ + render/rendererslistsdl.h \ + render/rendererslistsdl2.h \ particle/particle.cpp \ particle/particle.h \ particle/particlecontainer.cpp \ diff --git a/src/client.cpp b/src/client.cpp index fef14b6e6..0f9af3d8a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -572,15 +572,14 @@ void Client::gameInit() } #endif -#ifdef USE_OPENGL openGLMode = intToRenderType(config.getIntValue("opengl")); +#ifdef USE_OPENGL OpenGLImageHelper::setBlur(config.getBoolValue("blur")); SurfaceImageHelper::SDLSetEnableAlphaCache( config.getBoolValue("alphaCache") && !openGLMode); ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0f || openGLMode); #else - openGLMode = RENDER_SOFTWARE; SurfaceImageHelper::SDLSetEnableAlphaCache( config.getBoolValue("alphaCache")); ImageHelper::setEnableAlpha(config.getFloatValue("guialpha") != 1.0f); diff --git a/src/graphicsmanager.cpp b/src/graphicsmanager.cpp index 5304c69c5..1c6f81233 100644 --- a/src/graphicsmanager.cpp +++ b/src/graphicsmanager.cpp @@ -241,6 +241,9 @@ void GraphicsManager::initGraphics(const bool noOpenGL) mUseTextureSampler = false; break; case RENDER_NORMAL_OPENGL: +#ifndef USE_SDL2 + case RENDER_SDL2_DEFAULT: +#endif default: #ifndef ANDROID imageHelper = new OpenGLImageHelper; @@ -261,8 +264,19 @@ void GraphicsManager::initGraphics(const bool noOpenGL) mainGraphics = new MobileOpenGLGraphics; mUseTextureSampler = false; break; +#ifdef USE_SDL2 + case RENDER_SDL2_DEFAULT: + // for debug SDL2 default is same as software mode + imageHelper = new SDLImageHelper; + surfaceImageHelper = new SurfaceImageHelper; + mainGraphics = new SDLGraphics; + mainGraphics->setRendererFlags(SDL_RENDERER_ACCELERATED); + mUseTextureSampler = false; + break; +#endif }; - mUseAtlases = imageHelper->useOpenGL() != RENDER_SOFTWARE + mUseAtlases = (useOpenGL == RENDER_NORMAL_OPENGL + || useOpenGL == RENDER_SAFE_OPENGL || useOpenGL == RENDER_GLES_OPENGL) && config.getBoolValue("useAtlases"); #else void GraphicsManager::initGraphics(const bool noOpenGL A_UNUSED) diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp index fdd68092a..39d731bae 100644 --- a/src/gui/debugwindow.cpp +++ b/src/gui/debugwindow.cpp @@ -219,6 +219,10 @@ MapDebugTab::MapDebugTab(const Widget2 *const widget) : // TRANSLATORS: debug window label mFPSText = _("%d FPS (mobile OpenGL)"); break; + case RENDER_SDL2_DEFAULT: + // TRANSLATORS: debug window label + mFPSText = _("%d FPS (SDL2 default)"); + break; }; #else // TRANSLATORS: debug window label diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp index f9a7535d0..9dd2484df 100644 --- a/src/gui/setup_video.cpp +++ b/src/gui/setup_video.cpp @@ -45,7 +45,7 @@ #include "gui/widgets/textfield.h" #include "gui/widgets/dropdown.h" -#include "render/rendererslist.h" +#include "render/rendererslistsdl.h" #include "resources/image.h" #include "utils/gettext.h" diff --git a/src/render/graphics.h b/src/render/graphics.h index 7dafcbc45..5025709ec 100644 --- a/src/render/graphics.h +++ b/src/render/graphics.h @@ -365,6 +365,9 @@ class Graphics : public gcn::Graphics #ifdef USE_SDL2 void dumpRendererInfo(const char *const str, const SDL_RendererInfo &info); + + virtual void setRendererFlags(const uint32_t flags A_UNUSED) + { } #endif int mWidth; int mHeight; diff --git a/src/render/renderers.h b/src/render/renderers.h index 8922f3d10..f7d58b5e9 100644 --- a/src/render/renderers.h +++ b/src/render/renderers.h @@ -26,11 +26,10 @@ enum RenderType { RENDER_SOFTWARE = 0, -#ifdef USE_OPENGL RENDER_NORMAL_OPENGL = 1, RENDER_SAFE_OPENGL = 2, RENDER_GLES_OPENGL = 3, -#endif + RENDER_SDL2_DEFAULT = 4, RENDER_LAST }; diff --git a/src/render/rendererslist.h b/src/render/rendererslist.h deleted file mode 100644 index 6c4e3fd0e..000000000 --- a/src/render/rendererslist.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013 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 . - */ - -#include "utils/gettext.h" - -#ifndef RENDER_RENDERERSLIST_H -#define RENDER_RENDERERSLIST_H - -#ifdef USE_OPENGL -#ifdef ANDROID - -// map for index to RenderType -const RenderType indexToRender[] = -{ - RENDER_SOFTWARE, - RENDER_GLES_OPENGL, -}; - -const char *OPENGL_NAME[] = -{ - // TRANSLATORS: draw backend - N_("Software"), - // TRANSLATORS: draw backend - N_("Mobile OpenGL"), -}; - -const int renderModesListSize = 2; - -const int renderToIndex[] = -{ - 0, // RENDER_SOFTWARE - 3, // RENDER_GLES_OPENGL - 3, // RENDER_GLES_OPENGL - 3 // RENDER_GLES_OPENGL -}; - -#else // ANDROID - -// map for index to RenderType -const RenderType indexToRender[] = -{ - RENDER_SOFTWARE, - RENDER_NORMAL_OPENGL, - RENDER_SAFE_OPENGL, - RENDER_GLES_OPENGL, -}; - -const char *OPENGL_NAME[] = -{ - // TRANSLATORS: draw backend - N_("Software"), - // TRANSLATORS: draw backend - N_("Fast OpenGL"), - // TRANSLATORS: draw backend - N_("Safe OpenGL"), - // TRANSLATORS: draw backend - N_("Mobile OpenGL"), -}; - -const int renderModesListSize = 4; - -const int renderToIndex[] = -{ - 0, // RENDER_SOFTWARE - 1, // RENDER_NORMAL_OPENGL - 2, // RENDER_SAFE_OPENGL - 3 // RENDER_GLES_OPENGL -}; - -#endif // ANDROID - -#else // USE_OPENGL - -// map for index to RenderType -const RenderType indexToRender[] = -{ - RENDER_SOFTWARE -}; - -const char *OPENGL_NAME[] = -{ - // TRANSLATORS: draw backend - N_("Software") -}; - -const int renderModesListSize = 1; - -const int renderToIndex[] = -{ - 0, // RENDER_SOFTWARE - 0, // RENDER_SOFTWARE - 0, // RENDER_SOFTWARE - 0 // RENDER_SOFTWARE -}; - -#endif // USE_OPENGL - -#endif // RENDER_RENDERERSLIST_H diff --git a/src/render/rendererslistsdl.h b/src/render/rendererslistsdl.h new file mode 100644 index 000000000..aa68eeb6b --- /dev/null +++ b/src/render/rendererslistsdl.h @@ -0,0 +1,127 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 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 . + */ + +#include "utils/gettext.h" + +#ifndef RENDER_RENDERERSLISTSDL_H +#define RENDER_RENDERERSLISTSDL_H + +#ifdef USE_SDL2 +#include "render/rendererslistsdl2.h" + +#else // USE_SDL2 + +#ifdef USE_OPENGL +#ifdef ANDROID +// defined OPENGL ANDROID + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE, + RENDER_GLES_OPENGL +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software"), + // TRANSLATORS: draw backend + N_("Mobile OpenGL") +}; + +const int renderModesListSize = 2; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 1, // RENDER_NORMAL_OPENGL + 1, // RENDER_SAFE_OPENGL + 1, // RENDER_GLES_OPENGL + 1 // RENDER_SDL2_DEFAULT +}; + +#else // ANDROID +// defined OPENGL + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE, + RENDER_NORMAL_OPENGL, + RENDER_SAFE_OPENGL, + RENDER_GLES_OPENGL +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software"), + // TRANSLATORS: draw backend + N_("Fast OpenGL"), + // TRANSLATORS: draw backend + N_("Safe OpenGL"), + // TRANSLATORS: draw backend + N_("Mobile OpenGL") +}; + +const int renderModesListSize = 4; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 1, // RENDER_NORMAL_OPENGL + 2, // RENDER_SAFE_OPENGL + 3, // RENDER_GLES_OPENGL + 0 // RENDER_SDL2_DEFAULT +}; + +#endif // ANDROID + +#else // USE_OPENGL +// no defines + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software") +}; + +const int renderModesListSize = 1; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 0, // RENDER_NORMAL_OPENGL + 0, // RENDER_SAFE_OPENGL + 0, // RENDER_GLES_OPENGL + 0 // RENDER_SDL2_DEFAULT +}; + +#endif // USE_OPENGL + +#endif // USE_SDL2 +#endif // RENDER_RENDERERSLISTSDL_H diff --git a/src/render/rendererslistsdl2.h b/src/render/rendererslistsdl2.h new file mode 100644 index 000000000..966b53726 --- /dev/null +++ b/src/render/rendererslistsdl2.h @@ -0,0 +1,133 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 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 . + */ + +#include "utils/gettext.h" + +#ifndef RENDER_RENDERERSLISTSDL2_H +#define RENDER_RENDERERSLISTSDL2_H + +#ifdef USE_SDL2 + +#ifdef USE_OPENGL +#ifdef ANDROID +// defined OPENGL ANDROID + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE, + RENDER_SDL2_DEFAULT, + RENDER_GLES_OPENGL +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software"), + // TRANSLATORS: draw backend + N_("SDL2 default"), + // TRANSLATORS: draw backend + N_("Mobile OpenGL") +}; + +const int renderModesListSize = 3; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 2, // RENDER_NORMAL_OPENGL + 2, // RENDER_SAFE_OPENGL + 2, // RENDER_GLES_OPENGL + 1 // RENDER_SDL2_DEFAULT +}; + +#else // ANDROID +// defined OPENGL + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE, + RENDER_SDL2_DEFAULT, + RENDER_NORMAL_OPENGL, + RENDER_SAFE_OPENGL, + RENDER_GLES_OPENGL +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software"), + // TRANSLATORS: draw backend + N_("SDL2 default"), + // TRANSLATORS: draw backend + N_("Fast OpenGL"), + // TRANSLATORS: draw backend + N_("Safe OpenGL"), + // TRANSLATORS: draw backend + N_("Mobile OpenGL") +}; + +const int renderModesListSize = 5; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 2, // RENDER_NORMAL_OPENGL + 3, // RENDER_SAFE_OPENGL + 4, // RENDER_GLES_OPENGL + 1 // RENDER_SDL2_DEFAULT +}; + +#endif // ANDROID + +#else // USE_OPENGL +// no defines + +// map for index to RenderType +const RenderType indexToRender[] = +{ + RENDER_SOFTWARE, + RENDER_SDL2_DEFAULT +}; + +const char *OPENGL_NAME[] = +{ + // TRANSLATORS: draw backend + N_("Software"), + // TRANSLATORS: draw backend + N_("SDL2 default") +}; + +const int renderModesListSize = 2; + +const int renderToIndex[] = +{ + 0, // RENDER_SOFTWARE + 0, // RENDER_NORMAL_OPENGL + 0, // RENDER_SAFE_OPENGL + 0, // RENDER_GLES_OPENGL + 1 // RENDER_SDL2_DEFAULT +}; + +#endif // USE_OPENGL + +#endif // USE_SDL2 +#endif // RENDER_RENDERERSLISTSDL2_H diff --git a/src/render/sdl2graphics.cpp b/src/render/sdl2graphics.cpp index 218f2cad7..82ad78198 100644 --- a/src/render/sdl2graphics.cpp +++ b/src/render/sdl2graphics.cpp @@ -70,6 +70,7 @@ static int FakeSDL_RenderCopy(SDL_Renderer *const renderer, SDLGraphics::SDLGraphics() : Graphics(), + mRendererFlags(SDL_RENDERER_SOFTWARE), mOldPixel(0), mOldAlpha(0) { @@ -633,7 +634,7 @@ bool SDLGraphics::setVideoMode(const int w, const int h, const int bpp, mRect.w = w1; mRect.h = h1; - mRenderer = graphicsManager.createRenderer(mWindow, SDL_RENDERER_SOFTWARE); + mRenderer = graphicsManager.createRenderer(mWindow, mRendererFlags); SDLImageHelper::setRenderer(mRenderer); return videoInfo(); } diff --git a/src/render/sdl2graphics.h b/src/render/sdl2graphics.h index f3835e904..383e93540 100644 --- a/src/render/sdl2graphics.h +++ b/src/render/sdl2graphics.h @@ -128,6 +128,9 @@ class SDLGraphics : public Graphics const bool fs, const bool hwaccel, const bool resize, const bool noFrame); + void setRendererFlags(const uint32_t flags) + { mRendererFlags = flags; } + protected: virtual bool drawImage2(const Image *const image, int srcX, int srcY, @@ -135,6 +138,7 @@ class SDLGraphics : public Graphics const int width, const int height, const bool useColor); + uint32_t mRendererFlags; uint32_t mOldPixel; int mOldAlpha; }; diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 3d5d58620..c289c90cd 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -413,7 +413,9 @@ Image *Image::getSubImage(const int x, const int y, { // Create a new clipped sub-image #ifdef USE_OPENGL - if (OpenGLImageHelper::mUseOpenGL != RENDER_SOFTWARE) + const RenderType mode = OpenGLImageHelper::mUseOpenGL; + if (mode == RENDER_NORMAL_OPENGL || mode == RENDER_SAFE_OPENGL + || mode == RENDER_GLES_OPENGL) { return new SubImage(this, mGLImage, x, y, width, height, mTexWidth, mTexHeight); diff --git a/src/resources/openglimagehelper.cpp b/src/resources/openglimagehelper.cpp index e686d6f5a..c41538b2e 100644 --- a/src/resources/openglimagehelper.cpp +++ b/src/resources/openglimagehelper.cpp @@ -215,6 +215,7 @@ Image *OpenGLImageHelper::glLoad(SDL_Surface *tmpImage, MobileOpenGLGraphics::bindTexture(mTextureType, texture); break; case RENDER_SOFTWARE: + case RENDER_SDL2_DEFAULT: default: logger->log("Unknown OpenGL backend: %d", mUseOpenGL); break; -- cgit v1.2.3-60-g2f50