[Scummvm-git-logs] scummvm master -> 3a757731a2284c82865b1c56f25b8d4ac5c63c58

bluegr noreply at scummvm.org
Tue Oct 1 18:22:10 UTC 2024


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3a757731a2 SDL: Support building with more than two renderers


Commit: 3a757731a2284c82865b1c56f25b8d4ac5c63c58
    https://github.com/scummvm/scummvm/commit/3a757731a2284c82865b1c56f25b8d4ac5c63c58
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2024-10-01T21:22:07+03:00

Commit Message:
SDL: Support building with more than two renderers

Changed paths:
    backends/platform/sdl/sdl.cpp
    backends/platform/sdl/sdl.h


diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 13ee46f1c21..d1a2fe4731d 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -49,7 +49,6 @@
 #include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
 #ifdef USE_OPENGL
 #include "backends/graphics/openglsdl/openglsdl-graphics.h"
-#include "graphics/cursorman.h"
 #endif
 #if defined(USE_OPENGL_GAME) || defined(USE_OPENGL_SHADERS)
 #include "backends/graphics3d/openglsdl/openglsdl-graphics3d.h"
@@ -58,6 +57,7 @@
 #if defined(USE_SCUMMVMDLC) && defined(USE_LIBCURL)
 #include "backends/dlc/scummvmcloud.h"
 #endif
+#include "graphics/cursorman.h"
 #include "graphics/renderer.h"
 
 #include <time.h>	// for getTimeAndDate()
@@ -78,12 +78,9 @@
 
 OSystem_SDL::OSystem_SDL()
 	:
-#ifdef USE_OPENGL
+#ifdef USE_MULTIPLE_RENDERERS
 	_graphicsModes(),
 	_graphicsMode(0),
-	_firstGLMode(0),
-	_defaultSDLMode(0),
-	_defaultGLMode(0),
 #endif
 	_inited(false),
 	_initedSDL(false),
@@ -102,7 +99,7 @@ OSystem_SDL::OSystem_SDL()
 OSystem_SDL::~OSystem_SDL() {
 	SDL_ShowCursor(SDL_ENABLE);
 
-#ifdef USE_OPENGL
+#ifdef USE_MULTIPLE_RENDERERS
 	clearGraphicsModes();
 #endif
 
@@ -289,31 +286,32 @@ void OSystem_SDL::initBackend() {
 	ScalerMan.updateOldSettings();
 
 	if (_graphicsManager == nullptr) {
-#ifdef USE_OPENGL
-		// Setup a list with both SDL and OpenGL graphics modes. We only do
-		// this whenever the subclass did not already set up a graphics
-		// manager yet. This is because we don't know the type of the graphics
-		// manager of the subclass, thus we cannot easily switch between the
-		// OpenGL one and the set up one. It also is to be expected that the
-		// subclass does not want any switching of graphics managers anyway.
+#ifdef USE_MULTIPLE_RENDERERS
+		// Setup a list with all graphics modes. We only do this whenever the
+		// subclass did not already set up a graphics manager yet. This is
+		// because we don't know the type of the graphics manager of the subclass,
+		// thus we cannot easily switch between the standard ones and the set up
+		// one. It also is to be expected that the subclass does not want any
+		// switching of graphics managers anyway.
 		setupGraphicsModes();
 
 		Common::String gfxMode(ConfMan.get("gfx_mode"));
 		// "normal" and "default" are a special case for the default graphics mode.
 		// See OSystem::setGraphicsMode(const char *name) implementation.
 		if (gfxMode.empty() || !gfxMode.compareToIgnoreCase("normal") || !gfxMode.compareToIgnoreCase("default")) {
-			// If the default GraphicsManager is OpenGL, create the OpenGL graphics manager
-			if (getDefaultGraphicsManager() == GraphicsManagerOpenGL) {
-				_graphicsManager = new OpenGLSdlGraphicsManager(_eventSource, _window);
-				_graphicsMode = _defaultGLMode;
-			}
+			GraphicsManagerType type = getDefaultGraphicsManager();
+			assert(type >= GraphicsManagerSurfaceSDL && type < GraphicsManagerCount);
+			_graphicsManager = createGraphicsManager(_eventSource, _window, type);
+			_graphicsMode = _defaultMode[type];
 		} else {
-			// If the gfx_mode is from OpenGL, create the OpenGL graphics manager
-			for (uint i = _firstGLMode; i < _graphicsModeIds.size(); ++i) {
-				if (!scumm_stricmp(_graphicsModes[i].name, gfxMode.c_str())) {
-					_graphicsManager = new OpenGLSdlGraphicsManager(_eventSource, _window);
-					_graphicsMode = i;
-					break;
+			// If the gfx_mode is from a specific graphics manager, create it
+			for (uint i = 0; i < GraphicsManagerCount; ++i) {
+				for (int j = _firstMode[i]; j <= _lastMode[i]; ++j) {
+					if (!scumm_stricmp(_graphicsModes[j].name, gfxMode.c_str())) {
+						_graphicsManager = createGraphicsManager(_eventSource, _window, (GraphicsManagerType)i);
+						_graphicsMode = j;
+						break;
+					}
 				}
 			}
 		}
@@ -842,7 +840,27 @@ Common::Path OSystem_SDL::getScreenshotsPath() {
 	return ConfMan.getPath("screenshotpath");
 }
 
+#ifdef USE_MULTIPLE_RENDERERS
+
+OSystem_SDL::GraphicsManagerType OSystem_SDL::getDefaultGraphicsManager() const {
+	return GraphicsManagerSurfaceSDL;
+}
+
+SdlGraphicsManager *OSystem_SDL::createGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, GraphicsManagerType type) {
+	switch (type) {
+	case GraphicsManagerSurfaceSDL:
+		debug(1, "creating SurfaceSDL graphics manager");
+		return new SurfaceSdlGraphicsManager(sdlEventSource, window);
 #ifdef USE_OPENGL
+	case GraphicsManagerOpenGL:
+		debug(1, "creating OpenGL graphics manager");
+		return new OpenGLSdlGraphicsManager(sdlEventSource, window);
+#endif
+	default:
+		assert(0);
+		return NULL;
+	}
+}
 
 const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const {
 	if (_graphicsModes.empty()) {
@@ -856,11 +874,9 @@ int OSystem_SDL::getDefaultGraphicsMode() const {
 	if (_graphicsModes.empty()) {
 		return _graphicsManager->getDefaultGraphicsMode();
 	} else {
-		// Return the default graphics mode
-		if (getDefaultGraphicsManager() == GraphicsManagerSDL)
-			return _defaultSDLMode;
-		else
-			return _defaultGLMode;
+		GraphicsManagerType type = getDefaultGraphicsManager();
+		assert(type >= GraphicsManagerSurfaceSDL && type < GraphicsManagerCount);
+		return _defaultMode[type];
 	}
 }
 
@@ -901,20 +917,21 @@ bool OSystem_SDL::setGraphicsMode(int mode, uint flags) {
 		switchedManager = true;
 	} else
 #endif
-	if ((supports3D || _graphicsMode >= _firstGLMode) && mode < _firstGLMode) {
-		debug(1, "switching to plain SDL graphics");
-		if (sdlGraphicsManager) {
-			sdlGraphicsManager->deactivateManager();
-			delete sdlGraphicsManager;
+	{
+		for (uint i = 0; i < GraphicsManagerCount; ++i) {
+			if (!(mode >= _firstMode[i] && mode <= _lastMode[i]))
+				continue;
+			if (_graphicsMode >= _firstMode[i] && _graphicsMode <= _lastMode[i] && !supports3D)
+				break;
+			debug(1, "switching graphics manager");
+			if (sdlGraphicsManager) {
+				sdlGraphicsManager->deactivateManager();
+				delete sdlGraphicsManager;
+			}
+			_graphicsManager = sdlGraphicsManager = createGraphicsManager(_eventSource, _window, (GraphicsManagerType)i);
+			switchedManager = true;
+			break;
 		}
-		_graphicsManager = sdlGraphicsManager = new SurfaceSdlGraphicsManager(_eventSource, _window);
-		switchedManager = true;
-	} else if ((supports3D || _graphicsMode < _firstGLMode) && mode >= _firstGLMode) {
-		debug(1, "switching to OpenGL graphics");
-		sdlGraphicsManager->deactivateManager();
-		delete sdlGraphicsManager;
-		_graphicsManager = sdlGraphicsManager = new OpenGLSdlGraphicsManager(_eventSource, _window);
-		switchedManager = true;
 	}
 
 	_graphicsMode = mode;
@@ -964,48 +981,34 @@ int OSystem_SDL::getGraphicsMode() const {
 void OSystem_SDL::setupGraphicsModes() {
 	clearGraphicsModes();
 	_graphicsModeIds.clear();
-	_defaultSDLMode = _defaultGLMode = -1;
 
 	// Count the number of graphics modes
 	const OSystem::GraphicsMode *srcMode;
 	int defaultMode;
 
-	GraphicsManager *manager = new SurfaceSdlGraphicsManager(_eventSource, _window);
-	defaultMode = manager->getDefaultGraphicsMode();
-	srcMode = manager->getSupportedGraphicsModes();
-	while (srcMode->name) {
-		if (defaultMode == srcMode->id) {
-			_defaultSDLMode = _graphicsModes.size();
-		}
-		OSystem::GraphicsMode mode = *srcMode;
-		// Do deep copy as we are going to delete the GraphicsManager and this may free
-		// the memory used for its graphics modes.
-		mode.name = scumm_strdup(srcMode->name);
-		mode.description = scumm_strdup(srcMode->description);
-		_graphicsModes.push_back(mode);
-		srcMode++;
-	}
-	delete manager;
-	assert(_defaultSDLMode != -1);
-
-	_firstGLMode = _graphicsModes.size();
-	manager = new OpenGLSdlGraphicsManager(_eventSource, _window);
-	srcMode = manager->getSupportedGraphicsModes();
-	defaultMode = manager->getDefaultGraphicsMode();
-	while (srcMode->name) {
-		if (defaultMode == srcMode->id) {
-			_defaultGLMode = _graphicsModes.size();
+	GraphicsManager *manager;
+	for (uint i = 0; i < GraphicsManagerCount; i++) {
+		_defaultMode[i] = -1;
+		_firstMode[i] = _graphicsModes.size();
+		manager = createGraphicsManager(_eventSource, _window, (GraphicsManagerType)i);
+		defaultMode = manager->getDefaultGraphicsMode();
+		srcMode = manager->getSupportedGraphicsModes();
+		while (srcMode->name) {
+			if (defaultMode == srcMode->id) {
+				_defaultMode[i] = _graphicsModes.size();
+			}
+			OSystem::GraphicsMode mode = *srcMode;
+			// Do deep copy as we are going to delete the GraphicsManager and this may free
+			// the memory used for its graphics modes.
+			mode.name = scumm_strdup(srcMode->name);
+			mode.description = scumm_strdup(srcMode->description);
+			_graphicsModes.push_back(mode);
+			srcMode++;
 		}
-		OSystem::GraphicsMode mode = *srcMode;
-		// Do deep copy as we are going to delete the GraphicsManager and this may free
-		// the memory used for its graphics modes.
-		mode.name = scumm_strdup(srcMode->name);
-		mode.description = scumm_strdup(srcMode->description);
-		_graphicsModes.push_back(mode);
-		srcMode++;
+		_lastMode[i] = _graphicsModes.size() - 1;
+		delete manager;
+		assert(_defaultMode[i] != -1);
 	}
-	delete manager;
-	assert(_defaultGLMode != -1);
 
 	// Set a null mode at the end
 	GraphicsMode nullMode;
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index c177b2efb54..fa59d8e6f15 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -32,6 +32,10 @@
 
 #include "common/array.h"
 
+#ifdef USE_OPENGL
+#define USE_MULTIPLE_RENDERERS
+#endif
+
 #ifdef USE_DISCORD
 class DiscordPresence;
 #endif
@@ -165,14 +169,22 @@ protected:
 	virtual Common::WriteStream *createLogFile();
 	Backends::Log::Log *_logger;
 
+#ifdef USE_MULTIPLE_RENDERERS
+	enum GraphicsManagerType {
+		GraphicsManagerSurfaceSDL,
 #ifdef USE_OPENGL
+		GraphicsManagerOpenGL,
+#endif
+		GraphicsManagerCount
+	};
+
 	typedef Common::Array<GraphicsMode> GraphicsModeArray;
 	GraphicsModeArray _graphicsModes;
 	Common::Array<int> _graphicsModeIds;
 	int _graphicsMode;
-	int _firstGLMode;
-	int _defaultSDLMode;
-	int _defaultGLMode;
+	int _firstMode[GraphicsManagerCount];
+	int _lastMode[GraphicsManagerCount];
+	int _defaultMode[GraphicsManagerCount];
 
 	/**
 	 * Create the merged graphics modes list.
@@ -184,8 +196,8 @@ protected:
 	 */
 	void clearGraphicsModes();
 
-	enum GraphicsManagerType { GraphicsManagerSDL, GraphicsManagerOpenGL };
-	virtual GraphicsManagerType getDefaultGraphicsManager() const { return GraphicsManagerSDL; }
+	virtual GraphicsManagerType getDefaultGraphicsManager() const;
+	SdlGraphicsManager *createGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, GraphicsManagerType type);
 	const OSystem::GraphicsMode *getSupportedGraphicsModes() const override;
 	int getDefaultGraphicsMode() const override;
 	bool setGraphicsMode(int mode, uint flags) override;




More information about the Scummvm-git-logs mailing list