diff --git a/src/osd/sdl/blit13.h b/src/osd/sdl/blit13.h index 12b45d2269d..389c53e9812 100644 --- a/src/osd/sdl/blit13.h +++ b/src/osd/sdl/blit13.h @@ -119,9 +119,11 @@ INLINE void texcopy_##_name (texture_info *texture, const render_texinfo *texsou for (y = 0; y < texsource->height; y++) { \ _src_type *src = (_src_type *)texsource->base + y * texsource->rowpixels / (_len_div); \ _dest_type *dst = (_dest_type *)((UINT8 *)texture->pixels + y * texture->pitch); \ - for (x = 0; x < texsource->width / (_len_div); x++) { \ + x = texsource->width / (_len_div); \ + while (x > 0) { \ *dst++ = _op(*src); \ src++; \ + x--; \ } \ } \ } @@ -140,11 +142,13 @@ INLINE void texcopy_rot_##_name (texture_info *texture, const render_texinfo *te INT32 curu = setup->startu + y * setup->dudy; \ INT32 curv = setup->startv + y * setup->dvdy; \ _dest_type *dst = (_dest_type *)((UINT8 *)texture->pixels + y * texture->pitch); \ - for (x = 0; x < setup->rotwidth; x++) { \ + x = setup->rotwidth; \ + while (x>0) { \ _src_type *src = (_src_type *) texsource->base + (curv >> 16) * texsource->rowpixels + (curu >> 16); \ *dst++ = _op(*src); \ curu += dudx; \ curv += dvdx; \ + x--; \ } \ } \ } diff --git a/src/osd/sdl/draw13.c b/src/osd/sdl/draw13.c index 6e424578814..f1a3516a106 100644 --- a/src/osd/sdl/draw13.c +++ b/src/osd/sdl/draw13.c @@ -7,10 +7,6 @@ // // SDLMAME by Olivier Galibert and R. Belmont // -// Note: D3D9 goes to a lot of trouble to fiddle with MODULATE -// mode on textures. That is the default in OpenGL so we -// don't have to touch it. -// //============================================================ // standard C headers @@ -134,6 +130,12 @@ struct _sdl_info float last_hofs; float last_vofs; + // resize information + + UINT8 resize_pending; + UINT32 resize_width; + UINT32 resize_height; + // Stats INT64 last_blit_time; INT64 last_blit_pixels; @@ -151,7 +153,7 @@ static int draw13_window_create(sdl_window_info *window, int width, int height); static void draw13_window_resize(sdl_window_info *window, int width, int height); static void draw13_window_destroy(sdl_window_info *window); static int draw13_window_draw(sdl_window_info *window, UINT32 dc, int update); -static const render_primitive_list *draw13_window_get_primitives(sdl_window_info *window); +static render_primitive_list &draw13_window_get_primitives(sdl_window_info *window); static void draw13_destroy_all_textures(sdl_window_info *window); static void draw13_window_clear(sdl_window_info *window); static int draw13_xy_to_render_target(sdl_window_info *window, int x, int y, int *xt, int *yt); @@ -379,7 +381,7 @@ INLINE void render_quad(sdl_info *sdl, texture_info *texture, render_primitive * } else { - SDL_SetTextureScaleMode(texture->texture_id, SDL_TEXTURESCALEMODE_FAST); + SDL_SetTextureScaleMode(texture->texture_id, SDL_TEXTURESCALEMODE_NONE); } SDL_SetTextureBlendMode(texture_id, texture->sdl_blendmode); set_coloralphamode(texture_id, &prim->color); @@ -611,11 +613,6 @@ static int draw13_window_create(sdl_window_info *window, int width, int height) window->sdl_window = SDL_CreateWindow(window->title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, sdl->extra_flags); - SDL_ShowWindow(window->sdl_window); - //SDL_SetWindowFullscreen(window->window_id, window->fullscreen); - SDL_RaiseWindow(window->sdl_window); - SDL_GetWindowSize(window->sdl_window, &window->width, &window->height); - // create renderer if (video_config.waitvsync) @@ -630,6 +627,12 @@ static int draw13_window_create(sdl_window_info *window, int width, int height) SDL_SelectRenderer(window->sdl_window); + SDL_ShowWindow(window->sdl_window); + //SDL_SetWindowFullscreen(window->window_id, window->fullscreen); + SDL_RaiseWindow(window->sdl_window); + SDL_GetWindowSize(window->sdl_window, &window->width, &window->height); + + sdl->blittimer = 3; // in case any textures try to come up before these are validated, @@ -637,6 +640,7 @@ static int draw13_window_create(sdl_window_info *window, int width, int height) sdl->texture_max_width = 64; sdl->texture_max_height = 64; + SDL_RenderPresent(); mame_printf_verbose("Leave draw13_window_create\n"); return 0; } @@ -649,8 +653,13 @@ static void draw13_window_resize(sdl_window_info *window, int width, int height) { sdl_info *sdl = (sdl_info *) window->dxdata; - SDL_SetWindowSize(window->sdl_window, width, height); - SDL_GetWindowSize(window->sdl_window, &window->width, &window->height); + sdl->resize_pending = 1; + sdl->resize_height = height; + sdl->resize_width = width; + + window->width = width; + window->height = height; + sdl->blittimer = 3; } @@ -676,7 +685,7 @@ static int draw13_xy_to_render_target(sdl_window_info *window, int x, int y, int // draw13_window_get_primitives //============================================================ -static const render_primitive_list *draw13_window_get_primitives(sdl_window_info *window) +static render_primitive_list &draw13_window_get_primitives(sdl_window_info *window) { if ((!window->fullscreen) || (video_config.switchres)) { @@ -707,13 +716,21 @@ static int draw13_window_draw(sdl_window_info *window, UINT32 dc, int update) return 0; } - SDL_SelectRenderer(window->sdl_window); + if (sdl->resize_pending) + { + SDL_SetWindowSize(window->sdl_window, sdl->resize_width, sdl->resize_height); + SDL_GetWindowSize(window->sdl_window, &window->width, &window->height); + sdl->resize_pending = 0; + } + + SDL_SelectRenderer(window->sdl_window); if (sdl->blittimer > 0) { /* SDL Underlays need alpha = 0 ! */ SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); - SDL_SetRenderDrawColor(0,0,0,0 /*255*/); + //SDL_SetRenderDrawColor(0,0,0,255); + SDL_SetRenderDrawColor(0,0,0,0); SDL_RenderFillRect(NULL); sdl->blittimer--; } @@ -749,10 +766,10 @@ static int draw13_window_draw(sdl_window_info *window, UINT32 dc, int update) sdl->last_hofs = hofs; sdl->last_vofs = vofs; - osd_lock_acquire(window->primlist->lock); + window->primlist->acquire_lock(); // now draw - for (prim = window->primlist->head; prim != NULL; prim = prim->next) + for (prim = window->primlist->first(); prim != NULL; prim = prim->next()) { Uint8 sr, sg, sb, sa; @@ -777,10 +794,12 @@ static int draw13_window_draw(sdl_window_info *window, UINT32 dc, int update) round_nearest(hofs + prim->bounds.x0), round_nearest(vofs + prim->bounds.y0)); break; + default: + throw emu_fatalerror("Unexpected render_primitive type"); } } - osd_lock_release(window->primlist->lock); + window->primlist->release_lock(); sdl->last_blit_pixels = blit_pixels; sdl->last_blit_time = -osd_ticks(); @@ -1164,10 +1183,10 @@ static void draw13_destroy_all_textures(sdl_window_info *window) if (sdl == NULL) return; - if(window->primlist && window->primlist->lock) + if(window->primlist) { lock=TRUE; - osd_lock_acquire(window->primlist->lock); + window->primlist->acquire_lock(); } texture = sdl->texlist; @@ -1180,5 +1199,5 @@ static void draw13_destroy_all_textures(sdl_window_info *window) } if (lock) - osd_lock_release(window->primlist->lock); + window->primlist->release_lock(); } diff --git a/src/osd/sdl/input.c b/src/osd/sdl/input.c index caecdb7c172..8bc17326a16 100644 --- a/src/osd/sdl/input.c +++ b/src/osd/sdl/input.c @@ -790,7 +790,7 @@ static void sdlinput_deregister_joysticks(running_machine *machine) // sdlinput_register_mice //============================================================ -#if (SDL_VERSION_ATLEAST(1,3,0)) +#if (!SDL13_POST_HG4464 && SDL_VERSION_ATLEAST(1,3,0)) static void sdlinput_register_mice(running_machine *machine) { int index, physical_mouse; @@ -1002,7 +1002,7 @@ static kt_table * sdlinput_read_keymap(running_machine *machine) // sdlinput_register_keyboards //============================================================ -#if (SDL_VERSION_ATLEAST(1,3,0)) +#if (!SDL13_POST_HG4464 && SDL_VERSION_ATLEAST(1,3,0)) static void sdlinput_register_keyboards(running_machine *machine) { int physical_keyboard; diff --git a/src/osd/sdl/osdsdl.h b/src/osd/sdl/osdsdl.h index afd731e556a..8dcc3743008 100644 --- a/src/osd/sdl/osdsdl.h +++ b/src/osd/sdl/osdsdl.h @@ -3,6 +3,15 @@ #include +//============================================================ +// Temporary SDL 1.3 defines +//============================================================ + +// set this to 0 if compiling against a "hg update 4464" +// checkout of SDL 1.3 + +#define SDL13_POST_HG4464 (1) + //============================================================ // System dependent defines //============================================================ diff --git a/src/osd/sdl/sdlos_unix.c b/src/osd/sdl/sdlos_unix.c index 8d487c0c33a..c5a30e3a260 100644 --- a/src/osd/sdl/sdlos_unix.c +++ b/src/osd/sdl/sdlos_unix.c @@ -153,11 +153,17 @@ char *osd_get_clipboard_text(void) return NULL; if ( info.subsystem != SDL_SYSWM_X11 ) return NULL; +#if (SDL_VERSION_ATLEAST(1,3,0)) + if ( (display = info.x11.display) == NULL ) + return NULL; + if ( (our_win = info.x11.window) == None ) + return NULL; +#else if ( (display = info.info.x11.display) == NULL ) return NULL; if ( (our_win = info.info.x11.window) == None ) return NULL; - +#endif /* request data to owner */ selection_win = XGetSelectionOwner( display, XA_PRIMARY ); if ( selection_win == None )