Added video 'Alternative update-lock' option that may help performance on some machines. Patch from bit.
This commit is contained in:
parent
f9bd0b844f
commit
5d1b2e4f83
8 changed files with 1516 additions and 1491 deletions
|
|
@ -12,17 +12,16 @@
|
|||
|
||||
void video_blit_complete();
|
||||
|
||||
static BITMAP *buffer32_vscale;
|
||||
BITMAP *screen;
|
||||
SDL_Rect old_screen_rect;
|
||||
SDL_Rect screen_rect;
|
||||
SDL_Rect updated_rect;
|
||||
SDL_Rect window_rect;
|
||||
SDL_Rect blit_rect;
|
||||
SDL_Rect texture_rect;
|
||||
int updated = 0;
|
||||
static BITMAP *screen_copy = NULL;
|
||||
static SDL_Rect screen_rect;
|
||||
static SDL_Rect updated_rect;
|
||||
static SDL_Rect updated_rect_copy;
|
||||
static SDL_Rect blit_rect;
|
||||
static SDL_Rect texture_rect;
|
||||
static int updated = 0;
|
||||
|
||||
SDL_mutex* blitMutex = NULL;
|
||||
static SDL_mutex* blitMutex = NULL;
|
||||
|
||||
static void sdl_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
|
||||
|
||||
|
|
@ -30,6 +29,7 @@ int video_scale_mode = 1;
|
|||
int video_vsync = 0;
|
||||
int video_focus_dim = 0;
|
||||
int video_fullscreen_mode = 0;
|
||||
int video_alternative_update_lock = 0;
|
||||
|
||||
static sdl_render_driver sdl_render_drivers[] = {
|
||||
{ RENDERER_AUTO, "auto", "Auto", 0, sdl2_renderer_create, sdl2_renderer_close, sdl2_renderer_available },
|
||||
|
|
@ -55,22 +55,6 @@ void hline(BITMAP *b, int x1, int y, int x2, int col)
|
|||
((uint32_t *)b->line[y])[x1] = col;
|
||||
}
|
||||
|
||||
void blit(BITMAP *src, BITMAP *dst, int x1, int y1, int x2, int y2, int xs, int ys)
|
||||
{
|
||||
}
|
||||
|
||||
void stretch_blit(BITMAP *src, BITMAP *dst, int x1, int y1, int xs1, int ys1, int x2, int y2, int xs2, int ys2)
|
||||
{
|
||||
}
|
||||
|
||||
void rectfill(BITMAP *b, int x1, int y1, int x2, int y2, uint32_t col)
|
||||
{
|
||||
}
|
||||
|
||||
void set_palette(PALETTE p)
|
||||
{
|
||||
}
|
||||
|
||||
void destroy_bitmap(BITMAP *b)
|
||||
{
|
||||
free(b);
|
||||
|
|
@ -254,8 +238,9 @@ int sdl_video_init()
|
|||
video_blit_memtoscreen_func = sdl_blit_memtoscreen;
|
||||
requested_render_driver = sdl_get_render_driver_by_id(RENDERER_AUTO, RENDERER_AUTO);
|
||||
|
||||
buffer32_vscale = create_bitmap(2048, 2048);
|
||||
screen = create_bitmap(2048, 2048);
|
||||
screen_rect.w = screen_rect.h = 2048;
|
||||
|
||||
screen = create_bitmap(screen_rect.w, screen_rect.h);
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
|
@ -264,15 +249,20 @@ void sdl_video_close()
|
|||
{
|
||||
requested_render_driver.renderer_close(renderer);
|
||||
renderer = NULL;
|
||||
destroy_bitmap(buffer32_vscale);
|
||||
destroy_bitmap(screen);
|
||||
screen = NULL;
|
||||
SDL_DestroyMutex(blitMutex);
|
||||
}
|
||||
|
||||
int sdl_renderer_init(SDL_Window* window)
|
||||
{
|
||||
if (video_alternative_update_lock)
|
||||
screen_copy = create_bitmap(screen_rect.w, screen_rect.h);
|
||||
else
|
||||
screen_copy = NULL;
|
||||
|
||||
renderer = requested_render_driver.renderer_create();
|
||||
return renderer->init(window, requested_render_driver, screen);
|
||||
return renderer->init(window, requested_render_driver, screen_rect);
|
||||
}
|
||||
|
||||
void sdl_renderer_close()
|
||||
|
|
@ -280,6 +270,10 @@ void sdl_renderer_close()
|
|||
if (renderer)
|
||||
renderer->close();
|
||||
renderer = NULL;
|
||||
|
||||
if (screen_copy)
|
||||
destroy_bitmap(screen_copy);
|
||||
screen_copy = NULL;
|
||||
}
|
||||
|
||||
int sdl_renderer_update(SDL_Window* window)
|
||||
|
|
@ -289,12 +283,20 @@ int sdl_renderer_update(SDL_Window* window)
|
|||
if (updated)
|
||||
{
|
||||
updated = 0;
|
||||
renderer->update(window, updated_rect, screen);
|
||||
if (screen_copy)
|
||||
{
|
||||
memcpy(&updated_rect_copy, &updated_rect, sizeof(updated_rect));
|
||||
memcpy(screen_copy->dat + (updated_rect.y * screen_copy->w * 4), screen->dat + (updated_rect.y * screen->w * 4), updated_rect.h * screen->w * 4);
|
||||
}
|
||||
else
|
||||
renderer->update(window, updated_rect, screen);
|
||||
texture_rect.w = blit_rect.w;
|
||||
texture_rect.h = blit_rect.h;
|
||||
render = 1;
|
||||
}
|
||||
SDL_UnlockMutex(blitMutex);
|
||||
if (screen_copy && render)
|
||||
renderer->update(window, updated_rect_copy, screen_copy);
|
||||
return render || renderer->always_update;
|
||||
}
|
||||
|
||||
|
|
@ -312,7 +314,7 @@ void sdl_renderer_present(SDL_Window* window)
|
|||
SDL_Rect wr;
|
||||
SDL_GetWindowSize(window, &wr.w, &wr.h);
|
||||
sdl_scale(video_fullscreen_scale, wr, &wr, texture_rect.w, texture_rect.h);
|
||||
renderer->present(window, texture_rect, wr, screen);
|
||||
renderer->present(window, texture_rect, wr, screen_rect);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue