diff options
author | 2015-02-04 14:24:05 +0100 | |
---|---|---|
committer | 2015-02-04 14:24:05 +0100 | |
commit | fba518ef0c1fc4e5879baaa19eabd4da6fda960c (patch) | |
tree | d3ab22f2091f313f3a3978f21fc93e1dc1c10b0a | |
parent | 84c053f76edc337823133ab64c46e492d6a28d12 (diff) |
Safety commit before pull. More code alignment. (nw)
-rw-r--r-- | src/osd/sdl/draw13.c | 164 | ||||
-rw-r--r-- | src/osd/sdl/drawbgfx.c | 20 | ||||
-rw-r--r-- | src/osd/sdl/drawogl.c | 184 | ||||
-rw-r--r-- | src/osd/sdl/drawsdl.c | 95 | ||||
-rw-r--r-- | src/osd/sdl/window.c | 3 | ||||
-rw-r--r-- | src/osd/sdl/window.h | 20 |
6 files changed, 287 insertions, 199 deletions
diff --git a/src/osd/sdl/draw13.c b/src/osd/sdl/draw13.c index 9a15a4d8d43..35f80b17178 100644 --- a/src/osd/sdl/draw13.c +++ b/src/osd/sdl/draw13.c @@ -143,17 +143,16 @@ class sdl_info13 : public osd_renderer { public: sdl_info13(sdl_window_info *w) - : osd_renderer(w), m_blittimer(0), m_renderer(NULL), + : osd_renderer(w, FLAG_NONE), m_blittimer(0), m_renderer(NULL), m_last_hofs(0), m_last_vofs(0), m_resize_pending(0), m_resize_width(0), m_resize_height(0), m_last_blit_time(0), m_last_blit_pixels(0) {} - /* virtual */ int create(int width, int height); - /* virtual */ void resize(int width, int height); - /* virtual */ int draw(UINT32 dc, int update); - /* virtual */ void set_target_bounds(); - /* virtual */ int xy_to_render_target(int x, int y, int *xt, int *yt); + /* virtual */ int create(const int width, const int height); + /* virtual */ void resize(const int width, const int height); + /* virtual */ int draw(const UINT32 dc, const int update); + /* virtual */ int xy_to_render_target(const int x, const int y, int *xt, int *yt); /* virtual */ void destroy_all_textures(); /* virtual */ void destroy(); /* virtual */ void clear(); @@ -594,11 +593,28 @@ int sdl_info13::create(int width, int height) * xrandr --output HDMI-0 --panning 0x0+0+0 --fb 0x0 * */ + osd_printf_verbose("Enter sdl_info::create\n"); - osd_printf_verbose("Enter sdl_info13::create\n"); +#if (SDLMAME_SDL2) + + if (check_flag(FLAG_NEEDS_OPENGL)) + { + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + + /* FIXME: A reminder that gamma is wrong throughout MAME. Currently, SDL2.0 doesn't seem to + * support the following attribute although my hardware lists GL_ARB_framebuffer_sRGB as an extension. + * + * SDL_GL_SetAttribute( SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1 ); + * + */ + m_extra_flags = SDL_WINDOW_OPENGL; + } + else + m_extra_flags = 0; // create the SDL window - m_extra_flags = (window().fullscreen() ? + // soft driver also used | SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_MOUSE_FOCUS + m_extra_flags |= (window().fullscreen() ? SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE); #if defined(SDLMAME_WIN32) @@ -608,9 +624,14 @@ int sdl_info13::create(int width, int height) window().m_sdl_window = SDL_CreateWindow(window().m_title, window().monitor()->position_size().x, window().monitor()->position_size().y, width, height, m_extra_flags); + //window().m_sdl_window = SDL_CreateWindow(window().m_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + // width, height, m_extra_flags); if (!window().m_sdl_window ) { + if (check_flag(FLAG_NEEDS_OPENGL)) + osd_printf_error("OpenGL not supported on this driver: %s\n", SDL_GetError()); + else osd_printf_error("Window creation failed: %s\n", SDL_GetError()); return 1; } @@ -639,6 +660,15 @@ int sdl_info13::create(int width, int height) { //SDL_SetWindowDisplayMode(window().m_sdl_window, NULL); // Use desktop } + + // show window + + SDL_ShowWindow(window().m_sdl_window); + //SDL_SetWindowFullscreen(window().m_sdl_window, window().fullscreen); + SDL_RaiseWindow(window().m_sdl_window); + + SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height); + // create renderer if (video_config.waitvsync) @@ -653,18 +683,48 @@ int sdl_info13::create(int width, int height) //SDL_SelectRenderer(window().sdl_window); - // show window - - SDL_ShowWindow(window().m_sdl_window); - //SDL_SetWindowFullscreen(window().sdl_window, window().fullscreen); - SDL_RaiseWindow(window().m_sdl_window); - - SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height); - m_blittimer = 3; SDL_RenderPresent(m_renderer); osd_printf_verbose("Leave sdl_info13::create\n"); + +#else + m_extra_flags = (window().fullscreen() ? SDL_FULLSCREEN : SDL_RESIZABLE); + m_extra_flags |= SDL_DOUBLEBUF; + + if (check_flag(FLAG_NEEDS_OPENGL)) + { + m_extra_flags |= 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) + m_sdlsurf = SDL_SetVideoMode(width, height, + 0, SDL_SWSURFACE | SDL_ANYFORMAT | m_extra_flags); + + if (!m_sdlsurf) + return 1; + if ( (video_config.mode == VIDEO_MODE_OPENGL) && !(m_sdlsurf->flags & SDL_OPENGL) ) + { + osd_printf_error("OpenGL not supported on this driver!\n"); + return 1; + } + + window().m_width = m_sdlsurf->w; + window().m_height = m_sdlsurf->h; + + window().m_screen_width = 0; + window().m_screen_height = 0; + + + // set the window title + SDL_WM_SetCaption(window().m_title, "SDLMAME"); + +#endif return 0; } @@ -685,6 +745,38 @@ void sdl_info13::resize(int width, int height) } + +//============================================================ +// sdl_info::destroy +//============================================================ + +void sdl_info13::destroy() +{ + // free the memory in the window + + destroy_all_textures(); + + if (window().fullscreen() && video_config.switchres) + { + SDL_SetWindowFullscreen(window().m_sdl_window, 0); // Try to set mode + SDL_SetWindowDisplayMode(window().m_sdl_window, &m_original_mode); // Try to set mode + SDL_SetWindowFullscreen(window().m_sdl_window, SDL_WINDOW_FULLSCREEN); // Try to set mode + } + + SDL_DestroyWindow(window().m_sdl_window); + +} + +//============================================================ +// sdl_info::clear +//============================================================ + +void sdl_info13::clear() +{ + m_blittimer = 2; +} + + //============================================================ // drawsdl_xy_to_render_target //============================================================ @@ -702,15 +794,6 @@ int sdl_info13::xy_to_render_target(int x, int y, int *xt, int *yt) } //============================================================ -// sdl_info::get_primitives -//============================================================ - -void sdl_info13::set_target_bounds() -{ - window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect()); -} - -//============================================================ // sdl_info::draw //============================================================ @@ -824,37 +907,6 @@ int sdl_info13::draw(UINT32 dc, int update) //============================================================ -// sdl_info13::clear -//============================================================ - -void sdl_info13::clear() -{ - m_blittimer = 2; -} - - -//============================================================ -// sdl_info13::destroy -//============================================================ - -void sdl_info13::destroy() -{ - // free the memory in the window - - destroy_all_textures(); - - if (window().fullscreen() && video_config.switchres) - { - SDL_SetWindowFullscreen(window().m_sdl_window, 0); // Try to set mode - SDL_SetWindowDisplayMode(window().m_sdl_window, &m_original_mode); // Try to set mode - SDL_SetWindowFullscreen(window().m_sdl_window, SDL_WINDOW_FULLSCREEN); // Try to set mode - } - - SDL_DestroyWindow(window().m_sdl_window); - -} - -//============================================================ // texture handling //============================================================ diff --git a/src/osd/sdl/drawbgfx.c b/src/osd/sdl/drawbgfx.c index a9992b9426a..0adc8523082 100644 --- a/src/osd/sdl/drawbgfx.c +++ b/src/osd/sdl/drawbgfx.c @@ -74,17 +74,16 @@ class sdl_info_bgfx : public osd_renderer { public: sdl_info_bgfx(sdl_window_info *w) - : osd_renderer(w), m_blittimer(0), m_renderer(NULL), + : osd_renderer(w, FLAG_NONE), m_blittimer(0), m_renderer(NULL), m_last_hofs(0), m_last_vofs(0), m_resize_pending(0), m_resize_width(0), m_resize_height(0), m_last_blit_time(0), m_last_blit_pixels(0) {} - /* virtual */ int create(int width, int height); - /* virtual */ void resize(int width, int height); - /* virtual */ int draw(UINT32 dc, int update); - /* virtual */ void set_target_bounds(); - /* virtual */ int xy_to_render_target(int x, int y, int *xt, int *yt); + /* virtual */ int create(const int width, const int height); + /* virtual */ void resize(const int width, const int height); + /* virtual */ int draw(const UINT32 dc, const int update); + /* virtual */ int xy_to_render_target(const int x, const int y, int *xt, int *yt); /* virtual */ void destroy_all_textures(); /* virtual */ void destroy(); /* virtual */ void clear(); @@ -254,15 +253,6 @@ int sdl_info_bgfx::xy_to_render_target(int x, int y, int *xt, int *yt) } //============================================================ -// sdl_info_bgfx::get_primitives -//============================================================ - -void sdl_info_bgfx::set_target_bounds() -{ - window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect()); -} - -//============================================================ // sdl_info_bgfx::draw //============================================================ diff --git a/src/osd/sdl/drawogl.c b/src/osd/sdl/drawogl.c index e1333455c48..34fee772f49 100644 --- a/src/osd/sdl/drawogl.c +++ b/src/osd/sdl/drawogl.c @@ -156,11 +156,14 @@ enum // TYPES //============================================================ -struct texture_info; +//============================================================ +// Textures +//============================================================ /* texture_info holds information about a texture */ -struct texture_info +class texture_info { +public: texture_info() : hash(0), flags(0), rawwidth(0), rawheight(0), rawwidth_create(0), rawheight_create(0), @@ -219,7 +222,7 @@ class sdl_info_ogl : public osd_renderer { public: sdl_info_ogl(sdl_window_info *window) - : osd_renderer(window), m_blittimer(0), m_extra_flags(0), + : osd_renderer(window, FLAG_NEEDS_OPENGL), m_blittimer(0), m_extra_flags(0), #if (SDLMAME_SDL2) m_gl_context_id(0), #else @@ -248,11 +251,10 @@ public: m_texVerticex[i] = 0.0f; } - /* virtual */ int create(int width, int height); - /* virtual */ void resize(int width, int height); - /* virtual */ int draw(UINT32 dc, int update); - /* virtual */ void set_target_bounds(); - /* virtual */ int xy_to_render_target(int x, int y, int *xt, int *yt); + /* virtual */ int create(const int width, const int height); + /* virtual */ void resize(const int width, int const height); + /* virtual */ int draw(const UINT32 dc, const int update); + /* virtual */ int xy_to_render_target(const int x, const int y, int *xt, int *yt); /* virtual */ void destroy_all_textures(); /* virtual */ void destroy(); /* virtual */ void clear(); @@ -393,6 +395,10 @@ void sdl_info_ogl::set_blendmode(int blendmode) // core functions +//============================================================ +// STATIC VARIABLES +//============================================================ + static void drawogl_exit(void); static void load_gl_lib(running_machine &machine); @@ -440,7 +446,7 @@ static int shown_video_info = 0; static int dll_loaded = 0; //============================================================ -// drawogl_init +// drawsdl_init //============================================================ static osd_renderer *drawogl_create(sdl_window_info *window) @@ -456,10 +462,10 @@ int drawogl_init(running_machine &machine, sdl_draw_info *callbacks) dll_loaded = 0; + load_gl_lib(machine); if (SDLMAME_SDL2) { osd_printf_verbose("Using SDL multi-window OpenGL driver (SDL 2.0+)\n"); - load_gl_lib(machine); } else osd_printf_verbose("Using SDL single-window OpenGL driver (SDL 1.2)\n"); @@ -710,27 +716,36 @@ void sdl_info_ogl::initialize_gl() int sdl_info_ogl::create(int width, int height) { -#if (SDLMAME_SDL2) - - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - - /* FIXME: A reminder that gamma is wrong throughout MAME. Currently, SDL2.0 doesn't seem to - * support the following attribute although my hardware lists GL_ARB_framebuffer_sRGB as an extension. + /* FIXME: On Ubuntu and potentially other Linux OS you should use + * to disable panning. This has to be done before every invocation of mame. * - * SDL_GL_SetAttribute( SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1 ); + * xrandr --output HDMI-0 --panning 0x0+0+0 --fb 0x0 * */ + osd_printf_verbose("Enter sdl_info::create\n"); + +#if (SDLMAME_SDL2) - osd_printf_verbose("Enter sdl_info_ogl::create\n"); + if (check_flag(FLAG_NEEDS_OPENGL)) + { + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + + /* FIXME: A reminder that gamma is wrong throughout MAME. Currently, SDL2.0 doesn't seem to + * support the following attribute although my hardware lists GL_ARB_framebuffer_sRGB as an extension. + * + * SDL_GL_SetAttribute( SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1 ); + * + */ + m_extra_flags = SDL_WINDOW_OPENGL; + } + else + m_extra_flags = 0; // create the SDL window // soft driver also used | SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_MOUSE_FOCUS - m_extra_flags = (window().fullscreen() ? + m_extra_flags |= (window().fullscreen() ? SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE); - m_extra_flags |= SDL_WINDOW_OPENGL; - - #if defined(SDLMAME_WIN32) SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); #endif @@ -743,7 +758,10 @@ int sdl_info_ogl::create(int width, int height) if (!window().m_sdl_window ) { - osd_printf_error("OpenGL not supported on this driver: %s\n", SDL_GetError()); + if (check_flag(FLAG_NEEDS_OPENGL)) + osd_printf_error("OpenGL not supported on this driver: %s\n", SDL_GetError()); + else + osd_printf_error("Window creation failed: %s\n", SDL_GetError()); return 1; } @@ -771,9 +789,6 @@ int sdl_info_ogl::create(int width, int height) { //SDL_SetWindowDisplayMode(window().m_sdl_window, NULL); // Use desktop } - // create renderer - - //SDL_SelectRenderer(window().sdl_window); // show window @@ -783,6 +798,7 @@ int sdl_info_ogl::create(int width, int height) SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height); + // create renderer m_gl_context_id = SDL_GL_CreateContext(window().m_sdl_window); if (!m_gl_context_id) @@ -795,14 +811,17 @@ int sdl_info_ogl::create(int width, int height) #else m_extra_flags = (window().fullscreen() ? SDL_FULLSCREEN : SDL_RESIZABLE); - m_extra_flags |= SDL_OPENGL | SDL_DOUBLEBUF; - - 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 + m_extra_flags |= SDL_DOUBLEBUF; - load_gl_lib(window().machine()); + if (check_flag(FLAG_NEEDS_OPENGL)) + { + m_extra_flags |= 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) m_sdlsurf = SDL_SetVideoMode(width, height, @@ -810,6 +829,11 @@ int sdl_info_ogl::create(int width, int height) if (!m_sdlsurf) return 1; + if ( (video_config.mode == VIDEO_MODE_OPENGL) && !(m_sdlsurf->flags & SDL_OPENGL) ) + { + osd_printf_error("OpenGL not supported on this driver!\n"); + return 1; + } window().m_width = m_sdlsurf->w; window().m_height = m_sdlsurf->h; @@ -817,11 +841,6 @@ int sdl_info_ogl::create(int width, int height) window().m_screen_width = 0; window().m_screen_height = 0; - if ( (video_config.mode == VIDEO_MODE_OPENGL) && !(m_sdlsurf->flags & SDL_OPENGL) ) - { - osd_printf_error("OpenGL not supported on this driver!\n"); - return 1; - } // set the window title SDL_WM_SetCaption(window().m_title, "SDLMAME"); @@ -876,6 +895,47 @@ void sdl_info_ogl::resize(int width, int height) } + +//============================================================ +// sdl_info::destroy +//============================================================ + +void sdl_info_ogl::destroy() +{ + + // free the memory in the window + + destroy_all_textures(); + +#if (SDLMAME_SDL2) + SDL_GL_DeleteContext(m_gl_context_id); + if (window().fullscreen() && video_config.switchres) + { + SDL_SetWindowFullscreen(window().m_sdl_window, 0); // Try to set mode + SDL_SetWindowDisplayMode(window().m_sdl_window, &m_original_mode); // Try to set mode + SDL_SetWindowFullscreen(window().m_sdl_window, SDL_WINDOW_FULLSCREEN); // Try to set mode + } + + SDL_DestroyWindow(window().m_sdl_window); +#else + if (m_sdlsurf) + { + SDL_FreeSurface(m_sdlsurf); + m_sdlsurf = NULL; + } +#endif +} + +//============================================================ +// sdl_info::clear +//============================================================ + +void sdl_info_ogl::clear() +{ + //FIXME: Handled in sdl_info::draw as well + m_blittimer = 3; +} + //============================================================ // drawsdl_xy_to_render_target //============================================================ @@ -892,15 +952,6 @@ int sdl_info_ogl::xy_to_render_target(int x, int y, int *xt, int *yt) } //============================================================ -// sdl_info::get_primitives -//============================================================ - -void sdl_info_ogl::set_target_bounds() -{ - window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect()); -} - -//============================================================ // loadGLExtensions //============================================================ @@ -1211,36 +1262,6 @@ void sdl_info_ogl::loadGLExtensions() } //============================================================ -// sdl_info::destroy -//============================================================ - -void sdl_info_ogl::destroy() -{ - - // free the memory in the window - - destroy_all_textures(); - -#if (SDLMAME_SDL2) - SDL_GL_DeleteContext(m_gl_context_id); - if (window().fullscreen() && video_config.switchres) - { - SDL_SetWindowFullscreen(window().m_sdl_window, 0); // Try to set mode - SDL_SetWindowDisplayMode(window().m_sdl_window, &m_original_mode); // Try to set mode - SDL_SetWindowFullscreen(window().m_sdl_window, SDL_WINDOW_FULLSCREEN); // Try to set mode - } - - SDL_DestroyWindow(window().m_sdl_window); -#else - if (m_sdlsurf) - { - SDL_FreeSurface(m_sdlsurf); - m_sdlsurf = NULL; - } -#endif -} - -//============================================================ // sdl_info::draw //============================================================ @@ -3167,12 +3188,3 @@ void sdl_info_ogl::destroy_all_textures() window().m_primlist->release_lock(); } -//============================================================ -// TEXCOPY FUNCS -//============================================================ - -void sdl_info_ogl::clear() -{ - //FIXME: Handled in sdl_info::draw as well - m_blittimer = 3; -} diff --git a/src/osd/sdl/drawsdl.c b/src/osd/sdl/drawsdl.c index 2d9719f4afb..2503da65c2e 100644 --- a/src/osd/sdl/drawsdl.c +++ b/src/osd/sdl/drawsdl.c @@ -51,7 +51,7 @@ class sdl_info : public osd_renderer public: sdl_info(sdl_window_info *w) - : osd_renderer(w), + : osd_renderer(w, FLAG_NONE), m_blittimer(0), m_extra_flags(0), @@ -72,11 +72,10 @@ public: m_old_blitheight(0) { } - /* virtual */ int create(int width, int height); - /* virtual */ void resize(int width, int height); - /* virtual */ int draw(UINT32 dc, int update); - /* virtual */ void set_target_bounds(); - /* virtual */ int xy_to_render_target(int x, int y, int *xt, int *yt); + /* virtual */ int create(const int width, const int height); + /* virtual */ void resize(const int width, const int height); + /* virtual */ int draw(const UINT32 dc, const int update); + /* virtual */ int xy_to_render_target(const int x, const int y, int *xt, int *yt); /* virtual */ void destroy_all_textures(); /* virtual */ void destroy(); /* virtual */ void clear(); @@ -431,23 +430,45 @@ static void drawsdl_show_info(struct SDL_RendererInfo *render_info) int sdl_info::create(int width, int height) { + /* FIXME: On Ubuntu and potentially other Linux OS you should use + * to disable panning. This has to be done before every invocation of mame. + * + * xrandr --output HDMI-0 --panning 0x0+0+0 --fb 0x0 + * + */ const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode]; + osd_printf_verbose("Enter sdl_info::create\n"); + #if (SDLMAME_SDL2) - osd_printf_verbose("Enter sdl_info::create\n"); + if (check_flag(FLAG_NEEDS_OPENGL)) + { + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + + /* FIXME: A reminder that gamma is wrong throughout MAME. Currently, SDL2.0 doesn't seem to + * support the following attribute although my hardware lists GL_ARB_framebuffer_sRGB as an extension. + * + * SDL_GL_SetAttribute( SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1 ); + * + */ + m_extra_flags = SDL_WINDOW_OPENGL; + } + else + m_extra_flags = 0; /* set hints ... */ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, sm->sdl_scale_mode); // create the SDL window // soft driver also used | SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_MOUSE_FOCUS - m_extra_flags = (window().fullscreen() ? + m_extra_flags |= (window().fullscreen() ? SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_FULLSCREEN : SDL_WINDOW_RESIZABLE); #if defined(SDLMAME_WIN32) SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); #endif + // create the SDL window window().m_sdl_window = SDL_CreateWindow(window().m_title, window().monitor()->position_size().x, window().monitor()->position_size().y, width, height, m_extra_flags); @@ -456,7 +477,10 @@ int sdl_info::create(int width, int height) if (!window().m_sdl_window ) { - osd_printf_error("Unable to create window: %s\n", SDL_GetError()); + if (check_flag(FLAG_NEEDS_OPENGL)) + osd_printf_error("OpenGL not supported on this driver: %s\n", SDL_GetError()); + else + osd_printf_error("Window creation failed: %s\n", SDL_GetError()); return 1; } @@ -484,9 +508,6 @@ int sdl_info::create(int width, int height) { //SDL_SetWindowDisplayMode(window().m_sdl_window, NULL); // Use desktop } - // create renderer - - //SDL_SelectRenderer(window().sdl_window); // show window @@ -496,18 +517,17 @@ int sdl_info::create(int width, int height) SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height); - /* FIXME: Bug in SDL 1.3 */ - if (window().fullscreen()) - SDL_SetWindowGrab(window().m_sdl_window, SDL_TRUE); - - // create a texture + // create renderer if (video_config.waitvsync) - m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, /*SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTDISCARD |*/ SDL_RENDERER_PRESENTVSYNC); + m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); else - m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, /*SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTDISCARD*/ 0); + m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_ACCELERATED); - //SDL_SelectRenderer(window().sdl_window); + if (!m_sdl_renderer) + { + fatalerror("Error on creating renderer: %s\n", SDL_GetError()); + } { struct SDL_RendererInfo render_info; @@ -539,11 +559,28 @@ int sdl_info::create(int width, int height) m_extra_flags |= sm->m_extra_flags; + if (check_flag(FLAG_NEEDS_OPENGL)) + { + 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) m_sdlsurf = SDL_SetVideoMode(width, height, 0, SDL_SWSURFACE | SDL_ANYFORMAT | m_extra_flags); if (!m_sdlsurf) return 1; + if ( (video_config.mode == VIDEO_MODE_OPENGL) && !(m_sdlsurf->flags & SDL_OPENGL) ) + { + osd_printf_error("OpenGL not supported on this driver!\n"); + return 1; + } + window().m_width = m_sdlsurf->w; window().m_height = m_sdlsurf->h; if (sm->is_yuv) @@ -645,11 +682,12 @@ void sdl_info::destroy() } //============================================================ -// sdl_info::draw +// sdl_info::clear //============================================================ void sdl_info::clear() { + //FIXME: Handled in sdl_info::draw as well m_blittimer = 3; } @@ -659,28 +697,17 @@ void sdl_info::clear() int sdl_info::xy_to_render_target(int x, int y, int *xt, int *yt) { - const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode]; - *xt = x - m_last_hofs; *yt = y - m_last_vofs; if (*xt<0 || *xt >= window().m_blitwidth) return 0; - if (*yt<0 || *xt >= window().m_blitheight) + if (*yt<0 || *yt >= window().m_blitheight) return 0; return 1; } //============================================================ -// drawsdl_window_get_primitives -//============================================================ - -void sdl_info::set_target_bounds() -{ - window().m_target->set_bounds(window().m_blitwidth, window().m_blitheight, window().monitor()->aspect()); -} - -//============================================================ -// drawsdl_window_draw +// sdl_info::draw //============================================================ int sdl_info::draw(UINT32 dc, int update) diff --git a/src/osd/sdl/window.c b/src/osd/sdl/window.c index f5919efab44..c36aa07e00d 100644 --- a/src/osd/sdl/window.c +++ b/src/osd/sdl/window.c @@ -1031,7 +1031,8 @@ void sdl_window_info::video_window_update(running_machine &machine) } // ensure the target bounds are up-to-date, and then get the primitives - renderer().set_target_bounds(); + + m_target->set_bounds(m_blitwidth, m_blitheight, monitor()->aspect()); render_primitive_list &primlist = m_target->get_primitives(); diff --git a/src/osd/sdl/window.h b/src/osd/sdl/window.h index 552be888fde..133e94050ca 100644 --- a/src/osd/sdl/window.h +++ b/src/osd/sdl/window.h @@ -37,24 +37,30 @@ class sdl_window_info; class osd_renderer { public: - osd_renderer(sdl_window_info *window) - : m_window(window) { } + + static const int FLAG_NONE = 0; + static const int FLAG_NEEDS_OPENGL = 1; + + osd_renderer(sdl_window_info *window, const int flags) + : m_window(window), m_flags(flags) { } virtual ~osd_renderer() { } sdl_window_info &window() { return *m_window; } + int flags() const { return m_flags; } + bool check_flag(const int flag) { return ((m_flags & flag)) == flag; } - virtual int create(int width, int height) = 0; - virtual void resize(int width, int height) = 0; - virtual int draw(UINT32 dc, int update) = 0; - virtual void set_target_bounds() = 0; - virtual int xy_to_render_target(int x, int y, int *xt, int *yt) = 0; + virtual int create(const int width, const int height) = 0; + virtual void resize(const int width, const int height) = 0; + virtual int draw(const UINT32 dc, const int update) = 0; + virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) = 0; virtual void destroy_all_textures() = 0; virtual void destroy() = 0; virtual void clear() = 0; private: sdl_window_info *m_window; + int m_flags; }; #define OSDWORK_CALLBACK(name) void *name(void *param, ATTR_UNUSED int threadid) |