mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
Implement max swapchain images setting, implement it first for DRM/KMS context
This commit is contained in:
parent
ecf88d0114
commit
8a8fadc5b2
@ -411,6 +411,8 @@ static const bool disable_composition = false;
|
|||||||
/* Video VSYNC (recommended) */
|
/* Video VSYNC (recommended) */
|
||||||
static const bool vsync = true;
|
static const bool vsync = true;
|
||||||
|
|
||||||
|
static const unsigned max_swapchain_images = 3;
|
||||||
|
|
||||||
/* Attempts to hard-synchronize CPU and GPU.
|
/* Attempts to hard-synchronize CPU and GPU.
|
||||||
* Can reduce latency at cost of performance. */
|
* Can reduce latency at cost of performance. */
|
||||||
static const bool hard_sync = false;
|
static const bool hard_sync = false;
|
||||||
|
@ -495,6 +495,7 @@ static void config_set_defaults(void)
|
|||||||
settings->video.fullscreen_y = fullscreen_y;
|
settings->video.fullscreen_y = fullscreen_y;
|
||||||
settings->video.disable_composition = disable_composition;
|
settings->video.disable_composition = disable_composition;
|
||||||
settings->video.vsync = vsync;
|
settings->video.vsync = vsync;
|
||||||
|
settings->video.max_swapchain_images = max_swapchain_images;
|
||||||
settings->video.hard_sync = hard_sync;
|
settings->video.hard_sync = hard_sync;
|
||||||
settings->video.hard_sync_frames = hard_sync_frames;
|
settings->video.hard_sync_frames = hard_sync_frames;
|
||||||
settings->video.frame_delay = frame_delay;
|
settings->video.frame_delay = frame_delay;
|
||||||
@ -1291,6 +1292,7 @@ static bool config_load_file(const char *path, bool set_defaults)
|
|||||||
CONFIG_GET_INT_BASE (conf, settings, video.monitor_index, "video_monitor_index");
|
CONFIG_GET_INT_BASE (conf, settings, video.monitor_index, "video_monitor_index");
|
||||||
CONFIG_GET_BOOL_BASE(conf, settings, video.disable_composition, "video_disable_composition");
|
CONFIG_GET_BOOL_BASE(conf, settings, video.disable_composition, "video_disable_composition");
|
||||||
CONFIG_GET_BOOL_BASE(conf, settings, video.vsync, "video_vsync");
|
CONFIG_GET_BOOL_BASE(conf, settings, video.vsync, "video_vsync");
|
||||||
|
CONFIG_GET_INT_BASE(conf, settings, video.max_swapchain_images, "video_max_swapchain_images");
|
||||||
CONFIG_GET_BOOL_BASE(conf, settings, video.hard_sync, "video_hard_sync");
|
CONFIG_GET_BOOL_BASE(conf, settings, video.hard_sync, "video_hard_sync");
|
||||||
|
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
@ -2658,6 +2660,8 @@ bool config_save_file(const char *path)
|
|||||||
|
|
||||||
|
|
||||||
config_set_bool(conf, "video_vsync", settings->video.vsync);
|
config_set_bool(conf, "video_vsync", settings->video.vsync);
|
||||||
|
config_set_int(conf, "video_max_swapchain_images",
|
||||||
|
settings->video.max_swapchain_images);
|
||||||
config_set_bool(conf, "video_hard_sync", settings->video.hard_sync);
|
config_set_bool(conf, "video_hard_sync", settings->video.hard_sync);
|
||||||
config_set_int(conf, "video_hard_sync_frames",
|
config_set_int(conf, "video_hard_sync_frames",
|
||||||
settings->video.hard_sync_frames);
|
settings->video.hard_sync_frames);
|
||||||
|
@ -55,6 +55,7 @@ typedef struct settings
|
|||||||
bool vsync;
|
bool vsync;
|
||||||
bool hard_sync;
|
bool hard_sync;
|
||||||
bool black_frame_insertion;
|
bool black_frame_insertion;
|
||||||
|
unsigned max_swapchain_images;
|
||||||
unsigned swap_interval;
|
unsigned swap_interval;
|
||||||
unsigned hard_sync_frames;
|
unsigned hard_sync_frames;
|
||||||
unsigned frame_delay;
|
unsigned frame_delay;
|
||||||
|
@ -245,6 +245,7 @@ static bool gfx_ctx_drm_queue_flip(void)
|
|||||||
static void gfx_ctx_drm_swap_buffers(void *data)
|
static void gfx_ctx_drm_swap_buffers(void *data)
|
||||||
{
|
{
|
||||||
gfx_ctx_drm_data_t *drm = (gfx_ctx_drm_data_t*)data;
|
gfx_ctx_drm_data_t *drm = (gfx_ctx_drm_data_t*)data;
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
switch (drm_api)
|
switch (drm_api)
|
||||||
{
|
{
|
||||||
@ -269,12 +270,11 @@ static void gfx_ctx_drm_swap_buffers(void *data)
|
|||||||
|
|
||||||
waiting_for_flip = gfx_ctx_drm_queue_flip();
|
waiting_for_flip = gfx_ctx_drm_queue_flip();
|
||||||
|
|
||||||
if (gbm_surface_has_free_buffers(g_gbm_surface))
|
/* Triple-buffered page flips */
|
||||||
|
if (settings->video.max_swapchain_images >= 3 &&
|
||||||
|
gbm_surface_has_free_buffers(g_gbm_surface))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* We have to wait for this flip to finish.
|
|
||||||
* This shouldn't happen as we have triple buffered page-flips. */
|
|
||||||
RARCH_WARN("[KMS]: Triple buffering is not working correctly ...\n");
|
|
||||||
gfx_ctx_drm_wait_flip(true);
|
gfx_ctx_drm_wait_flip(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1105,6 +1105,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg)
|
|||||||
{
|
{
|
||||||
switch (msg)
|
switch (msg)
|
||||||
{
|
{
|
||||||
|
case MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES:
|
||||||
|
return "video_max_swapchain_images";
|
||||||
case MENU_ENUM_LABEL_CORE_SETTINGS:
|
case MENU_ENUM_LABEL_CORE_SETTINGS:
|
||||||
return "core_settings";
|
return "core_settings";
|
||||||
case MENU_ENUM_LABEL_CB_MENU_WALLPAPER:
|
case MENU_ENUM_LABEL_CB_MENU_WALLPAPER:
|
||||||
@ -1997,6 +1999,8 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg)
|
|||||||
return "Compiled against API";
|
return "Compiled against API";
|
||||||
case MSG_FAILED_TO_LOAD:
|
case MSG_FAILED_TO_LOAD:
|
||||||
return "Failed to load";
|
return "Failed to load";
|
||||||
|
case MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES:
|
||||||
|
return "Max swapchain images";
|
||||||
case MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT:
|
case MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT:
|
||||||
return "Libretro core requires content, but nothing was provided.";
|
return "Libretro core requires content, but nothing was provided.";
|
||||||
case MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT:
|
case MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT:
|
||||||
|
@ -4068,6 +4068,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
|
|||||||
menu_displaylist_parse_settings_enum(menu, info,
|
menu_displaylist_parse_settings_enum(menu, info,
|
||||||
MENU_ENUM_LABEL_VIDEO_VSYNC,
|
MENU_ENUM_LABEL_VIDEO_VSYNC,
|
||||||
PARSE_ONLY_BOOL, false);
|
PARSE_ONLY_BOOL, false);
|
||||||
|
menu_displaylist_parse_settings_enum(menu, info,
|
||||||
|
MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES,
|
||||||
|
PARSE_ONLY_UINT, false);
|
||||||
menu_displaylist_parse_settings_enum(menu, info,
|
menu_displaylist_parse_settings_enum(menu, info,
|
||||||
MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL,
|
MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL,
|
||||||
PARSE_ONLY_UINT, false);
|
PARSE_ONLY_UINT, false);
|
||||||
|
@ -5247,6 +5247,21 @@ static bool setting_append_list(
|
|||||||
);
|
);
|
||||||
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_VIDEO_VSYNC);
|
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_VIDEO_VSYNC);
|
||||||
|
|
||||||
|
CONFIG_UINT(
|
||||||
|
list, list_info,
|
||||||
|
&settings->video.max_swapchain_images,
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES),
|
||||||
|
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES),
|
||||||
|
max_swapchain_images,
|
||||||
|
&group_info,
|
||||||
|
&subgroup_info,
|
||||||
|
parent_group,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true);
|
||||||
|
settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO|SD_FLAG_ADVANCED);
|
||||||
|
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES);
|
||||||
|
|
||||||
CONFIG_UINT(
|
CONFIG_UINT(
|
||||||
list, list_info,
|
list, list_info,
|
||||||
&settings->video.swap_interval,
|
&settings->video.swap_interval,
|
||||||
|
@ -323,6 +323,7 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER,
|
MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER,
|
||||||
MENU_ENUM_LABEL_VIDEO_SOFT_FILTER,
|
MENU_ENUM_LABEL_VIDEO_SOFT_FILTER,
|
||||||
MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL,
|
MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL,
|
||||||
|
MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES,
|
||||||
MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT,
|
MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT,
|
||||||
MENU_ENUM_LABEL_VIDEO_FULLSCREEN,
|
MENU_ENUM_LABEL_VIDEO_FULLSCREEN,
|
||||||
MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION,
|
MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION,
|
||||||
@ -367,6 +368,7 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC,
|
MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC,
|
MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL,
|
MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL,
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT,
|
MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN,
|
MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT,
|
MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT,
|
||||||
|
@ -141,6 +141,9 @@
|
|||||||
# Video vsync.
|
# Video vsync.
|
||||||
# video_vsync = true
|
# video_vsync = true
|
||||||
|
|
||||||
|
# Video swapchain images.
|
||||||
|
# video_max_swapchain_images = 3
|
||||||
|
|
||||||
# Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows
|
# Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows
|
||||||
# have video problems with sRGB FBO support enabled.
|
# have video problems with sRGB FBO support enabled.
|
||||||
# video_force_srgb_disable = false
|
# video_force_srgb_disable = false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user