Moved all window related code to window.c. (nw)

This commit is contained in:
couriersud 2015-02-05 01:06:37 +01:00
parent ccf953911f
commit dabb6b1799
8 changed files with 301 additions and 404 deletions

View File

@ -118,7 +118,7 @@ public:
private:
Uint32 m_sdl_access;
SDL_Renderer * m_renderer;
SDL_Renderer * m_sdl_renderer;
render_texinfo m_texinfo; // copy of the texture info
HashT m_hash; // hash value for the texture (must be >= pointer size)
UINT32 m_flags; // rendering flags
@ -143,7 +143,7 @@ class sdl_info13 : public osd_renderer
{
public:
sdl_info13(sdl_window_info *w)
: osd_renderer(w, FLAG_NONE), m_blittimer(0), m_renderer(NULL),
: osd_renderer(w, FLAG_NONE), m_blittimer(0), m_sdl_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)
@ -171,7 +171,7 @@ public:
SDL_Surface *m_sdlsurf;
#endif
SDL_Renderer * m_renderer;
SDL_Renderer * m_sdl_renderer;
simple_list<texture_info> m_texlist; // list of active textures
float m_last_hofs;
@ -389,7 +389,7 @@ void texture_info::render_quad(const render_primitive *prim, const int x, const
SDL_SetTextureBlendMode(m_texture_id, m_sdl_blendmode);
set_coloralphamode(m_texture_id, &prim->color);
SDL_RenderCopy(m_renderer, m_texture_id, NULL, &target_rect);
SDL_RenderCopy(m_sdl_renderer, m_texture_id, NULL, &target_rect);
}
void sdl_info13::render_quad(texture_info *texture, const render_primitive *prim, const int x, const int y)
@ -423,9 +423,9 @@ void sdl_info13::render_quad(texture_info *texture, const render_primitive *prim
UINT32 sb = (UINT32)(255.0f * prim->color.b);
UINT32 sa = (UINT32)(255.0f * prim->color.a);
SDL_SetRenderDrawBlendMode(m_renderer, map_blendmode(PRIMFLAG_GET_BLENDMODE(prim->flags)));
SDL_SetRenderDrawColor(m_renderer, sr, sg, sb, sa);
SDL_RenderFillRect(m_renderer, &target_rect);
SDL_SetRenderDrawBlendMode(m_sdl_renderer, map_blendmode(PRIMFLAG_GET_BLENDMODE(prim->flags)));
SDL_SetRenderDrawColor(m_sdl_renderer, sr, sg, sb, sa);
SDL_RenderFillRect(m_sdl_renderer, &target_rect);
}
}
@ -595,11 +595,11 @@ int sdl_info13::create(int width, int height)
}
if (video_config.waitvsync)
m_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
m_sdl_renderer = SDL_CreateRenderer(window().sdl_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
else
m_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_ACCELERATED);
m_sdl_renderer = SDL_CreateRenderer(window().sdl_window(), -1, SDL_RENDERER_ACCELERATED);
if (!m_renderer)
if (!m_sdl_renderer)
{
fatalerror("Error on creating renderer: %s\n", SDL_GetError());
}
@ -608,7 +608,7 @@ int sdl_info13::create(int width, int height)
m_blittimer = 3;
SDL_RenderPresent(m_renderer);
SDL_RenderPresent(m_sdl_renderer);
osd_printf_verbose("Leave sdl_info13::create\n");
#else
@ -623,15 +623,8 @@ int sdl_info13::create(int width, int height)
void sdl_info13::resize(int width, int height)
{
m_resize_pending = 1;
m_resize_height = height;
m_resize_width = width;
window().m_width = width;
window().m_height = height;
SDL_RenderSetViewport(m_sdl_renderer, NULL);
m_blittimer = 3;
}
@ -641,29 +634,7 @@ void sdl_info13::resize(int width, int height)
void sdl_info13::destroy()
{
// free the memory in the window
destroy_all_textures();
#if (SDLMAME_SDL2)
if (check_flag(FLAG_NEEDS_OPENGL))
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, &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
}
//============================================================
@ -685,9 +656,9 @@ int sdl_info13::xy_to_render_target(int x, int y, int *xt, int *yt)
*xt = x - m_last_hofs;
*yt = y - m_last_vofs;
if (*xt<0 || *xt >= window().m_blitwidth)
if (*xt<0 || *xt >= window().blitwidth())
return 0;
if (*yt<0 || *yt >= window().m_blitheight)
if (*yt<0 || *yt >= window().blitheight())
return 0;
return 1;
}
@ -724,25 +695,26 @@ int sdl_info13::draw(UINT32 dc, int update)
return 0;
}
#if 0
if (m_resize_pending)
{
SDL_SetWindowSize(window().m_sdl_window, m_resize_width, m_resize_height);
SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height);
SDL_GetWindowSize(window().m_sdl_window, &window().width(), &window().height());
m_resize_pending = 0;
SDL_RenderSetViewport(m_renderer, NULL);
SDL_RenderSetViewport(m_sdl_renderer, NULL);
//sdlvideo_monitor_refresh(window().monitor());
}
#endif
//SDL_SelectRenderer(window().sdl_window);
if (m_blittimer > 0)
{
/* SDL Underlays need alpha = 0 ! */
SDL_SetRenderDrawBlendMode(m_renderer, SDL_BLENDMODE_NONE);
SDL_SetRenderDrawBlendMode(m_sdl_renderer, SDL_BLENDMODE_NONE);
//SDL_SetRenderDrawColor(0,0,0,255);
SDL_SetRenderDrawColor(m_renderer, 0,0,0,0);
SDL_RenderFillRect(m_renderer, NULL);
SDL_SetRenderDrawColor(m_sdl_renderer, 0,0,0,0);
SDL_RenderFillRect(m_sdl_renderer, NULL);
m_blittimer--;
}
@ -760,17 +732,17 @@ int sdl_info13::draw(UINT32 dc, int update)
}
else
{
ch = window().m_height;
cw = window().m_width;
ch = window().height();
cw = window().width();
}
if (video_config.centerv)
{
vofs = (ch - window().m_blitheight) / 2.0f;
vofs = (ch - window().blitheight()) / 2.0f;
}
if (video_config.centerh)
{
hofs = (cw - window().m_blitwidth) / 2.0f;
hofs = (cw - window().blitwidth()) / 2.0f;
}
}
@ -792,9 +764,9 @@ int sdl_info13::draw(UINT32 dc, int update)
sb = (int)(255.0f * prim->color.b);
sa = (int)(255.0f * prim->color.a);
SDL_SetRenderDrawBlendMode(m_renderer, map_blendmode(PRIMFLAG_GET_BLENDMODE(prim->flags)));
SDL_SetRenderDrawColor(m_renderer, sr, sg, sb, sa);
SDL_RenderDrawLine(m_renderer, prim->bounds.x0 + hofs, prim->bounds.y0 + vofs,
SDL_SetRenderDrawBlendMode(m_sdl_renderer, map_blendmode(PRIMFLAG_GET_BLENDMODE(prim->flags)));
SDL_SetRenderDrawColor(m_sdl_renderer, sr, sg, sb, sa);
SDL_RenderDrawLine(m_sdl_renderer, prim->bounds.x0 + hofs, prim->bounds.y0 + vofs,
prim->bounds.x1 + hofs, prim->bounds.y1 + vofs);
break;
case render_primitive::QUAD:
@ -814,7 +786,7 @@ int sdl_info13::draw(UINT32 dc, int update)
m_last_blit_pixels = blit_pixels;
m_last_blit_time = -osd_ticks();
SDL_RenderPresent(m_renderer);
SDL_RenderPresent(m_sdl_renderer);
m_last_blit_time += osd_ticks();
return 0;
@ -840,7 +812,7 @@ copy_info_t *texture_info::compute_size_type()
if ((m_is_rotated == bi->blitter->m_is_rot)
&& (m_sdl_blendmode == bi->bm_mask))
{
if (RendererSupportsFormat(m_renderer, bi->dst_fmt, m_sdl_access, bi->dstname))
if (RendererSupportsFormat(m_sdl_renderer, bi->dst_fmt, m_sdl_access, bi->dstname))
{
int perf = bi->perf;
if (perf == 0)
@ -860,7 +832,7 @@ copy_info_t *texture_info::compute_size_type()
{
if ((m_is_rotated == bi->blitter->m_is_rot)
&& (m_sdl_blendmode == bi->bm_mask))
if (RendererSupportsFormat(m_renderer, bi->dst_fmt, m_sdl_access, bi->dstname))
if (RendererSupportsFormat(m_sdl_renderer, bi->dst_fmt, m_sdl_access, bi->dstname))
return bi;
}
//FIXME: crash implement a -do nothing handler */
@ -898,7 +870,7 @@ bool texture_info::matches(const render_primitive &prim, const quad_setup_data &
texture_info::texture_info(SDL_Renderer *renderer, const render_texinfo &texsource, const quad_setup_data &setup, UINT32 flags)
{
// fill in the core data
m_renderer = renderer;
m_sdl_renderer = renderer;
m_hash = texture_compute_hash(texsource, flags);
m_flags = flags;
m_texinfo = texsource;
@ -947,7 +919,7 @@ texture_info::texture_info(SDL_Renderer *renderer, const render_texinfo &texsour
m_copyinfo = compute_size_type();
m_texture_id = SDL_CreateTexture(m_renderer, m_copyinfo->dst_fmt, m_sdl_access,
m_texture_id = SDL_CreateTexture(m_sdl_renderer, m_copyinfo->dst_fmt, m_sdl_access,
m_setup.rotwidth, m_setup.rotheight);
if (!m_texture_id)
@ -1120,7 +1092,7 @@ texture_info * sdl_info13::texture_update(const render_primitive &prim)
// if we didn't find one, create a new texture
if (texture == NULL && prim.texture.base != NULL)
{
texture = global_alloc(texture_info(m_renderer, prim.texture, setup, prim.flags));
texture = global_alloc(texture_info(m_sdl_renderer, prim.texture, setup, prim.flags));
/* add us to the texture list */
m_texlist.prepend(*texture);

View File

@ -76,7 +76,6 @@ public:
sdl_info_bgfx(sdl_window_info *w)
: 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)
{}
@ -101,12 +100,6 @@ public:
float m_last_hofs;
float m_last_vofs;
// resize information
UINT8 m_resize_pending;
UINT32 m_resize_width;
UINT32 m_resize_height;
// Stats
INT64 m_last_blit_time;
INT64 m_last_blit_pixels;
@ -144,76 +137,13 @@ int drawbgfx_init(running_machine &machine, sdl_draw_info *callbacks)
int sdl_info_bgfx::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
*
*/
osd_printf_verbose("Enter drawsdl2_window_create\n");
UINT32 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, extra_flags);
if (window().fullscreen() && video_config.switchres)
{
SDL_DisplayMode mode;
//SDL_GetCurrentDisplayMode(window().monitor()->handle, &mode);
SDL_GetWindowDisplayMode(window().m_sdl_window, &mode);
m_original_mode = mode;
mode.w = width;
mode.h = height;
if (window().m_refresh)
mode.refresh_rate = window().m_refresh;
SDL_SetWindowDisplayMode(window().m_sdl_window, &mode); // Try to set mode
#ifndef SDLMAME_WIN32
/* FIXME: Warp the mouse to 0,0 in case a virtual desktop resolution
* is in place after the mode switch - which will most likely be the case
* This is a hack to work around a deficiency in SDL2
*/
SDL_WarpMouseInWindow(window().m_sdl_window, 1, 1);
#endif
}
else
{
//SDL_SetWindowDisplayMode(window().m_sdl_window, NULL); // Use desktop
}
// create renderer
if (video_config.waitvsync)
m_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
else
m_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_ACCELERATED);
if (!m_renderer)
{
fatalerror("Error on creating renderer: %s\n", SDL_GetError());
}
//SDL_SelectRenderer(window().m_sdl_window);
SDL_ShowWindow(window().m_sdl_window);
//SDL_SetWindowFullscreen(window().window_id, 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);
bgfx::sdlSetWindow(window().m_sdl_window);
bgfx::init();
bgfx::reset(window().m_width, window().m_height, BGFX_RESET_VSYNC);
bgfx::reset(window().width(), window().height(), BGFX_RESET_VSYNC);
// Enable debug text.
bgfx::setDebug(BGFX_DEBUG_STATS);// BGFX_DEBUG_TEXT);
@ -227,13 +157,6 @@ int sdl_info_bgfx::create(int width, int height)
void sdl_info_bgfx::resize(int width, int height)
{
m_resize_pending = 1;
m_resize_height = height;
m_resize_width = width;
window().m_width = width;
window().m_height = height;
m_blittimer = 3;
}
@ -245,9 +168,9 @@ int sdl_info_bgfx::xy_to_render_target(int x, int y, int *xt, int *yt)
{
*xt = x - m_last_hofs;
*yt = y - m_last_vofs;
if (*xt<0 || *xt >= window().m_blitwidth)
if (*xt<0 || *xt >= window().blitwidth())
return 0;
if (*yt<0 || *yt >= window().m_blitheight)
if (*yt<0 || *yt >= window().blitheight())
return 0;
return 1;
}
@ -265,7 +188,7 @@ int sdl_info_bgfx::draw(UINT32 dc, int update)
, 0
);
// Set view 0 default viewport.
bgfx::setViewRect(0, 0, 0, window().m_blitwidth, window().m_blitheight);
bgfx::setViewRect(0, 0, 0, window().blitwidth(), window().blitheight());
// This dummy draw call is here to make sure that view 0 is cleared
// if no other draw calls are submitted to view 0.
@ -298,15 +221,6 @@ void sdl_info_bgfx::destroy()
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);
// Shutdown bgfx.
bgfx::shutdown();
}

View File

@ -58,7 +58,7 @@ typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum m_target);
typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum m_target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers);
typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum m_target, GLuint renderbuffer);
typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum m_target, GLenum internalformat, GLsizei m_width, GLsizei m_height);
typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum m_target, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum m_target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers);
#endif
@ -165,7 +165,7 @@ class texture_info
{
public:
texture_info()
: hash(0), flags(0), rawwidth(0), rawheight(0),
: hash(0), flags(0), rawwidth(0), rawheight(0),
rawwidth_create(0), rawheight_create(0),
type(0), format(0), borderpix(0), xprescale(0), yprescale(0), nocopy(0),
texture(0), texTarget(0), texpow2(0), mpass_dest_idx(0), pbo(0), data(NULL),
@ -223,6 +223,7 @@ class sdl_info_ogl : public osd_renderer
public:
sdl_info_ogl(sdl_window_info *window)
: osd_renderer(window, FLAG_NEEDS_OPENGL), m_blittimer(0),
m_screen_width(0), m_screen_height(0),
#if (SDLMAME_SDL2)
m_gl_context_id(0),
#else
@ -277,6 +278,8 @@ public:
void texture_all_disable();
INT32 m_blittimer;
int m_screen_width;
int m_screen_height;
#if (SDLMAME_SDL2)
SDL_GLContext m_gl_context_id;
@ -712,7 +715,7 @@ int sdl_info_ogl::create(int width, int height)
#if (SDLMAME_SDL2)
// create renderer
m_gl_context_id = SDL_GL_CreateContext(window().m_sdl_window);
m_gl_context_id = SDL_GL_CreateContext(window().sdl_window());
if (!m_gl_context_id)
{
osd_printf_error("OpenGL not supported on this driver: %s\n", SDL_GetError());
@ -724,6 +727,9 @@ int sdl_info_ogl::create(int width, int height)
#else
#endif
m_screen_width = 0;
m_screen_height = 0;
m_blittimer = 0;
m_surf_w = 0;
m_surf_h = 0;
@ -755,21 +761,9 @@ int sdl_info_ogl::create(int width, int height)
void sdl_info_ogl::resize(int width, int height)
{
#if (SDLMAME_SDL2)
//SDL_GL_MakeCurrent(window().sdl_window, gl_context_id);
SDL_SetWindowSize(window().m_sdl_window, width, height);
SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height);
m_blittimer = 3;
#else
SDL_FreeSurface(window().m_sdlsurf);
window().m_sdlsurf = SDL_SetVideoMode(width, height, 0,
SDL_SWSURFACE | SDL_ANYFORMAT | window().m_extra_flags);
window().m_width = window().m_sdlsurf->w;
window().m_height = window().m_sdlsurf->h;
#endif
m_init_context = 1;
}
@ -785,23 +779,9 @@ void sdl_info_ogl::destroy()
destroy_all_textures();
#if (SDLMAME_SDL2)
if (check_flag(FLAG_NEEDS_OPENGL))
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, &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 (window().m_sdlsurf)
{
SDL_FreeSurface(window().m_sdlsurf);
window().m_sdlsurf = NULL;
}
SDL_GL_DeleteContext(m_gl_context_id);
#endif
}
//============================================================
@ -823,9 +803,9 @@ int sdl_info_ogl::xy_to_render_target(int x, int y, int *xt, int *yt)
*xt = x - m_last_hofs;
*yt = y - m_last_vofs;
if (*xt<0 || *xt >= window().m_blitwidth)
if (*xt<0 || *xt >= window().blitwidth())
return 0;
if (*yt<0 || *yt >= window().m_blitheight)
if (*yt<0 || *yt >= window().blitheight())
return 0;
return 1;
}
@ -844,7 +824,7 @@ void sdl_info_ogl::destroy_all_textures()
return;
#if (SDLMAME_SDL2)
SDL_GL_MakeCurrent(window().m_sdl_window, m_gl_context_id);
SDL_GL_MakeCurrent(window().sdl_window(), m_gl_context_id);
#endif
if(window().m_primlist)
@ -1132,7 +1112,7 @@ void sdl_info_ogl::loadGLExtensions()
if ( m_useglsl )
{
if ( window().m_prescale != 1 )
if ( window().prescale() != 1 )
{
m_useglsl = 0;
if (_once)
@ -1242,7 +1222,7 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
}
#if (SDLMAME_SDL2)
SDL_GL_MakeCurrent(window().m_sdl_window, m_gl_context_id);
SDL_GL_MakeCurrent(window().sdl_window(), m_gl_context_id);
#else
if (!m_init_context)
{
@ -1251,10 +1231,10 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
{
if (window().index() == 0)
{
if ((screen->width() != window().m_screen_width) || (screen->height() != window().m_screen_height))
if ((screen->width() != m_screen_width) || (screen->height() != m_screen_height))
{
window().m_screen_width = screen->width();
window().m_screen_height = screen->height();
m_screen_width = screen->width();
m_screen_height = screen->height();
// force all textures to be regenerated
destroy_all_textures();
@ -1305,15 +1285,15 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
}
if ( !m_initialized ||
window().m_width!= m_surf_w || window().m_height!= m_surf_h )
window().width()!= m_surf_w || window().height()!= m_surf_h )
{
if ( !m_initialized )
{
loadGLExtensions();
}
m_surf_w=window().m_width;
m_surf_h=window().m_height;
m_surf_w=window().width();
m_surf_h=window().height();
// we're doing nothing 3d, so the Z-buffer is currently not interesting
glDisable(GL_DEPTH_TEST);
@ -1354,10 +1334,10 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
// |_________|
// (0,h) (w,h)
glViewport(0.0, 0.0, (GLsizei)window().m_width, (GLsizei)window().m_height);
glViewport(0.0, 0.0, (GLsizei)window().width(), (GLsizei)window().height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble)window().m_width, (GLdouble)window().m_height, 0.0, 0.0, -1.0);
glOrtho(0.0, (GLdouble)window().width(), (GLdouble)window().height(), 0.0, 0.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
@ -1384,17 +1364,17 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
}
else
{
ch = window().m_height;
cw = window().m_width;
ch = window().height();
cw = window().width();
}
if (video_config.centerv)
{
vofs = (ch - window().m_blitheight) / 2.0f;
vofs = (ch - window().blitheight()) / 2.0f;
}
if (video_config.centerh)
{
hofs = (cw - window().m_blitwidth) / 2.0f;
hofs = (cw - window().blitwidth()) / 2.0f;
}
}
@ -1470,7 +1450,7 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
set_blendmode(sdl, PRIMFLAG_GET_BLENDMODE(prim->flags));
// compute the effective width based on the direction of the line
effwidth = prim->m_width;
effwidth = prim->width();
if (effwidth < 0.5f)
effwidth = 0.5f;
@ -1575,12 +1555,12 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
// 1:1 tex coord CCW (0/0) (1/0) (1/1) (0/1) on texture dimensions
m_texVerticex[0]=(GLfloat)0.0;
m_texVerticex[1]=(GLfloat)0.0;
m_texVerticex[2]=(GLfloat)window().m_width;
m_texVerticex[2]=(GLfloat)window().width();
m_texVerticex[3]=(GLfloat)0.0;
m_texVerticex[4]=(GLfloat)window().m_width;
m_texVerticex[5]=(GLfloat)window().m_height;
m_texVerticex[4]=(GLfloat)window().width();
m_texVerticex[5]=(GLfloat)window().height();
m_texVerticex[6]=(GLfloat)0.0;
m_texVerticex[7]=(GLfloat)window().m_height;
m_texVerticex[7]=(GLfloat)window().height();
}
if(i>0) // first fetch already done
@ -1626,7 +1606,7 @@ int sdl_info_ogl::draw(UINT32 dc, int update)
#if (!SDLMAME_SDL2)
SDL_GL_SwapBuffers();
#else
SDL_GL_SwapWindow(window().m_sdl_window);
SDL_GL_SwapWindow(window().sdl_window());
#endif
return 0;
}
@ -1784,8 +1764,8 @@ void sdl_info_ogl::texture_compute_size_subroutine(texture_info *texture, UINT32
texture->xprescale--;
while (texture->yprescale > 1 && height_create * texture->yprescale > m_texture_max_height)
texture->yprescale--;
if (PRIMFLAG_GET_SCREENTEX(flags) && (texture->xprescale != window().m_prescale || texture->yprescale != window().m_prescale))
osd_printf_warning("SDL: adjusting prescale from %dx%d to %dx%d\n", window().m_prescale, window().m_prescale, texture->xprescale, texture->yprescale);
if (PRIMFLAG_GET_SCREENTEX(flags) && (texture->xprescale != window().prescale() || texture->yprescale != window().prescale()))
osd_printf_warning("SDL: adjusting prescale from %dx%d to %dx%d\n", window().prescale(), window().prescale(), texture->xprescale, texture->yprescale);
width *= texture->xprescale;
height *= texture->yprescale;
@ -1964,8 +1944,8 @@ int sdl_info_ogl::texture_shader_create(const render_texinfo *texsource, texture
{
int uniform_location;
int i;
int surf_w_pow2 = get_valid_pow2_value (window().m_blitwidth, texture->texpow2);
int surf_h_pow2 = get_valid_pow2_value (window().m_blitheight, texture->texpow2);
int surf_w_pow2 = get_valid_pow2_value (window().blitwidth(), texture->texpow2);
int surf_h_pow2 = get_valid_pow2_value (window().blitheight(), texture->texpow2);
assert ( texture->type==TEXTURE_TYPE_SHADER );
@ -2012,7 +1992,7 @@ int sdl_info_ogl::texture_shader_create(const render_texinfo *texsource, texture
pfn_glUniform2fvARB(uniform_location, 1, &(color_texture_pow2_sz[0]));
GL_CHECK_ERROR_NORMAL();
GLfloat screen_texture_sz[2] = { (GLfloat)window().m_blitwidth, (GLfloat)window().m_blitheight };
GLfloat screen_texture_sz[2] = { (GLfloat)window().blitwidth(), (GLfloat)window().blitheight() };
uniform_location = pfn_glGetUniformLocationARB(m_glsl_program[i], "screen_texture_sz");
pfn_glUniform2fvARB(uniform_location, 1, &(screen_texture_sz[0]));
GL_CHECK_ERROR_NORMAL();
@ -2068,7 +2048,7 @@ int sdl_info_ogl::texture_shader_create(const render_texinfo *texsource, texture
}
osd_printf_verbose("GL texture: mpass screen-bmp 2x %dx%d (pow2 %dx%d)\n",
window().m_width, window().m_height, surf_w_pow2, surf_h_pow2);
window().width(), window().height(), surf_w_pow2, surf_h_pow2);
}
// GL_TEXTURE0
@ -2147,8 +2127,8 @@ texture_info *sdl_info_ogl::texture_create(const render_texinfo *texsource, UINT
texture->texinfo.seqid = -1; // force set data
if (PRIMFLAG_GET_SCREENTEX(flags))
{
texture->xprescale = window().m_prescale;
texture->yprescale = window().m_prescale;
texture->xprescale = window().prescale();
texture->yprescale = window().prescale();
}
else
{
@ -2778,11 +2758,11 @@ void sdl_info_ogl::texture_coord_update(texture_info *texture, const render_prim
}
else if ( texture->type == TEXTURE_TYPE_SHADER && shaderIdx>m_glsl_program_mb2sc )
{
int surf_w_pow2 = get_valid_pow2_value (window().m_width, texture->texpow2);
int surf_h_pow2 = get_valid_pow2_value (window().m_height, texture->texpow2);
int surf_w_pow2 = get_valid_pow2_value (window().width(), texture->texpow2);
int surf_h_pow2 = get_valid_pow2_value (window().height(), texture->texpow2);
ustop = (float)(window().m_width) / (float)surf_w_pow2;
vstop = (float)(window().m_height) / (float)surf_h_pow2;
ustop = (float)(window().width()) / (float)surf_w_pow2;
vstop = (float)(window().height()) / (float)surf_h_pow2;
}
else
{

View File

@ -52,8 +52,6 @@ public:
sdl_info(sdl_window_info *w, int extra_flags)
: osd_renderer(w, extra_flags),
m_blittimer(0),
#if (SDLMAME_SDL2)
m_sdl_renderer(NULL),
m_texture_id(NULL),
@ -216,12 +214,11 @@ int drawsdl_scale_mode(const char *s)
static osd_renderer *drawsdl_create(sdl_window_info *window)
{
const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
// FIXME: QUALITY HINTS
#if (SDLMAME_SDL2)
return global_alloc(sdl_info(window, osd_renderer::FLAG_NONE));
#else
const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
return global_alloc(sdl_info(window, sm->m_extra_flags));
#endif
}
@ -279,7 +276,7 @@ void sdl_info::setup_texture(int tempwidth, int tempheight)
int m_hw_scale_width =0;
int m_hw_scale_height = 0;
window().m_target->compute_minimum_size(m_hw_scale_width, m_hw_scale_height);
window().target()->compute_minimum_size(m_hw_scale_width, m_hw_scale_height);
if (video_config.prescale)
{
m_hw_scale_width *= video_config.prescale;
@ -315,7 +312,7 @@ void sdl_info::yuv_overlay_init()
const sdl_scale_mode *sdl_sm = &scale_modes[video_config.scale_mode];
int minimum_width, minimum_height;
window().m_target->compute_minimum_size(minimum_width, minimum_height);
window().target()->compute_minimum_size(minimum_width, minimum_height);
if (video_config.prescale)
{
@ -339,7 +336,7 @@ void sdl_info::yuv_overlay_init()
m_yuv_bitmap = global_alloc_array(UINT16, minimum_width*minimum_height);
m_yuvsurf = SDL_CreateYUVOverlay(minimum_width * sdl_sm->mult_w, minimum_height * sdl_sm->mult_h,
sdl_sm->pixel_format, window().m_sdlsurf);
sdl_sm->pixel_format, window().sdl_surface());
if ( m_yuvsurf == NULL ) {
osd_printf_error("SDL: Couldn't create SDL_yuv_overlay: %s\n", SDL_GetError());
@ -421,9 +418,9 @@ static void drawsdl_show_info(struct SDL_RendererInfo *render_info)
int sdl_info::create(int width, int height)
{
const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
#if (SDLMAME_SDL2)
const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
// create renderer
@ -432,9 +429,9 @@ int sdl_info::create(int width, int height)
if (video_config.waitvsync)
m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
m_sdl_renderer = SDL_CreateRenderer(window().sdl_window(), -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
else
m_sdl_renderer = SDL_CreateRenderer(window().m_sdl_window, -1, SDL_RENDERER_ACCELERATED);
m_sdl_renderer = SDL_CreateRenderer(window().sdl_window(), -1, SDL_RENDERER_ACCELERATED);
if (!m_sdl_renderer)
{
@ -483,32 +480,14 @@ int sdl_info::create(int width, int height)
void sdl_info::resize(int width, int height)
{
#if (!SDLMAME_SDL2)
const sdl_scale_mode *sdl_sm = &scale_modes[video_config.scale_mode];
#endif
#if (SDLMAME_SDL2)
SDL_SetWindowSize(window().m_sdl_window, width, height);
SDL_GetWindowSize(window().m_sdl_window, &window().m_width, &window().m_height);
SDL_RenderSetViewport(m_sdl_renderer, NULL);
#else
if (m_yuvsurf != NULL)
{
SDL_FreeYUVOverlay(m_yuvsurf);
m_yuvsurf = NULL;
}
SDL_FreeSurface(window().m_sdlsurf);
window().m_sdlsurf = SDL_SetVideoMode(width, height, 0,
SDL_SWSURFACE | SDL_ANYFORMAT | window().m_extra_flags);
window().m_width = window().m_sdlsurf->w;
window().m_height = window().m_sdlsurf->h;
if (sdl_sm->is_yuv)
const sdl_scale_mode *sdl_sm = &scale_modes[video_config.scale_mode];
if (sdl_sm->is_yuv)
{
yuv_overlay_init();
}
#endif
}
@ -520,33 +499,10 @@ void sdl_info::resize(int width, int height)
void sdl_info::destroy()
{
#if (SDLMAME_SDL2)
//SDL_SelectRenderer(window().sdl_window);
SDL_DestroyTexture(m_texture_id);
//SDL_DestroyRenderer(window().sdl_window);
if (window().fullscreen() && video_config.switchres)
{
SDL_SetWindowFullscreen(window().m_sdl_window, 0); // Try to set mode
SDL_SetWindowDisplayMode(window().m_sdl_window, &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_yuvsurf != NULL)
{
SDL_FreeYUVOverlay(m_yuvsurf);
m_yuvsurf = NULL;
}
if (window().m_sdlsurf)
{
SDL_FreeSurface(window().m_sdlsurf);
window().m_sdlsurf = NULL;
}
#endif
// free the memory in the window
destroy_all_textures();
if (m_yuv_lookup != NULL)
{
global_free_array(m_yuv_lookup);
@ -577,9 +533,9 @@ int sdl_info::xy_to_render_target(int x, int y, int *xt, int *yt)
{
*xt = x - m_last_hofs;
*yt = y - m_last_vofs;
if (*xt<0 || *xt >= window().m_blitwidth)
if (*xt<0 || *xt >= window().blitwidth())
return 0;
if (*yt<0 || *yt >= window().m_blitheight)
if (*yt<0 || *yt >= window().blitheight())
return 0;
return 1;
}
@ -590,7 +546,16 @@ int sdl_info::xy_to_render_target(int x, int y, int *xt, int *yt)
void sdl_info::destroy_all_textures()
{
/* nothing to be done in soft mode */
#if (SDLMAME_SDL2)
SDL_DestroyTexture(m_texture_id);
m_texture_id = NULL;
#else
if (m_yuvsurf != NULL)
{
SDL_FreeYUVOverlay(m_yuvsurf);
m_yuvsurf = NULL;
}
#endif
}
@ -618,29 +583,29 @@ int sdl_info::draw(UINT32 dc, int update)
// lock it if we need it
#if (!SDLMAME_SDL2)
pitch = window().m_sdlsurf->pitch;
bpp = window().m_sdlsurf->format->BytesPerPixel;
rmask = window().m_sdlsurf->format->Rmask;
gmask = window().m_sdlsurf->format->Gmask;
bmask = window().m_sdlsurf->format->Bmask;
pitch = window().sdl_surface()->pitch;
bpp = window().sdl_surface()->format->BytesPerPixel;
rmask = window().sdl_surface()->format->Rmask;
gmask = window().sdl_surface()->format->Gmask;
bmask = window().sdl_surface()->format->Bmask;
// amask = sdlsurf->format->Amask;
if (window().m_blitwidth != m_old_blitwidth || window().m_blitheight != m_old_blitheight)
if (window().blitwidth() != m_old_blitwidth || window().blitheight() != m_old_blitheight)
{
if (sm->is_yuv)
yuv_overlay_init();
m_old_blitwidth = window().m_blitwidth;
m_old_blitheight = window().m_blitheight;
m_old_blitwidth = window().blitwidth();
m_old_blitheight = window().blitheight();
m_blittimer = 3;
}
if (SDL_MUSTLOCK(window().m_sdlsurf))
SDL_LockSurface(window().m_sdlsurf);
if (SDL_MUSTLOCK(window().sdl_surface()))
SDL_LockSurface(window().sdl_surface());
// Clear if necessary
if (m_blittimer > 0)
{
memset(window().m_sdlsurf->pixels, 0, window().m_height * window().m_sdlsurf->pitch);
memset(window().sdl_surface()->pixels, 0, window().height() * window().sdl_surface()->pitch);
m_blittimer--;
}
@ -658,18 +623,19 @@ int sdl_info::draw(UINT32 dc, int update)
#endif
}
else
surfptr = (UINT8 *)window().m_sdlsurf->pixels;
surfptr = (UINT8 *)window().sdl_surface()->pixels;
#else
//SDL_SelectRenderer(window().sdl_window);
if (window().m_blitwidth != m_old_blitwidth || window().m_blitheight != m_old_blitheight)
if (window().blitwidth() != m_old_blitwidth || window().blitheight() != m_old_blitheight)
{
SDL_RenderSetViewport(m_sdl_renderer, NULL);
//SDL_RenderSetViewport(m_sdl_renderer, NULL);
SDL_DestroyTexture(m_texture_id);
setup_texture(window().m_blitwidth, window().m_blitheight);
m_old_blitwidth = window().m_blitwidth;
m_old_blitheight = window().m_blitheight;
if (m_texture_id != NULL)
SDL_DestroyTexture(m_texture_id);
setup_texture(window().blitwidth(), window().blitheight());
m_old_blitwidth = window().blitwidth();
m_old_blitheight = window().blitheight();
m_blittimer = 3;
}
@ -697,8 +663,8 @@ int sdl_info::draw(UINT32 dc, int update)
#endif
// get ready to center the image
vofs = hofs = 0;
blitwidth = window().m_blitwidth;
blitheight = window().m_blitheight;
blitwidth = window().blitwidth();
blitheight = window().blitheight();
// figure out what coordinate system to use for centering - in window mode it's always the
// SDL surface size. in fullscreen the surface covers all monitors, so center according to
@ -710,8 +676,8 @@ int sdl_info::draw(UINT32 dc, int update)
}
else
{
ch = window().m_height;
cw = window().m_width;
ch = window().height();
cw = window().width();
}
// do not crash if the window's smaller than the blit area
@ -721,7 +687,7 @@ int sdl_info::draw(UINT32 dc, int update)
}
else if (video_config.centerv)
{
vofs = (ch - window().m_blitheight) / 2;
vofs = (ch - window().blitheight()) / 2;
}
if (blitwidth > cw)
@ -730,7 +696,7 @@ int sdl_info::draw(UINT32 dc, int update)
}
else if (video_config.centerh)
{
hofs = (cw - window().m_blitwidth) / 2;
hofs = (cw - window().blitwidth()) / 2;
}
m_last_hofs = hofs;
@ -744,8 +710,8 @@ int sdl_info::draw(UINT32 dc, int update)
if (!sm->is_yuv)
{
surfptr += ((vofs * pitch) + (hofs * bpp));
mamewidth = blitwidth; //m_sdlsurf->w;
mameheight = blitheight; //m_sdlsurf->h;
mamewidth = blitwidth; //sdl_surface()->w;
mameheight = blitheight; //sdl_surface()->h;
}
else
{
@ -770,10 +736,10 @@ int sdl_info::draw(UINT32 dc, int update)
for (render_primitive *prim = window().m_primlist->first(); prim != NULL; prim = prim->next())
{
prim->bounds.x0 *= fw;
prim->bounds.x1 *= fw;
prim->bounds.y0 *= fh;
prim->bounds.y1 *= fh;
prim->bounds.x0 = floor(fw * prim->bounds.x0 + 0.5f);
prim->bounds.x1 = floor(fw * prim->bounds.x1 + 0.5f);
prim->bounds.y0 = floor(fh * prim->bounds.y0 + 0.5f);
prim->bounds.y1 = floor(fh * prim->bounds.y1 + 0.5f);
}
// render to it
@ -818,10 +784,10 @@ int sdl_info::draw(UINT32 dc, int update)
// unlock and flip
#if (!SDLMAME_SDL2)
if (SDL_MUSTLOCK(window().m_sdlsurf)) SDL_UnlockSurface(window().m_sdlsurf);
if (SDL_MUSTLOCK(window().sdl_surface())) SDL_UnlockSurface(window().sdl_surface());
if (!sm->is_yuv)
{
SDL_Flip(window().m_sdlsurf);
SDL_Flip(window().sdl_surface());
}
else
{

View File

@ -1547,7 +1547,7 @@ INLINE sdl_window_info * window_from_id(Uint32 windowID)
for (w = sdl_window_list; w != NULL; w = w->m_next)
{
//printf("w->window_id: %d\n", w->window_id);
if (w->m_sdl_window == window)
if (w->sdl_window() == window)
{
return w;
}
@ -1760,9 +1760,9 @@ void sdlinput_poll(running_machine &machine)
devinfo->keyboard.state[OSD_SDL_INDEX_KEYSYM(&event.key.keysym)] = 0x80;
#if (SDLMAME_SDL2)
if (event.key.keysym.sym < 0x20)
ui_input_push_char_event(machine, sdl_window_list->m_target, event.key.keysym.sym);
ui_input_push_char_event(machine, sdl_window_list->target(), event.key.keysym.sym);
#else
ui_input_push_char_event(machine, sdl_window_list->m_target, (unicode_char) event.key.keysym.unicode);
ui_input_push_char_event(machine, sdl_window_list->target(), (unicode_char) event.key.keysym.unicode);
#endif
break;
case SDL_KEYUP:
@ -1864,14 +1864,14 @@ void sdlinput_poll(running_machine &machine)
sdl_window_info *window = GET_FOCUS_WINDOW(&event.button);
if (window != NULL && window->xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
{
ui_input_push_mouse_down_event(machine, window->m_target, cx, cy);
ui_input_push_mouse_down_event(machine, window->target(), cx, cy);
// FIXME Parameter ?
if ((click-last_click < 250)
&& (cx >= last_x - 4 && cx <= last_x + 4)
&& (cy >= last_y - 4 && cy <= last_y + 4) )
{
last_click = 0;
ui_input_push_mouse_double_click_event(machine, window->m_target, cx, cy);
ui_input_push_mouse_double_click_event(machine, window->target(), cx, cy);
}
else
{
@ -1898,7 +1898,7 @@ void sdlinput_poll(running_machine &machine)
if (window != NULL && window->xy_to_render_target(event.button.x,event.button.y, &cx, &cy) )
{
ui_input_push_mouse_up_event(machine, window->m_target, cx, cy);
ui_input_push_mouse_up_event(machine, window->target(), cx, cy);
}
}
break;
@ -1922,7 +1922,7 @@ void sdlinput_poll(running_machine &machine)
sdl_window_info *window = GET_FOCUS_WINDOW(&event.motion);
if (window != NULL && window->xy_to_render_target(event.motion.x, event.motion.y, &cx, &cy) )
ui_input_push_mouse_move_event(machine, window->m_target, cx, cy);
ui_input_push_mouse_move_event(machine, window->target(), cx, cy);
}
break;
case SDL_JOYBALLMOTION:
@ -1937,7 +1937,7 @@ void sdlinput_poll(running_machine &machine)
if (!event.active.gain)
{
sdl_window_info *window = GET_FOCUS_WINDOW(&event.motion);
ui_input_push_mouse_leave_event(machine, window->m_target);
ui_input_push_mouse_leave_event(machine, window->target());
}
break;
case SDL_QUIT:
@ -1956,7 +1956,7 @@ void sdlinput_poll(running_machine &machine)
if (window != NULL )
{
osd_uchar_from_osdchar(&result, event.text.text, 1);
ui_input_push_char_event(machine, window->m_target, result);
ui_input_push_char_event(machine, window->target(), result);
}
}
break;
@ -1973,7 +1973,7 @@ void sdlinput_poll(running_machine &machine)
machine.schedule_exit();
break;
case SDL_WINDOWEVENT_LEAVE:
ui_input_push_mouse_leave_event(machine, window->m_target);
ui_input_push_mouse_leave_event(machine, window->target());
app_has_mouse_focus = 0;
break;
case SDL_WINDOWEVENT_MOVED:
@ -1997,7 +1997,7 @@ void sdlinput_poll(running_machine &machine)
#endif
{
//printf("event data1,data2 %d x %d %ld\n", event.window.data1, event.window.data2, sizeof(SDL_Event));
if (event.window.data1 != window->m_width || event.window.data2 != window->m_height)
if (event.window.data1 != window->width() || event.window.data2 != window->height())
window->window_resize(event.window.data1, event.window.data2);
}
}

View File

@ -113,7 +113,11 @@ bool sdl_osd_interface::video_init()
sdl_window_config conf;
memset(&conf, 0, sizeof(conf));
get_resolution(options().resolution(), options().resolution(index), &conf, TRUE);
if (sdlwindow_video_window_create(machine(), index, sdl_monitor_info::pick_monitor(options(), index), &conf))
// create window ...
sdl_window_info *win = global_alloc(sdl_window_info(machine(), index, sdl_monitor_info::pick_monitor(options(), index), &conf));
if (win->window_init())
return false;
}

View File

@ -142,8 +142,6 @@ private:
static void sdlwindow_update_cursor_state(running_machine &machine, sdl_window_info *window);
static void sdlwindow_sync(void);
static void set_starting_view(running_machine &machine, int index, sdl_window_info *window, const char *defview, const char *view);
//============================================================
// execute_async
//============================================================
@ -480,13 +478,30 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_resize_wt )
{
worker_param * wp = (worker_param *) param;
sdl_window_info * window = wp->window();
int width = wp->new_width();
int height = wp->new_height();
ASSERT_WINDOW_THREAD();
window->renderer().destroy_all_textures();
window->renderer().resize(wp->new_width(), wp->new_height());
window->blit_surface_size(wp->new_width(), wp->new_height());
#if (SDLMAME_SDL2)
SDL_SetWindowSize(window->sdl_window(), width, height);
SDL_GetWindowSize(window->sdl_window(), &window->m_width, &window->m_height);
#else
SDL_FreeSurface(window->m_sdlsurf);
window->m_sdlsurf = SDL_SetVideoMode(width, height, 0,
SDL_SWSURFACE | SDL_ANYFORMAT | window->m_extra_flags);
window->m_width = window->m_sdlsurf->w;
window->m_height = window->m_sdlsurf->h;
#endif
window->renderer().resize(window->m_width, window->m_height);
window->blit_surface_size(window->m_width, window->m_height);
window->window_clear();
@ -498,7 +513,7 @@ void sdl_window_info::window_resize(INT32 width, INT32 height)
{
ASSERT_MAIN_THREAD();
if (width == this->m_width && height == this->m_height)
if (width == this->width() && height == this->height())
return;
execute_async_wait(&sdlwindow_resize_wt, worker_param(this, width, height));
@ -554,11 +569,29 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt )
// If we are going fullscreen (leaving windowed) remember our windowed size
if (!window->fullscreen())
{
window->m_windowed_width = window->m_width;
window->m_windowed_height = window->m_height;
window->m_windowed_width = window->width();
window->m_windowed_height = window->height();
}
window->renderer().destroy();
#if (SDLMAME_SDL2)
if (window->fullscreen() && video_config.switchres)
{
SDL_SetWindowFullscreen(window->sdl_window(), 0); // Try to set mode
SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode); // Try to set mode
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(wp->machine());
// toggle the window mode
@ -591,14 +624,14 @@ OSDWORK_CALLBACK( sdl_window_info::destroy_all_textures_wt )
void sdl_window_info::modify_prescale(running_machine &machine, int dir)
{
worker_param wp = worker_param(machine, this);
int new_prescale = m_prescale;
int new_prescale = prescale();
if (dir > 0 && m_prescale < 3)
new_prescale = m_prescale + 1;
if (dir < 0 && m_prescale > 1)
new_prescale = m_prescale - 1;
if (dir > 0 && prescale() < 3)
new_prescale = prescale() + 1;
if (dir < 0 && prescale() > 1)
new_prescale = prescale() - 1;
if (new_prescale != m_prescale)
if (new_prescale != prescale())
{
if (m_fullscreen && video_config.switchres)
{
@ -614,7 +647,7 @@ void sdl_window_info::modify_prescale(running_machine &machine, int dir)
execute_async_wait(destroy_all_textures_wt, wp);
m_prescale = new_prescale;
}
machine.ui().popup_time(1, "Prescale %d", m_prescale);
machine.ui().popup_time(1, "Prescale %d", prescale());
}
}
@ -645,15 +678,15 @@ static void sdlwindow_update_cursor_state(running_machine &machine, sdl_window_i
if (!window->fullscreen() && !sdlinput_should_hide_mouse(machine))
{
SDL_ShowCursor(SDL_ENABLE);
if (SDL_GetWindowGrab(window->m_sdl_window ))
SDL_SetWindowGrab(window->m_sdl_window, SDL_FALSE);
if (SDL_GetWindowGrab(window->sdl_window() ))
SDL_SetWindowGrab(window->sdl_window(), SDL_FALSE);
SDL_SetRelativeMouseMode(SDL_FALSE);
}
else
{
SDL_ShowCursor(SDL_DISABLE);
if (!SDL_GetWindowGrab(window->m_sdl_window))
SDL_SetWindowGrab(window->m_sdl_window, SDL_TRUE);
if (!SDL_GetWindowGrab(window->sdl_window()))
SDL_SetWindowGrab(window->sdl_window(), SDL_TRUE);
SDL_SetRelativeMouseMode(SDL_TRUE);
}
SDL_SetCursor(NULL); // Force an update in case the underlying driver has changed visibility
@ -706,44 +739,40 @@ int sdl_window_info::xy_to_render_target(int x, int y, int *xt, int *yt)
// (main thread)
//============================================================
int sdlwindow_video_window_create(running_machine &machine, int index, sdl_monitor_info *monitor, const sdl_window_config *config)
int sdl_window_info::window_init()
{
sdl_window_info *window;
worker_param *wp = (worker_param *) osd_malloc(sizeof(worker_param));
int result;
ASSERT_MAIN_THREAD();
// allocate a new window object
window = global_alloc(sdl_window_info(&machine, monitor, index, config));
// set the initial maximized state
// FIXME: Does not belong here
sdl_options &options = downcast<sdl_options &>(machine.options());
window->m_startmaximized = options.maximize();
sdl_options &options = downcast<sdl_options &>(m_machine.options());
m_startmaximized = options.maximize();
// add us to the list
*last_window_ptr = window;
last_window_ptr = &window->m_next;
*last_window_ptr = this;
last_window_ptr = &this->m_next;
window->set_renderer(draw.create(window));
set_renderer(draw.create(this));
// create an event that we can use to skip blitting
window->m_rendered_event = osd_event_alloc(FALSE, TRUE);
m_rendered_event = osd_event_alloc(FALSE, TRUE);
// load the layout
window->m_target = machine.render().target_alloc();
m_target = m_machine.render().target_alloc();
// set the specific view
set_starting_view(machine, index, window, options.view(), options.view(index));
set_starting_view(m_machine, m_index, options.view(), options.view(m_index));
// make the window title
if (video_config.numscreens == 1)
sprintf(window->m_title, "%s: %s [%s]", emulator_info::get_appname(), machine.system().description, machine.system().name);
sprintf(m_title, "%s: %s [%s]", emulator_info::get_appname(), m_machine.system().description, m_machine.system().name);
else
sprintf(window->m_title, "%s: %s [%s] - Screen %d", emulator_info::get_appname(), machine.system().description, machine.system().name, index);
sprintf(m_title, "%s: %s [%s] - Screen %d", emulator_info::get_appname(), m_machine.system().description, m_machine.system().name, m_index);
wp->set_window(window);
wp->set_window(this);
// FIXME: pass error back in a different way
if (multithreading_enabled)
@ -765,9 +794,8 @@ int sdlwindow_video_window_create(running_machine &machine, int index, sdl_monit
return 0;
error:
window->video_window_destroy(machine);
video_window_destroy(m_machine);
// free the window itself
global_free(window);
return 1;
}
@ -787,6 +815,22 @@ 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
SDL_SetWindowDisplayMode(window->sdl_window(), &window->m_original_mode); // Try to set mode
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(wp->machine());
@ -843,8 +887,8 @@ void sdl_window_info::pick_best_mode(int *fswidth, int *fsheight)
m_target->compute_minimum_size(minimum_width, minimum_height);
// use those as the target for now
target_width = minimum_width * MAX(1, m_prescale);
target_height = minimum_height * MAX(1, m_prescale);
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
{
@ -910,8 +954,8 @@ void sdl_window_info::pick_best_mode(int *fswidth, int *fsheight)
m_target->compute_minimum_size(minimum_width, minimum_height);
// use those as the target for now
target_width = minimum_width * MAX(1, m_prescale);
target_height = minimum_height * MAX(1, m_prescale);
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
{
@ -1003,7 +1047,7 @@ void sdl_window_info::video_window_update(running_machine &machine)
if (!this->m_fullscreen)
{
blit_surface_size(m_width, m_height);
blit_surface_size(width(), height());
//Don't resize window without user interaction;
//window_resize(blitwidth, blitheight);
}
@ -1049,7 +1093,7 @@ void sdl_window_info::video_window_update(running_machine &machine)
// (main thread)
//============================================================
static void set_starting_view(running_machine &machine, int index, sdl_window_info *window, const char *defview, const char *view)
void sdl_window_info::set_starting_view(running_machine &machine, int index, const char *defview, const char *view)
{
int viewindex;
@ -1060,11 +1104,11 @@ static void set_starting_view(running_machine &machine, int index, sdl_window_in
view = defview;
// query the video system to help us pick a view
viewindex = window->m_target->configured_view(view, index, video_config.numscreens);
viewindex = target()->configured_view(view, index, video_config.numscreens);
// set the view
window->m_target->set_view(viewindex);
window->m_start_viewscreen=viewindex;
target()->set_view(viewindex);
m_start_viewscreen=viewindex;
}
@ -1160,7 +1204,7 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt )
window->m_sdl_window = SDL_CreateWindow(window->m_title,
window->monitor()->position_size().x, window->monitor()->position_size().y,
tempwidth, tempheight, window->m_extra_flags);
//window().m_sdl_window = SDL_CreateWindow(window().m_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
//window().sdl_window() = SDL_CreateWindow(window().m_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
// width, height, m_extra_flags);
if ( window->m_sdl_window == NULL )
@ -1176,34 +1220,34 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt )
{
SDL_DisplayMode mode;
//SDL_GetCurrentDisplayMode(window().monitor()->handle, &mode);
SDL_GetWindowDisplayMode(window->m_sdl_window, &mode);
SDL_GetWindowDisplayMode(window->sdl_window(), &mode);
window->m_original_mode = mode;
mode.w = tempwidth;
mode.h = tempheight;
if (window->m_refresh)
mode.refresh_rate = window->m_refresh;
SDL_SetWindowDisplayMode(window->m_sdl_window, &mode); // Try to set mode
SDL_SetWindowDisplayMode(window->sdl_window(), &mode); // Try to set mode
#ifndef SDLMAME_WIN32
/* FIXME: Warp the mouse to 0,0 in case a virtual desktop resolution
* is in place after the mode switch - which will most likely be the case
* This is a hack to work around a deficiency in SDL2
*/
SDL_WarpMouseInWindow(window->m_sdl_window, 1, 1);
SDL_WarpMouseInWindow(window->sdl_window(), 1, 1);
#endif
}
else
{
//SDL_SetWindowDisplayMode(window().m_sdl_window, NULL); // Use desktop
//SDL_SetWindowDisplayMode(window().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_ShowWindow(window->sdl_window());
//SDL_SetWindowFullscreen(window().sdl_window(), window().fullscreen);
SDL_RaiseWindow(window->sdl_window());
SDL_GetWindowSize(window->m_sdl_window, &window->m_width, &window->m_height);
SDL_GetWindowSize(window->sdl_window(), &window->m_width, &window->m_height);
#else
window->m_extra_flags = (window->fullscreen() ? SDL_FULLSCREEN : SDL_RESIZABLE);
@ -1238,15 +1282,12 @@ OSDWORK_CALLBACK( sdl_window_info::complete_create_wt )
window->m_width = window->m_sdlsurf->w;
window->m_height = window->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
// initialize the drawing backend
if (window->renderer().create(window->m_width, window->m_height))
if (window->renderer().create(window->width(), window->height()))
return (void *) &result[1];
// Make sure we have a consistent state

View File

@ -75,21 +75,24 @@ private:
class sdl_window_info
{
public:
sdl_window_info(running_machine *a_machine, sdl_monitor_info *a_monitor,
int index, const sdl_window_config *config)
: m_next(NULL), m_minwidth(0), m_minheight(0),
m_startmaximized(0),
m_rendered_event(0), m_target(0), m_primlist(NULL),
m_width(0), m_height(0), m_blitwidth(0), m_blitheight(0),
sdl_window_info(running_machine &a_machine, int index, sdl_monitor_info *a_monitor,
const sdl_window_config *config)
: m_next(NULL), m_primlist(NULL),
m_start_viewscreen(0),
// Following three are used by input code to defer resizes
#if (SDLMAME_SDL2)
m_sdl_window(NULL),
m_resize_width(0),
m_resize_height(0),
m_last_resize(0),
#endif
m_minwidth(0), m_minheight(0),
m_rendered_event(0), m_target(0),
m_width(0), m_height(0), m_blitwidth(0), m_blitheight(0),
#if (SDLMAME_SDL2)
m_sdl_window(NULL),
#else
m_sdlsurf(NULL),
m_screen_width(0), m_screen_height(0),
#endif
m_machine(a_machine), m_monitor(a_monitor), m_fullscreen(0), m_index(0)
{
@ -112,6 +115,8 @@ public:
global_free(m_renderer);
}
int window_init();
void video_window_update(running_machine &machine);
void toggle_full_screen(running_machine &machine);
void modify_prescale(running_machine &machine, int dir);
@ -122,7 +127,7 @@ public:
void get_min_bounds(int *window_width, int *window_height, int constrain);
void get_max_bounds(int *window_width, int *window_height, int constrain);
running_machine &machine() const { assert(m_machine != NULL); return *m_machine; }
running_machine &machine() const { return m_machine; }
sdl_monitor_info *monitor() const { return m_monitor; }
int fullscreen() const { return m_fullscreen; }
@ -130,13 +135,40 @@ public:
void blit_surface_size(int window_width, int window_height);
void pick_best_mode(int *fswidth, int *fsheight);
void set_starting_view(running_machine &machine, int index, const char *defview, const char *view);
int index() const { return m_index; }
int xy_to_render_target(int x, int y, int *xt, int *yt);
render_target *target() { return m_target; }
#if (SDLMAME_SDL2)
SDL_Window *sdl_window() { return m_sdl_window; }
#else
SDL_Surface *sdl_surface() { return m_sdlsurf; }
#endif
int width() const { return m_width; }
int height() const { return m_height; }
int blitwidth() const { return m_blitwidth; }
int blitheight() const { return m_blitheight; }
int prescale() const { return m_prescale; }
// Pointer to next window
sdl_window_info * m_next;
// FIXME: renderer should deal with this
render_primitive_list *m_primlist;
int m_start_viewscreen;
#if (SDLMAME_SDL2)
// These are used in combine resizing events ... #if SDL13_COMBINE_RESIZE
int m_resize_width;
int m_resize_height;
osd_ticks_t m_last_resize;
#endif
private:
// window handle and info
char m_title[256];
@ -152,19 +184,16 @@ public:
// rendering info
osd_event * m_rendered_event;
render_target * m_target;
render_primitive_list *m_primlist;
// cache of physical m_width and m_height
// cache of physical width() and height()
int m_width;
int m_height;
// current m_blitwidth and m_height
// current m_blitwidth and height()
int m_blitwidth;
int m_blitheight;
int m_start_viewscreen;
// GL specific
int m_prescale;
#if (SDLMAME_SDL2)
@ -172,17 +201,11 @@ public:
SDL_Window *m_sdl_window;
// Original display_mode
SDL_DisplayMode m_original_mode;
// These are used in combine resizing events ... #if SDL13_COMBINE_RESIZE
int m_resize_width;
int m_resize_height;
osd_ticks_t m_last_resize;
#else
// SDL surface
SDL_Surface *m_sdlsurf;
int m_screen_width;
int m_screen_height;
#endif
int m_extra_flags;
void set_renderer(osd_renderer *renderer)
@ -197,7 +220,7 @@ private:
void constrain_to_aspect_ratio(int *window_width, int *window_height, int adjustment);
// Pointer to machine
running_machine * m_machine;
running_machine & m_machine;
// monitor info
sdl_monitor_info * m_monitor;
int m_fullscreen;
@ -234,9 +257,6 @@ extern sdl_window_info *sdl_window_list;
// PROTOTYPES
//============================================================
// creation/deletion of windows
int sdlwindow_video_window_create(running_machine &machine, int index, sdl_monitor_info *monitor, const sdl_window_config *config);
//============================================================
// PROTOTYPES - drawsdl.c
//============================================================