diff options
Diffstat (limited to 'src/osd/sdl/window.cpp')
-rw-r--r-- | src/osd/sdl/window.cpp | 198 |
1 files changed, 188 insertions, 10 deletions
diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 113a00b47bf..47ab3cdd162 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -16,7 +16,11 @@ // standard SDL headers #include "sdlinc.h" +#if (SDLMAME_SDL2) #include <SDL2/SDL_thread.h> +#else +#include <SDL/SDL_thread.h> +#endif // standard C headers #include <math.h> @@ -88,6 +92,10 @@ static sdl_window_info **last_window_ptr; static int multithreading_enabled; static osd_work_queue *work_queue; +#if !(SDLMAME_SDL2) && (!defined(SDLMAME_EMSCRIPTEN)) +typedef int SDL_threadID; +#endif + static SDL_threadID main_threadid; static SDL_threadID window_threadid; @@ -181,7 +189,11 @@ static OSDWORK_CALLBACK(sdlwindow_thread_id) if (SDLMAME_INIT_IN_WORKER_THREAD) { +#if (SDLMAME_SDL2) if (SDL_InitSubSystem(SDL_INIT_TIMER|SDL_INIT_AUDIO| SDL_INIT_VIDEO| SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE)) +#else + if (SDL_Init(SDL_INIT_TIMER|SDL_INIT_AUDIO| SDL_INIT_VIDEO| SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE)) +#endif { osd_printf_error("Could not initialize SDL: %s.\n", SDL_GetError()); exit(-1); @@ -230,22 +242,27 @@ bool sdl_osd_interface::window_init() video_config.mode = VIDEO_MODE_SOFT; } #endif +#if SDLMAME_SDL2 if (video_config.mode == VIDEO_MODE_SDL2ACCEL) { if (drawsdl2_init(machine(), &draw)) video_config.mode = VIDEO_MODE_SOFT; } +#endif +#ifdef USE_BGFX if (video_config.mode == VIDEO_MODE_BGFX) { if (drawbgfx_init(machine(), &draw)) video_config.mode = VIDEO_MODE_SOFT; } +#endif if (video_config.mode == VIDEO_MODE_SOFT) { if (drawsdl_init(&draw)) return false; } +#if SDLMAME_SDL2 /* We may want to set a number of the hints SDL2 provides. * The code below will document which hints were set. */ @@ -277,6 +294,7 @@ bool sdl_osd_interface::window_init() osd_printf_verbose("\nHints:\n"); for (int i = 0; hints[i] != NULL; i++) osd_printf_verbose("\t%-40s %s\n", hints[i], SDL_GetHint(hints[i])); +#endif // set up the window list last_window_ptr = &sdl_window_list; @@ -460,7 +478,14 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_resize_wt ) ASSERT_WINDOW_THREAD(); +#if (SDLMAME_SDL2) SDL_SetWindowSize(window->sdl_window(), width, height); +#else + SDL_FreeSurface(window->m_sdlsurf); + + window->m_sdlsurf = SDL_SetVideoMode(width, height, 0, + SDL_SWSURFACE | SDL_ANYFORMAT | window->m_extra_flags); +#endif window->renderer().notify_changed(); osd_free(wp); @@ -534,6 +559,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) global_free(window->m_renderer); window->m_renderer = NULL; +#if (SDLMAME_SDL2) bool is_osx = false; #ifdef SDLMAME_MACOSX // FIXME: This is weird behaviour and certainly a bug in SDL @@ -546,6 +572,15 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) SDL_SetWindowFullscreen(window->sdl_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode } SDL_DestroyWindow(window->sdl_window()); +#else + if (window->m_sdlsurf) + { + SDL_FreeSurface(window->m_sdlsurf); + window->m_sdlsurf = NULL; + } +#endif + + sdlinput_release_keys(); window->set_renderer(draw.create(window)); @@ -612,6 +647,7 @@ void sdl_window_info::update_cursor_state() c=SDL_CreateCursor(data, data, 8, 8, 0, 0); SDL_SetCursor(c); #else +#if (SDLMAME_SDL2) // do not do mouse capture if the debugger's enabled to avoid // the possibility of losing control if (!(machine().debug_flags & DEBUG_FLAG_OSD_ENABLED)) @@ -634,6 +670,30 @@ void sdl_window_info::update_cursor_state() } SDL_SetCursor(NULL); // Force an update in case the underlying driver has changed visibility } + +#else + // do not do mouse capture if the debugger's enabled to avoid + // the possibility of losing control + if (!(machine().debug_flags & DEBUG_FLAG_OSD_ENABLED)) + { + if ( fullscreen() || sdlinput_should_hide_mouse() ) + { + SDL_ShowCursor(SDL_DISABLE); + if (!SDL_WM_GrabInput(SDL_GRAB_QUERY)) + { + SDL_WM_GrabInput(SDL_GRAB_ON); + } + } + else + { + SDL_ShowCursor(SDL_ENABLE); + if (SDL_WM_GrabInput(SDL_GRAB_QUERY)) + { + SDL_WM_GrabInput(SDL_GRAB_OFF); + } + } + } +#endif #endif } @@ -733,6 +793,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt ) // free the textures etc window->renderer().destroy(); +#if (SDLMAME_SDL2) if (window->fullscreen() && video_config.switchres) { SDL_SetWindowFullscreen(window->sdl_window(), 0); // Try to set mode @@ -740,6 +801,14 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_video_window_destroy_wt ) SDL_SetWindowFullscreen(window->sdl_window(), SDL_WINDOW_FULLSCREEN); // Try to set mode } SDL_DestroyWindow(window->sdl_window()); +#else + if (window->m_sdlsurf) + { + SDL_FreeSurface(window->m_sdlsurf); + window->m_sdlsurf = NULL; + } +#endif + // release all keys ... sdlinput_release_keys(); @@ -784,6 +853,7 @@ void sdl_window_info::destroy() // pick_best_mode //============================================================ +#if SDLMAME_SDL2 osd_dim sdl_window_info::pick_best_mode() { int minimum_width, minimum_height, target_width, target_height; @@ -852,6 +922,82 @@ osd_dim sdl_window_info::pick_best_mode() } return ret; } +#else +osd_dim sdl_window_info::pick_best_mode() +{ + int minimum_width, minimum_height, target_width, target_height; + int i; + float size_score, best_score = 0.0f; + int best_width = 0, best_height = 0; + SDL_Rect **modes; + + // determine the minimum width/height for the selected target + m_target->compute_minimum_size(minimum_width, minimum_height); + + // use those as the target for now + target_width = minimum_width * MAX(1, prescale()); + target_height = minimum_height * MAX(1, prescale()); + + // if we're not stretching, allow some slop on the minimum since we can handle it + { + minimum_width -= 4; + minimum_height -= 4; + } + +#if 1 // defined(SDLMAME_WIN32) + /* + * We need to do this here. If SDL_ListModes is + * called in init_monitors, the call will crash + * on win32 + */ + modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_DOUBLEBUF); +#else + modes = window->m_monitor->modes; +#endif + + if (modes == (SDL_Rect **)0) + { + osd_printf_error("SDL: No modes available?!\n"); + exit(-1); + } + else if (modes == (SDL_Rect **)-1) // all modes are possible + { + return osd_dim(m_win_config.width, m_win_config.height); + } + else + { + for (i = 0; modes[i]; ++i) + { + // compute initial score based on difference between target and current + size_score = 1.0f / (1.0f + fabsf((INT32)modes[i]->w - target_width) + fabsf((INT32)modes[i]->h - target_height)); + + // if the mode is too small, give a big penalty + if (modes[i]->w < minimum_width || modes[i]->h < minimum_height) + size_score *= 0.01f; + + // if mode is smaller than we'd like, it only scores up to 0.1 + if (modes[i]->w < target_width || modes[i]->h < target_height) + size_score *= 0.1f; + + // if we're looking for a particular mode, that's a winner + if (modes[i]->w == m_win_config.width && modes[i]->h == m_win_config.height) + size_score = 2.0f; + + osd_printf_verbose("%4dx%4d -> %f\n", (int)modes[i]->w, (int)modes[i]->h, size_score); + + // best so far? + if (size_score > best_score) + { + best_score = size_score; + best_width = modes[i]->w; + best_height = modes[i]->h; + } + + } + } + return osd_dim(best_width, best_height); +} +#endif //============================================================ // sdlwindow_video_window_update @@ -996,6 +1142,8 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt ) */ osd_printf_verbose("Enter sdl_info::create\n"); +#if (SDLMAME_SDL2) + if (window->renderer().has_flags(osd_renderer::FLAG_NEEDS_OPENGL)) { SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); @@ -1079,18 +1227,48 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt ) SDL_SetWindowGrab(window->sdl_window(), SDL_TRUE); #endif - // set main window - if (window->m_index > 0) +#else + window->m_extra_flags = (window->fullscreen() ? SDL_FULLSCREEN : SDL_RESIZABLE); + + if (window->renderer().has_flags(osd_renderer::FLAG_NEEDS_DOUBLEBUF)) + window->m_extra_flags |= SDL_DOUBLEBUF; + if (window->renderer().has_flags(osd_renderer::FLAG_NEEDS_ASYNCBLIT)) + window->m_extra_flags |= SDL_ASYNCBLIT; + + if (window->renderer().has_flags(osd_renderer::FLAG_NEEDS_OPENGL)) { - for (auto w = sdl_window_list; w != NULL; w = w->m_next) - { - if (w->m_index == 0) - { - window->m_main = w; - break; - } - } + window->m_extra_flags |= SDL_DOUBLEBUF | SDL_OPENGL; + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + #if (SDL_VERSION_ATLEAST(1,2,10)) && (!defined(SDLMAME_EMSCRIPTEN)) + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, video_config.waitvsync ? 1 : 0); + #endif + // load_gl_lib(window->machine()); } + + // create the SDL surface (which creates the window in windowed mode) +#if 0 + window->m_sdlsurf = SDL_SetVideoMode(tempwidth, tempheight, + 0, SDL_OPENGL | SDL_FULLSCREEN);// | window->m_extra_flags); + if (!window->m_sdlsurf) + printf("completely failed\n"); +#endif + window->m_sdlsurf = SDL_SetVideoMode(temp.width(), temp.height(), + 0, SDL_SWSURFACE | SDL_ANYFORMAT | window->m_extra_flags); + + if (!window->m_sdlsurf) + { + osd_printf_error("SDL Error: %s\n", SDL_GetError()); + return (void *) &result[1]; + } + if ( (video_config.mode == VIDEO_MODE_OPENGL) && !(window->m_sdlsurf->flags & SDL_OPENGL) ) + { + osd_printf_error("OpenGL not supported on this driver!\n"); + return (void *) &result[1]; + } + // set the window title + SDL_WM_SetCaption(window->m_title, "SDLMAME"); +#endif + window->monitor()->refresh(); // initialize the drawing backend if (window->renderer().create()) |