diff --git a/src/config.c b/src/config.c index 08030c4..e357a73 100644 --- a/src/config.c +++ b/src/config.c @@ -54,6 +54,8 @@ extern int g_fullscreen; extern int g_highdpi; extern int g_borderless; extern int g_resizeable; +extern int g_novsync; +extern int g_nohwaccel; extern int g_screen_redraw_skip_amt; extern int g_use_dhr140; extern int g_use_bw_hires; @@ -206,6 +208,8 @@ Cfg_menu g_cfg_uiless_menu[] = { { "", KNMP(g_highdpi), CFGTYPE_INT }, { "", KNMP(g_borderless), CFGTYPE_INT }, { "", KNMP(g_resizeable), CFGTYPE_INT }, + { "", KNMP(g_novsync), CFGTYPE_INT }, + { "", KNMP(g_nohwaccel), CFGTYPE_INT }, { "", KNMP(g_screen_redraw_skip_amt), CFGTYPE_INT }, { "", KNMP(g_use_dhr140), CFGTYPE_INT }, { "", KNMP(g_use_bw_hires), CFGTYPE_INT }, diff --git a/src/options.c b/src/options.c index 64b5502..cc3d9d7 100644 --- a/src/options.c +++ b/src/options.c @@ -4,7 +4,7 @@ See COPYRIGHT.txt for Copyright information See LICENSE.txt for license (GPL v2) */ - + #include #include #include @@ -39,6 +39,10 @@ extern int g_highdpi; // defined in video.c extern int g_borderless; // defined in video.c // Allow window resizing, dragging to scale - SDL2 extern int g_resizeable; // defined in video.c +// Don't explicitly set vsync present flag on renderer - SDL2 +extern int g_novsync; // defined in video.c +// Don't explicitly set HW accelerator flag on renderer - SDL2 +extern int g_nohwaccel; // defined in video.c // Enable Dagen's scanline simulator (SDL2) extern int g_scanline_simulator; // defined in sim65816.c // Ethernet (interface?) @@ -133,6 +137,12 @@ int parse_cli_options(int argc, char **argv) { } else if(!strcmp("-resizeable", argv[i])) { glogf("%s Window will be resizeable", parse_log_prefix); g_resizeable = 1; + } else if(!strcmp("-novsync", argv[i])) { + glogf("%s Renderer skipping vsync flag", parse_log_prefix); + g_novsync = 1; + } else if(!strcmp("-nohwaccel", argv[i])) { + glogf("%s Renderer skipping HW accel flag", parse_log_prefix); + g_nohwaccel = 1; } else if(!strcmp("-noignbadacc", argv[i])) { glogf("%s Not ignoring bad memory accesses", parse_log_prefix); g_ignore_bad_acc = 0; diff --git a/src/sdl2_driver.c b/src/sdl2_driver.c index ad285a1..9325753 100644 --- a/src/sdl2_driver.c +++ b/src/sdl2_driver.c @@ -40,7 +40,7 @@ int g_win_status_debug_request = 0; // Desired visibility of status lines. int g_screen_mdepth = 0; int kb_shift_control_state = 0; - +void debuginfo_renderer(SDL_Renderer *r); void x_take_screenshot(); // screenshot stuff int g_screenshot_requested = 0; // DB to know if we want to save a screenshot extern char g_config_gsplus_name[]; @@ -52,6 +52,8 @@ extern int g_fullscreen; // only checked at start if set via CLI, otherwise it' extern int g_highdpi; extern int g_borderless; extern int g_resizeable; +extern int g_novsync; +extern int g_nohwaccel; extern int g_scanline_simulator; extern int g_startx; extern int g_starty; @@ -333,7 +335,15 @@ void dev_video_init_sdl() { // SET WINDOW ICON do_icon(); - renderer = SDL_CreateRenderer(window, -1, 0); + int renderer_hints = 0; + if (!g_novsync) { + renderer_hints |= SDL_RENDERER_PRESENTVSYNC; + } + if (!g_nohwaccel) { + renderer_hints |= SDL_RENDERER_ACCELERATED; + } + renderer = SDL_CreateRenderer(window, -1, renderer_hints); + debuginfo_renderer(renderer); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. // SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); // make the scaled rendering look smoother. @@ -763,6 +773,29 @@ int x_show_alert(int is_fatal, const char *str) { return 0; } +// This will help us determine how well and which drivers are supported on +// different SDL platforms +void debuginfo_renderer(SDL_Renderer *r) { + int n = SDL_GetNumRenderDrivers(); + glogf("**--- SDL DEBUG ------ (%i) drivers", n); + for(int i = 0; i < n; i++) { + SDL_RendererInfo info; + SDL_GetRenderDriverInfo(i, &info); + glogf("* '%s'", info.name); + } + + + SDL_RendererInfo info = {0}; + if (SDL_GetRendererInfo(r,&info) == 0) { + glogf("* SDL_RENDERER_SOFTWARE: %d", (info.flags & SDL_RENDERER_SOFTWARE) > 0 ); + glogf("* SDL_RENDERER_ACCELERATED: %d", (info.flags & SDL_RENDERER_ACCELERATED) > 0 ); + glogf("* SDL_RENDERER_PRESENTVSYNC: %d", (info.flags & SDL_RENDERER_PRESENTVSYNC) > 0 ); + glogf("* SDL_RENDERER_TARGETTEXTURE: %d", (info.flags & SDL_RENDERER_TARGETTEXTURE) > 0 ); + glogf("* active renderer -> '%s'", info.name); + } else { + glog("NO Renderinfo"); + } +} // BELOW ARE FUNCTIONS THAT ARE EITHER UNIMPLEMENTED, OR AR NOT RELEVANT TO diff --git a/src/video.c b/src/video.c index 61d4944..7e0c376 100644 --- a/src/video.c +++ b/src/video.c @@ -94,6 +94,8 @@ int g_starty = WINDOWPOS_UNDEFINED; int g_highdpi = 0; int g_borderless = 0; int g_resizeable = 0; +int g_novsync = 0; +int g_nohwaccel = 0; int g_a2_new_all_stat[200]; int g_a2_cur_all_stat[200];