1 |
|
/* |
2 |
|
* video_sdl.cpp - Video/graphics emulation, SDL specific stuff |
3 |
|
* |
4 |
< |
* Basilisk II (C) 1997-2005 Christian Bauer |
4 |
> |
* Basilisk II (C) 1997-2008 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
197 |
|
|
198 |
|
static void *vm_acquire_framebuffer(uint32 size) |
199 |
|
{ |
200 |
< |
return vm_acquire(size); |
200 |
> |
// always try to reallocate framebuffer at the same address |
201 |
> |
static void *fb = VM_MAP_FAILED; |
202 |
> |
if (fb != VM_MAP_FAILED) { |
203 |
> |
if (vm_acquire_fixed(fb, size) < 0) { |
204 |
> |
#ifndef SHEEPSHAVER |
205 |
> |
printf("FATAL: Could not reallocate framebuffer at previous address\n"); |
206 |
> |
#endif |
207 |
> |
fb = VM_MAP_FAILED; |
208 |
> |
} |
209 |
> |
} |
210 |
> |
if (fb == VM_MAP_FAILED) |
211 |
> |
fb = vm_acquire(size, VM_MAP_DEFAULT | VM_MAP_32BIT); |
212 |
> |
return fb; |
213 |
|
} |
214 |
|
|
215 |
|
static inline void vm_release_framebuffer(void *fb, uint32 size) |
731 |
|
* Windowed display driver |
732 |
|
*/ |
733 |
|
|
734 |
+ |
static bool SDL_display_opened = false; |
735 |
+ |
|
736 |
|
// Open display |
737 |
|
driver_window::driver_window(SDL_monitor_desc &m) |
738 |
|
: driver_base(m), mouse_grabbed(false) |
744 |
|
// Set absolute mouse mode |
745 |
|
ADBSetRelMouseMode(mouse_grabbed); |
746 |
|
|
747 |
+ |
// This is ugly: |
748 |
+ |
// If we're switching resolutions (ie, not setting it for the first time), |
749 |
+ |
// there's a bug in SDL where the SDL_Surface created will not be properly |
750 |
+ |
// setup. The solution is to SDL_QuitSubSystem(SDL_INIT_VIDEO) before calling |
751 |
+ |
// SDL_SetVideoMode for the second time (SDL_SetVideoMode will call SDL_Init() |
752 |
+ |
// and all will be well). Without this, the video becomes corrupted (at least |
753 |
+ |
// on Mac OS X), after the resolution switch. |
754 |
+ |
if (SDL_display_opened) |
755 |
+ |
SDL_QuitSubSystem(SDL_INIT_VIDEO); |
756 |
+ |
|
757 |
|
// Create surface |
758 |
|
int depth = sdl_depth_of_video_depth(VIDEO_MODE_DEPTH); |
759 |
|
if ((s = SDL_SetVideoMode(width, height, depth, SDL_HWSURFACE)) == NULL) |
760 |
|
return; |
761 |
|
|
762 |
+ |
SDL_display_opened = true; |
763 |
+ |
|
764 |
|
#ifdef ENABLE_VOSF |
765 |
|
use_vosf = true; |
766 |
|
// Allocate memory for frame buffer (SIZE is extended to page-boundary) |