diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index 02186c6ccd..49b444b54f 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -425,6 +425,22 @@ static void menu_common_entries_init(void *data, unsigned menu_type) file_list_push(rgui->selection_buf, "Menu Driver", RGUI_SETTINGS_DRIVER_MENU, 0); #endif break; + case RGUI_SETTINGS_PERFORMANCE_COUNTERS: + file_list_clear(rgui->selection_buf); + { +#ifdef PERF_TEST + const struct retro_perf_counter **counters = (const struct retro_perf_counter**)perf_counters_rarch; + unsigned num = perf_ptr_rarch; + + if (!counters || num == 0) + break; + + for (i = 0; i < num; i++) + if (counters[i] && counters[i]->ident) + file_list_push(rgui->selection_buf, counters[i]->ident, RGUI_SETTINGS_PERF_COUNTERS_BEGIN + i, 0); +#endif + } + break; case RGUI_SETTINGS: file_list_clear(rgui->selection_buf); @@ -449,6 +465,9 @@ static void menu_common_entries_init(void *data, unsigned menu_type) file_list_push(rgui->selection_buf, "Core Information", RGUI_SETTINGS_CORE_INFO, 0); file_list_push(rgui->selection_buf, "Settings", RGUI_SETTINGS_OPTIONS, 0); file_list_push(rgui->selection_buf, "Drivers", RGUI_SETTINGS_DRIVERS, 0); +#ifdef PERF_TEST + file_list_push(rgui->selection_buf, "Performance Counters", RGUI_SETTINGS_PERFORMANCE_COUNTERS, 0); +#endif if (g_extern.main_is_init && !g_extern.libretro_dummy) { @@ -1238,6 +1257,7 @@ static unsigned menu_common_type_is(unsigned type) type == RGUI_SETTINGS_NETPLAY_OPTIONS || type == RGUI_SETTINGS_OPTIONS || type == RGUI_SETTINGS_DRIVERS || + type == RGUI_SETTINGS_PERFORMANCE_COUNTERS || (type == RGUI_SETTINGS_INPUT_OPTIONS); if (type_found) @@ -1423,6 +1443,7 @@ static int menu_settings_iterate(unsigned action) || menu_type == RGUI_SETTINGS_NETPLAY_OPTIONS || menu_type == RGUI_SETTINGS_OPTIONS || menu_type == RGUI_SETTINGS_DRIVERS + || menu_type == RGUI_SETTINGS_PERFORMANCE_COUNTERS || menu_type == RGUI_SETTINGS_CORE_INFO || menu_type == RGUI_SETTINGS_CORE_OPTIONS || menu_type == RGUI_SETTINGS_AUDIO_OPTIONS @@ -4686,6 +4707,12 @@ static int menu_common_setting_set(unsigned setting, unsigned action) return 0; } +#ifdef _WIN32 +#define PERF_LOG_FMT "%I64u ticks, %I64u runs." +#else +#define PERF_LOG_FMT "%llu ticks, %llu runs." +#endif + static void menu_common_setting_set_label(char *type_str, size_t type_str_size, unsigned *w, unsigned type) { switch (type) @@ -4982,6 +5009,7 @@ static void menu_common_setting_set_label(char *type_str, size_t type_str_size, case RGUI_SETTINGS_NETPLAY_OPTIONS: case RGUI_SETTINGS_PRIVACY_OPTIONS: case RGUI_SETTINGS_OPTIONS: + case RGUI_SETTINGS_PERFORMANCE_COUNTERS: case RGUI_SETTINGS_DRIVERS: case RGUI_SETTINGS_CUSTOM_BIND_ALL: case RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL: @@ -5211,6 +5239,89 @@ static void menu_common_setting_set_label(char *type_str, size_t type_str_size, case RGUI_SETTINGS_LOAD_DUMMY_ON_CORE_SHUTDOWN: snprintf(type_str, type_str_size, g_settings.load_dummy_on_core_shutdown ? "ON" : "OFF"); break; + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 1: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 2: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 3: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 4: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 5: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 6: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 7: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 8: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 9: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 10: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 11: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 12: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 13: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 14: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 15: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 16: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 17: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 18: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 19: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 20: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 21: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 22: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 23: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 24: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 25: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 26: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 27: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 28: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 29: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 30: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 31: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 32: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 33: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 34: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 35: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 36: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 37: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 38: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 39: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 40: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 41: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 42: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 43: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 44: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 45: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 46: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 47: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 48: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 49: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 50: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 51: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 52: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 53: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 54: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 55: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 56: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 57: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 58: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 59: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 60: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 61: + case RGUI_SETTINGS_PERF_COUNTERS_BEGIN + 62: + case RGUI_SETTINGS_PERF_COUNTERS_END: + { +#ifdef PERF_TEST + const struct retro_perf_counter **counters = (const struct retro_perf_counter**)perf_counters_rarch; + unsigned num = perf_ptr_rarch; + + if (counters[type] && counters[type]->ident && counters[type]->call_cnt && counters[type]->total) + { + snprintf(type_str, type_str_size, PERF_LOG_FMT, + (unsigned long long)counters[type]->total / (unsigned long long)counters[type]->call_cnt, + (unsigned long long)counters[type]->call_cnt); + } + else +#endif + { + *type_str = '\0'; + *w = 0; + } + } + break; default: *type_str = '\0'; *w = 0; diff --git a/frontend/menu/backend/menu_common_backend.h b/frontend/menu/backend/menu_common_backend.h index cb51fc2e7a..75fc106d6c 100644 --- a/frontend/menu/backend/menu_common_backend.h +++ b/frontend/menu/backend/menu_common_backend.h @@ -23,6 +23,10 @@ #define GFX_MAX_PARAMETERS 64 #endif +#ifndef MAX_COUNTERS +#define MAX_COUNTERS 64 +#endif + typedef enum { // Shader stuff @@ -95,6 +99,7 @@ typedef enum RGUI_SETTINGS_PRIVACY_OPTIONS, RGUI_SETTINGS_OPTIONS, RGUI_SETTINGS_DRIVERS, + RGUI_SETTINGS_PERFORMANCE_COUNTERS, RGUI_SETTINGS_REWIND_ENABLE, RGUI_SETTINGS_LIBRETRO_LOG_LEVEL, RGUI_SETTINGS_LOGGING_VERBOSITY, @@ -235,6 +240,8 @@ typedef enum RGUI_SETTINGS_CUSTOM_BIND_ALL, RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL, RGUI_SETTINGS_ONSCREEN_KEYBOARD_ENABLE, + RGUI_SETTINGS_PERF_COUNTERS_BEGIN, + RGUI_SETTINGS_PERF_COUNTERS_END = RGUI_SETTINGS_PERF_COUNTERS_BEGIN + (MAX_COUNTERS-1), RGUI_SETTINGS_BIND_LAST = RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS, } rgui_settings_t; diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index ef9f4e9554..45725413f8 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -317,6 +317,8 @@ static void rgui_render(void) strlcpy(title, "SETTINGS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); + else if (menu_type == RGUI_SETTINGS_PERFORMANCE_COUNTERS) + strlcpy(title, "PERFORMANCE COUNTERS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == RGUI_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); diff --git a/frontend/menu/disp/rmenu.c b/frontend/menu/disp/rmenu.c index 20421d0228..deb1d1d7f8 100644 --- a/frontend/menu/disp/rmenu.c +++ b/frontend/menu/disp/rmenu.c @@ -169,6 +169,8 @@ static void rmenu_render(void) strlcpy(title, "VIDEO OPTIONS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); + else if (menu_type == RGUI_SETTINGS_PERFORMANCE_COUNTERS) + strlcpy(title, "PERFORMANCE COUNTERS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == RGUI_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); diff --git a/frontend/menu/disp/rmenu_xui.cpp b/frontend/menu/disp/rmenu_xui.cpp index dd7fe8ec16..61e2c67006 100644 --- a/frontend/menu/disp/rmenu_xui.cpp +++ b/frontend/menu/disp/rmenu_xui.cpp @@ -417,6 +417,8 @@ static void rmenu_xui_render(void) strlcpy(title, "SETTINGS", sizeof(title)); else if (menu_type == RGUI_SETTINGS_DRIVERS) strlcpy(title, "DRIVER OPTIONS", sizeof(title)); + else if (menu_type == RGUI_SETTINGS_PERFORMANCE_COUNTERS) + strlcpy(title, "PERFORMANCE COUNTERS", sizeof(title)); #ifdef HAVE_SHADER_MANAGER else if (menu_type == RGUI_SETTINGS_SHADER_OPTIONS) strlcpy(title, "SHADER OPTIONS", sizeof(title)); diff --git a/performance.c b/performance.c index 7d112f246e..f2babb5149 100644 --- a/performance.c +++ b/performance.c @@ -77,11 +77,10 @@ #include -#define MAX_COUNTERS 64 -static const struct retro_perf_counter *perf_counters_rarch[MAX_COUNTERS]; -static const struct retro_perf_counter *perf_counters_libretro[MAX_COUNTERS]; -static unsigned perf_ptr_rarch; -static unsigned perf_ptr_libretro; +const struct retro_perf_counter *perf_counters_rarch[MAX_COUNTERS]; +const struct retro_perf_counter *perf_counters_libretro[MAX_COUNTERS]; +unsigned perf_ptr_rarch; +unsigned perf_ptr_libretro; void rarch_perf_register(struct retro_perf_counter *perf) { diff --git a/performance.h b/performance.h index fb6dbe1c2c..a2e967d9e9 100644 --- a/performance.h +++ b/performance.h @@ -35,6 +35,15 @@ extern "C" { #include "libretro.h" #include +#define MAX_COUNTERS 64 + +#ifdef PERF_TEST +extern const struct retro_perf_counter *perf_counters_rarch[MAX_COUNTERS]; +extern const struct retro_perf_counter *perf_counters_libretro[MAX_COUNTERS]; +extern unsigned perf_ptr_rarch; +extern unsigned perf_ptr_libretro; +#endif + retro_perf_tick_t rarch_get_perf_counter(void); retro_time_t rarch_get_time_usec(void); void rarch_perf_register(struct retro_perf_counter *perf);