[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44856] trunk/blender/intern/ghost/intern/ GHOST_DisplayManagerSDL.cpp: SDL ghost update to work with SDL2.

Campbell Barton ideasman42 at gmail.com
Tue Mar 13 21:24:18 CET 2012


Revision: 44856
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44856
Author:   campbellbarton
Date:     2012-03-13 20:24:05 +0000 (Tue, 13 Mar 2012)
Log Message:
-----------
SDL ghost update to work with SDL2.

this gives some problems because SDL2 Needs a window before fullscreen is set, the player currently doesnt have a window created when fullscreen is called.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp

Modified: trunk/blender/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp	2012-03-13 18:37:31 UTC (rev 44855)
+++ trunk/blender/intern/ghost/intern/GHOST_DisplayManagerSDL.cpp	2012-03-13 20:24:05 UTC (rev 44856)
@@ -32,6 +32,8 @@
 #include "GHOST_SystemSDL.h"
 #include "GHOST_DisplayManagerSDL.h"
 
+#include "GHOST_WindowManager.h"
+
 GHOST_DisplayManagerSDL::GHOST_DisplayManagerSDL(GHOST_SystemSDL *system)
     :
       GHOST_DisplayManager(),
@@ -52,22 +54,29 @@
                                                               GHOST_TInt32& numSettings) const
 {
 	GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
-	int i;
-	SDL_Rect **vidmodes;
 
-	vidmodes = SDL_ListModes(NULL, SDL_HWSURFACE | SDL_OPENGL |
-			SDL_FULLSCREEN | SDL_HWPALETTE);
-	if (!vidmodes) {
-		fprintf(stderr, "Could not get available video modes: %s.\n",
-				SDL_GetError());
-		return GHOST_kFailure;
-	}
-	for (i = 0; vidmodes[i]; i++);
-	numSettings = GHOST_TInt32(i);
+	numSettings = SDL_GetNumDisplayModes(display - 1);
 
 	return GHOST_kSuccess;
 }
 
+static void ghost_mode_from_sdl(GHOST_DisplaySetting& setting, SDL_DisplayMode *mode)
+{
+	setting.xPixels = mode->w;
+	setting.yPixels = mode->h;
+	setting.bpp = SDL_BYTESPERPIXEL(mode->format) * 8;
+	/* Just guess the frequency :( */
+	setting.frequency = mode->refresh_rate ? mode->refresh_rate : 60;
+}
+
+static void ghost_mode_to_sdl(const GHOST_DisplaySetting& setting, SDL_DisplayMode *mode)
+{
+	mode->w = setting.xPixels;
+	mode->h = setting.yPixels;
+	// setting.bpp = SDL_BYTESPERPIXEL(mode->format) * 8; ???
+	mode->refresh_rate = setting.frequency;
+}
+
 GHOST_TSuccess
 GHOST_DisplayManagerSDL::getDisplaySetting(GHOST_TUns8 display,
                                            GHOST_TInt32 index,
@@ -75,37 +84,11 @@
 {
 	GHOST_ASSERT(display < 1, "Only single display systems are currently supported.\n");
 
-	int i;
-	SDL_Rect **vidmodes;
-	/* NULL is passed in here to get the modes for the current bit depth.
-	 * Other bit depths may be possible; in that case, an SDL_PixelFormat struct
-	 * should be passed in. To get a complete profile, all possible bit depths
-	 * would need to be iterated over. - z0r */
-	vidmodes = SDL_ListModes(NULL, SDL_HWSURFACE | SDL_OPENGL |
-			SDL_FULLSCREEN | SDL_HWPALETTE);
-	if (!vidmodes) {
-		fprintf(stderr, "Could not get available video modes: %s.\n",
-				SDL_GetError());
-		return GHOST_kFailure;
-	}
-	for (i = 0; vidmodes[i]; i++);
-	GHOST_ASSERT(index < i, "Requested setting outside of valid range.\n");
+	SDL_DisplayMode mode;
+	SDL_GetDisplayMode(display, index, &mode);
 
-	setting.xPixels = vidmodes[index]->w;
-	setting.yPixels = vidmodes[index]->h;
+	ghost_mode_from_sdl(setting, &mode);
 
-	SDL_Surface *surf;
-	surf = SDL_GetVideoSurface();
-	if (surf == NULL) {
-		fprintf(stderr, "Getting display setting: %s\n", SDL_GetError());
-		/* Just guess the bit depth */
-		setting.bpp = 32;
-	} else {
-		setting.bpp = surf->format->BitsPerPixel;
-	}
-	/* Just guess the frequency :( */
-	setting.frequency = 60;
-
 	return GHOST_kSuccess;
 }
 
@@ -113,31 +96,11 @@
 GHOST_DisplayManagerSDL::getCurrentDisplaySetting(GHOST_TUns8 display,
                                                   GHOST_DisplaySetting& setting) const
 {
-	SDL_Surface *surf;
-	const SDL_VideoInfo *info;
+	SDL_DisplayMode mode;
+	SDL_GetCurrentDisplayMode(display, &mode);
 
-	/* Note: not using SDL_GetDesktopDisplayMode because that does not return
-	 * the current mode. Try to use GetVideoSurface first, as it seems more
-	 * accurate. If that fails, try other methods. - z0r */
-	surf = SDL_GetVideoSurface();
+	ghost_mode_from_sdl(setting, &mode);
 
-	if (surf != NULL) {
-		setting.xPixels = surf->w;
-		setting.yPixels = surf->h;
-		setting.bpp = surf->format->BitsPerPixel;
-		/* Just guess the frequency :( */
-		setting.frequency = 60;
-	} else {
-		/* This may happen if the surface hasn't been created yet, e.g. on
-		 * application startup. */
-		info = SDL_GetVideoInfo();
-		setting.xPixels = info->current_w;
-		setting.yPixels = info->current_h;
-		setting.bpp = info->vfmt->BitsPerPixel;
-		/* Just guess the frequency :( */
-		setting.frequency = 60;
-	}
-
 	return GHOST_kSuccess;
 }
 
@@ -145,7 +108,6 @@
 GHOST_DisplayManagerSDL:: setCurrentDisplaySetting(GHOST_TUns8 display,
                                                    const GHOST_DisplaySetting& setting)
 {
-
 	/*
 	 * Mode switching code ported from Quake 2 version 3.21 and bzflag version
 	 * 2.4.0:
@@ -154,31 +116,28 @@
 	 * http://wiki.bzflag.org/BZFlag_Source
 	 * See src/platform/SDLDisplay.cxx:SDLDisplay and createWindow
 	 */
-	SDL_Surface *surf;
+	SDL_DisplayMode mode;
+	const int num_modes = SDL_GetNumDisplayModes(display);
 	int best_fit, best_dist, dist, x, y;
 
-	SDL_Rect **vidmodes = SDL_ListModes(NULL, SDL_HWSURFACE | SDL_OPENGL |
-			SDL_FULLSCREEN | SDL_HWPALETTE);
-	if (!vidmodes) {
-		fprintf(stderr, "Could not get available video modes: %s.\n",
-				SDL_GetError());
-	}
-
 	best_dist = 9999999;
 	best_fit = -1;
 
-	if (vidmodes == (SDL_Rect **) -1) {
+	if (num_modes == 0) {
 		/* Any mode is OK. */
-		x = setting.xPixels;
-		y = setting.yPixels;
-	} else {
-		for (int i = 0; vidmodes[i]; i++) {
-			if (setting.xPixels > vidmodes[i]->w ||
-				setting.yPixels > vidmodes[i]->h)
+		ghost_mode_to_sdl(setting, &mode);
+	}
+	else {
+		for (int i = 0; i < num_modes; i++) {
+
+			SDL_GetDisplayMode(display, i, &mode);
+
+			if (setting.xPixels > mode.w ||
+				setting.yPixels > mode.h)
 				continue;
 
-			x = setting.xPixels - vidmodes[i]->w;
-			y = setting.yPixels - vidmodes[i]->h;
+			x = setting.xPixels - mode.w;
+			y = setting.yPixels - mode.h;
 			dist = (x * x) + (y * y);
 			if (dist < best_dist) {
 				best_dist = dist;
@@ -189,24 +148,26 @@
 		if (best_fit == -1)
 			return GHOST_kFailure;
 
-		x = vidmodes[best_fit]->w;
-		y = vidmodes[best_fit]->h;
+		SDL_GetDisplayMode(display, best_fit, &mode);
 	}
 
-#  ifdef _DEBUG
-	printf("Switching to video mode %dx%d\n", x, y);
-#  endif
+	/* evil, SDL2 needs a window to adjust display modes */
+	GHOST_WindowSDL *win = (GHOST_WindowSDL *)m_system->getWindowManager()->getActiveWindow();
 
-	// limit us to the main display
-	static char singleDisplayEnv[] = "SDL_SINGLEDISPLAY=1";
-	putenv(singleDisplayEnv);
+	if (win) {
+		SDL_Window *sdl_win = win->getSDLWindow();
 
-	// change to the mode
-	surf = SDL_SetVideoMode(x, y, setting.bpp, SDL_OPENGL | SDL_FULLSCREEN);
-	if (surf == NULL) {
-		fprintf(stderr, "Could not set video mode: %s.\n", SDL_GetError());
+
+		SDL_SetWindowDisplayMode(sdl_win, &mode);
+		SDL_ShowWindow(sdl_win);
+		SDL_SetWindowFullscreen(sdl_win, SDL_TRUE);
+
+		return GHOST_kSuccess;
+	}
+	else {
+		/* this is a problem for the BGE player :S, perhaps SDL2 will resolve at some point.
+		 * we really need SDL_SetDisplayModeForDisplay() to become an API func! - campbell */
+		printf("no windows available, cant fullscreen");
 		return GHOST_kFailure;
 	}
-
-	return GHOST_kSuccess;
 }




More information about the Bf-blender-cvs mailing list