Refactor performance.c code

This commit is contained in:
twinaphex 2016-05-10 09:17:04 +02:00
parent 288dbe2bd0
commit 0d371def5c
16 changed files with 153 additions and 118 deletions

View File

@ -147,7 +147,7 @@ static const dspfilter_get_implementation_t dsp_plugs_builtin[] = {
static bool append_plugs(rarch_dsp_filter_t *dsp, struct string_list *list) static bool append_plugs(rarch_dsp_filter_t *dsp, struct string_list *list)
{ {
unsigned i; unsigned i;
dspfilter_simd_mask_t mask = retro_get_cpu_features(); dspfilter_simd_mask_t mask = cpu_features_get();
(void)list; (void)list;
@ -171,7 +171,7 @@ static bool append_plugs(rarch_dsp_filter_t *dsp, struct string_list *list)
static bool append_plugs(rarch_dsp_filter_t *dsp, struct string_list *list) static bool append_plugs(rarch_dsp_filter_t *dsp, struct string_list *list)
{ {
unsigned i; unsigned i;
dspfilter_simd_mask_t mask = retro_get_cpu_features(); dspfilter_simd_mask_t mask = cpu_features_get();
for (i = 0; i < list->size; i++) for (i = 0; i < list->size; i++)
{ {

View File

@ -143,7 +143,7 @@ retro_get_cpu_features_t perf_get_cpu_features_cb;
static resampler_simd_mask_t resampler_get_cpu_features(void) static resampler_simd_mask_t resampler_get_cpu_features(void)
{ {
#ifdef RARCH_INTERNAL #ifdef RARCH_INTERNAL
return retro_get_cpu_features(); return cpu_features_get();
#else #else
return perf_get_cpu_features_cb(); return perf_get_cpu_features_cb();
#endif #endif

View File

@ -410,7 +410,7 @@ retro_get_cpu_features_t perf_get_cpu_features_cb;
static unsigned audio_convert_get_cpu_features(void) static unsigned audio_convert_get_cpu_features(void)
{ {
#ifdef RARCH_INTERNAL #ifdef RARCH_INTERNAL
return retro_get_cpu_features(); return cpu_features_get();
#else #else
return perf_get_cpu_features_cb(); return perf_get_cpu_features_cb();
#endif #endif

View File

@ -1122,9 +1122,9 @@ bool rarch_environment_cb(unsigned cmd, void *data)
struct retro_perf_callback *cb = (struct retro_perf_callback*)data; struct retro_perf_callback *cb = (struct retro_perf_callback*)data;
RARCH_LOG("Environ GET_PERF_INTERFACE.\n"); RARCH_LOG("Environ GET_PERF_INTERFACE.\n");
cb->get_time_usec = retro_get_time_usec; cb->get_time_usec = cpu_features_get_time_usec;
cb->get_cpu_features = retro_get_cpu_features; cb->get_cpu_features = cpu_features_get;
cb->get_perf_counter = retro_get_perf_counter; cb->get_perf_counter = cpu_features_get_perf_counter;
cb->perf_register = retro_perf_register; cb->perf_register = retro_perf_register;
cb->perf_start = retro_perf_start; cb->perf_start = retro_perf_start;

View File

@ -983,7 +983,7 @@ bool video_monitor_get_fps(char *buf, size_t size,
{ {
static retro_time_t curr_time; static retro_time_t curr_time;
static retro_time_t fps_time; static retro_time_t fps_time;
retro_time_t new_time = retro_get_time_usec(); retro_time_t new_time = cpu_features_get_time_usec();
*buf = '\0'; *buf = '\0';

View File

@ -204,7 +204,7 @@ static bool create_softfilter_graph(rarch_softfilter_t *filt,
filt->impl_data = filt->impl->create( filt->impl_data = filt->impl->create(
&softfilter_config, input_fmt, input_fmt, max_width, max_height, &softfilter_config, input_fmt, input_fmt, max_width, max_height,
threads != RARCH_SOFTFILTER_THREADS_AUTO ? threads : threads != RARCH_SOFTFILTER_THREADS_AUTO ? threads :
retro_get_cpu_cores(), cpu_features, cpu_features_get_core_amount(), cpu_features,
&userdata); &userdata);
if (!filt->impl_data) if (!filt->impl_data)
{ {
@ -262,7 +262,7 @@ static bool append_softfilter_plugs(rarch_softfilter_t *filt,
struct string_list *list) struct string_list *list)
{ {
unsigned i; unsigned i;
softfilter_simd_mask_t mask = retro_get_cpu_features(); softfilter_simd_mask_t mask = cpu_features_get();
for (i = 0; i < list->size; i++) for (i = 0; i < list->size; i++)
{ {
@ -345,7 +345,7 @@ static bool append_softfilter_plugs(rarch_softfilter_t *filt,
struct string_list *list) struct string_list *list)
{ {
unsigned i; unsigned i;
softfilter_simd_mask_t mask = retro_get_cpu_features(); softfilter_simd_mask_t mask = cpu_features_get();
(void)list; (void)list;
@ -382,7 +382,7 @@ rarch_softfilter_t *rarch_softfilter_new(const char *filter_config,
enum retro_pixel_format in_pixel_format, enum retro_pixel_format in_pixel_format,
unsigned max_width, unsigned max_height) unsigned max_width, unsigned max_height)
{ {
softfilter_simd_mask_t cpu_features = retro_get_cpu_features(); softfilter_simd_mask_t cpu_features = cpu_features_get();
char basedir[PATH_MAX_LENGTH]; char basedir[PATH_MAX_LENGTH];
#ifdef HAVE_DYLIB #ifdef HAVE_DYLIB
char ext_name[PATH_MAX_LENGTH]; char ext_name[PATH_MAX_LENGTH];

View File

@ -692,7 +692,7 @@ static bool video_thread_frame(void *data, const void *frame_,
/* Ideally, use absolute time, but that is only a good idea on POSIX. */ /* Ideally, use absolute time, but that is only a good idea on POSIX. */
while (thr->frame.updated) while (thr->frame.updated)
{ {
retro_time_t current = retro_get_time_usec(); retro_time_t current = cpu_features_get_time_usec();
retro_time_t delta = target - current; retro_time_t delta = target - current;
if (delta <= 0) if (delta <= 0)
@ -743,7 +743,7 @@ static bool video_thread_frame(void *data, const void *frame_,
retro_perf_stop(&thr_frame); retro_perf_stop(&thr_frame);
thr->last_time = retro_get_time_usec(); thr->last_time = cpu_features_get_time_usec();
return true; return true;
} }
@ -783,7 +783,7 @@ static bool video_thread_init(thread_video_t *thr, const video_info_t *info,
memset(thr->frame.buffer, 0x80, max_size); memset(thr->frame.buffer, 0x80, max_size);
thr->last_time = retro_get_time_usec(); thr->last_time = cpu_features_get_time_usec();
thr->thread = sthread_create(video_thread_loop, thr); thr->thread = sthread_create(video_thread_loop, thr);
if (!thr->thread) if (!thr->thread)

View File

@ -53,11 +53,11 @@ static int action_iterate_help(menu_handle_t *menu,
int64_t timeout; int64_t timeout;
static bool timer_begin = false; static bool timer_begin = false;
static bool timer_end = false; static bool timer_end = false;
int64_t current = retro_get_time_usec(); int64_t current = cpu_features_get_time_usec();
if (!timer_begin) if (!timer_begin)
{ {
timeout_end = retro_get_time_usec() + timeout_end = cpu_features_get_time_usec() +
3 /* seconds */ * 1000000; 3 /* seconds */ * 1000000;
timer_begin = true; timer_begin = true;
timer_end = false; timer_end = false;

View File

@ -560,7 +560,7 @@ bool menu_animation_ctl(enum menu_animation_ctl_state state, void *data)
static retro_time_t last_clock_update = 0; static retro_time_t last_clock_update = 0;
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
cur_time = retro_get_time_usec(); cur_time = cpu_features_get_time_usec();
delta_time = cur_time - old_time; delta_time = cur_time - old_time;
if (delta_time >= IDEAL_DELTA_TIME* 4) if (delta_time >= IDEAL_DELTA_TIME* 4)

View File

@ -267,7 +267,7 @@ static bool menu_input_key_bind_custom_bind_keyboard_cb(
menu_input->binds.target->key = (enum retro_key)code; menu_input->binds.target->key = (enum retro_key)code;
menu_input->binds.begin++; menu_input->binds.begin++;
menu_input->binds.target++; menu_input->binds.target++;
menu_input->binds.timeout_end = retro_get_time_usec() + menu_input->binds.timeout_end = cpu_features_get_time_usec() +
MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000;
return (menu_input->binds.begin <= menu_input->binds.last); return (menu_input->binds.begin <= menu_input->binds.last);
@ -455,7 +455,7 @@ static bool menu_input_key_bind_set_mode(
menu_input_key_bind_poll_bind_state( menu_input_key_bind_poll_bind_state(
&menu_input->binds, bind_port, false); &menu_input->binds, bind_port, false);
menu_input->binds.timeout_end = retro_get_time_usec() + menu_input->binds.timeout_end = cpu_features_get_time_usec() +
MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000;
keys.userdata = menu; keys.userdata = menu;
@ -574,7 +574,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len)
struct menu_bind_state binds; struct menu_bind_state binds;
bool timed_out = false; bool timed_out = false;
menu_input_t *menu_input = menu_input_get_ptr(); menu_input_t *menu_input = menu_input_get_ptr();
int64_t current = retro_get_time_usec(); int64_t current = cpu_features_get_time_usec();
int timeout = int timeout =
(menu_input->binds.timeout_end - current) / 1000000; (menu_input->binds.timeout_end - current) / 1000000;
@ -584,7 +584,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len)
menu_input->binds.begin++; menu_input->binds.begin++;
menu_input->binds.target++; menu_input->binds.target++;
menu_input->binds.timeout_end = retro_get_time_usec() + menu_input->binds.timeout_end = cpu_features_get_time_usec() +
MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000;
timed_out = true; timed_out = true;
} }
@ -631,7 +631,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len)
} }
binds.target++; binds.target++;
binds.timeout_end = retro_get_time_usec() + binds.timeout_end = cpu_features_get_time_usec() +
MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000; MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000;
} }
menu_input->binds = binds; menu_input->binds = binds;

View File

@ -24,12 +24,12 @@
int net_http_get(const char **result, size_t *size, const char *url, retro_time_t *timeout) int net_http_get(const char **result, size_t *size, const char *url, retro_time_t *timeout)
{ {
uint8_t* data;
size_t length; size_t length;
char* res; uint8_t* data = NULL;
int ret = NET_HTTP_GET_OK; char* res = NULL;
struct http_t* http = NULL; int ret = NET_HTTP_GET_OK;
retro_time_t t0 = retro_get_time_usec(); struct http_t* http = NULL;
retro_time_t t0 = cpu_features_get_time_usec();
struct http_connection_t *conn = net_http_connection_new(url); struct http_connection_t *conn = net_http_connection_new(url);
*result = NULL; *result = NULL;
@ -60,7 +60,7 @@ int net_http_get(const char **result, size_t *size, const char *url, retro_time_
while (!net_http_update(http, NULL, NULL)) while (!net_http_update(http, NULL, NULL))
{ {
/* Timeout error. */ /* Timeout error. */
if (timeout && (retro_get_time_usec() - t0) > *timeout) if (timeout && (cpu_features_get_time_usec() - t0) > *timeout)
{ {
ret = NET_HTTP_GET_TIMEOUT; ret = NET_HTTP_GET_TIMEOUT;
goto error; goto error;
@ -99,7 +99,7 @@ error:
if (timeout) if (timeout)
{ {
t0 = retro_get_time_usec() - t0; t0 = cpu_features_get_time_usec() - t0;
if (t0 < *timeout) if (t0 < *timeout)
*timeout -= t0; *timeout -= t0;

View File

@ -27,7 +27,9 @@
#define PERF_LOG_FMT "[PERF]: Avg (%s): %llu ticks, %llu runs.\n" #define PERF_LOG_FMT "[PERF]: Avg (%s): %llu ticks, %llu runs.\n"
#endif #endif
#if !defined(_WIN32) && !defined(RARCH_CONSOLE) #if defined(_WIN32)
#include <direct.h>
#else
#include <unistd.h> #include <unistd.h>
#endif #endif
@ -110,13 +112,13 @@ static int clock_gettime(int clk_ik, struct timespec *t)
#endif #endif
/** /**
* retro_get_perf_counter: * cpu_features_get_perf_counter:
* *
* Gets performance counter. * Gets performance counter.
* *
* Returns: performance counter. * Returns: performance counter.
**/ **/
retro_perf_tick_t retro_get_perf_counter(void) retro_perf_tick_t cpu_features_get_perf_counter(void)
{ {
retro_perf_tick_t time_ticks = 0; retro_perf_tick_t time_ticks = 0;
#if defined(__linux__) || defined(__QNX__) || defined(__MACH__) #if defined(__linux__) || defined(__QNX__) || defined(__MACH__)
@ -125,16 +127,12 @@ retro_perf_tick_t retro_get_perf_counter(void)
time_ticks = (retro_perf_tick_t)tv.tv_sec * 1000000000 + time_ticks = (retro_perf_tick_t)tv.tv_sec * 1000000000 +
(retro_perf_tick_t)tv.tv_nsec; (retro_perf_tick_t)tv.tv_nsec;
#elif defined(__GNUC__) && !defined(RARCH_CONSOLE) #elif defined(__GNUC__) && defined(__i386__) || defined(__i486__) || defined(__i686__)
#if defined(__i386__) || defined(__i486__) || defined(__i686__)
__asm__ volatile ("rdtsc" : "=A" (time_ticks)); __asm__ volatile ("rdtsc" : "=A" (time_ticks));
#elif defined(__x86_64__) #elif defined(__GNUC__) && defined(__x86_64__)
unsigned a, d; unsigned a, d;
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
time_ticks = (retro_perf_tick_t)a | ((retro_perf_tick_t)d << 32); time_ticks = (retro_perf_tick_t)a | ((retro_perf_tick_t)d << 32);
#endif
#elif defined(__ARM_ARCH_6__) #elif defined(__ARM_ARCH_6__)
__asm__ volatile( "mrc p15, 0, %0, c9, c13, 0" : "=r"(time_ticks) ); __asm__ volatile( "mrc p15, 0, %0, c9, c13, 0" : "=r"(time_ticks) );
#elif defined(__CELLOS_LV2__) || defined(_XBOX360) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__) #elif defined(__CELLOS_LV2__) || defined(_XBOX360) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__)
@ -171,13 +169,13 @@ retro_perf_tick_t retro_get_perf_counter(void)
} }
/** /**
* retro_get_time_usec: * cpu_features_get_time_usec:
* *
* Gets time in microseconds. * Gets time in microseconds.
* *
* Returns: time in microseconds. * Returns: time in microseconds.
**/ **/
retro_time_t retro_get_time_usec(void) retro_time_t cpu_features_get_time_usec(void)
{ {
#if defined(_WIN32) #if defined(_WIN32)
static LARGE_INTEGER freq; static LARGE_INTEGER freq;
@ -210,7 +208,7 @@ retro_time_t retro_get_time_usec(void)
#elif defined(VITA) #elif defined(VITA)
return sceKernelGetProcessTimeWide(); return sceKernelGetProcessTimeWide();
#else #else
#error "Your platform does not have a timer function implemented in retro_get_time_usec(). Cannot continue." #error "Your platform does not have a timer function implemented in cpu_features_get_time_usec(). Cannot continue."
#endif #endif
} }
@ -245,7 +243,7 @@ void x86_cpuid(int func, int flags[4])
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
__cpuid(flags, func); __cpuid(flags, func);
#else #else
RARCH_WARN("Unknown compiler. Cannot check CPUID with inline assembly.\n"); printf("Unknown compiler. Cannot check CPUID with inline assembly.\n");
memset(flags, 0, 4 * sizeof(int)); memset(flags, 0, 4 * sizeof(int));
#endif #endif
} }
@ -267,7 +265,7 @@ static uint64_t xgetbv_x86(uint32_t idx)
/* Intrinsic only works on 2010 SP1 and above. */ /* Intrinsic only works on 2010 SP1 and above. */
return _xgetbv(idx); return _xgetbv(idx);
#else #else
RARCH_WARN("Unknown compiler. Cannot check xgetbv bits.\n"); printf("Unknown compiler. Cannot check xgetbv bits.\n");
return 0; return 0;
#endif #endif
} }
@ -293,13 +291,13 @@ static void arm_enable_runfast_mode(void)
#endif #endif
/** /**
* retro_get_cpu_cores: * cpu_features_get_core_amount:
* *
* Gets the amount of available CPU cores. * Gets the amount of available CPU cores.
* *
* Returns: amount of CPU cores available. * Returns: amount of CPU cores available.
**/ **/
unsigned retro_get_cpu_cores(void) unsigned cpu_features_get_core_amount(void)
{ {
#if defined(_WIN32) && !defined(_XBOX) #if defined(_WIN32) && !defined(_XBOX)
/* Win32 */ /* Win32 */
@ -354,13 +352,13 @@ unsigned retro_get_cpu_cores(void)
#define VENDOR_INTEL_d 0x49656e69 #define VENDOR_INTEL_d 0x49656e69
/** /**
* retro_get_cpu_features: * cpu_features_get:
* *
* Gets CPU features.. * Gets CPU features..
* *
* Returns: bitmask of all CPU features available. * Returns: bitmask of all CPU features available.
**/ **/
uint64_t retro_get_cpu_features(void) uint64_t cpu_features_get(void)
{ {
int flags[4]; int flags[4];
int vendor_shuffle[3]; int vendor_shuffle[3];
@ -389,53 +387,53 @@ uint64_t retro_get_cpu_features(void)
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.mmx", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.mmx", NULL, &len, NULL, 0) == 0)
{ {
cpu |= RETRO_SIMD_MMX; cpu |= CPU_FEATURE_MMX;
cpu |= RETRO_SIMD_MMXEXT; cpu |= CPU_FEATURE_MMXEXT;
} }
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.sse", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.sse", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSE; cpu |= CPU_FEATURE_SSE;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.sse2", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.sse2", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSE2; cpu |= CPU_FEATURE_SSE2;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.sse3", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.sse3", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSE3; cpu |= CPU_FEATURE_SSE3;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.supplementalsse3", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.supplementalsse3", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSSE3; cpu |= CPU_FEATURE_SSSE3;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.sse4_1", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.sse4_1", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSE4; cpu |= CPU_FEATURE_SSE4;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.sse4_2", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.sse4_2", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_SSE42; cpu |= CPU_FEATURE_SSE42;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.aes", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.aes", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_AES; cpu |= CPU_FEATURE_AES;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.avx1_0", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.avx1_0", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_AVX; cpu |= CPU_FEATURE_AVX;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.avx2_0", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.avx2_0", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_AVX2; cpu |= CPU_FEATURE_AVX2;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.altivec", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.altivec", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_VMX; cpu |= CPU_FEATURE_VMX;
len = sizeof(size_t); len = sizeof(size_t);
if (sysctlbyname("hw.optional.neon", NULL, &len, NULL, 0) == 0) if (sysctlbyname("hw.optional.neon", NULL, &len, NULL, 0) == 0)
cpu |= RETRO_SIMD_NEON; cpu |= CPU_FEATURE_NEON;
#elif defined(CPU_X86) #elif defined(CPU_X86)
(void)avx_flags; (void)avx_flags;
@ -446,7 +444,7 @@ uint64_t retro_get_cpu_features(void)
vendor_shuffle[2] = flags[2]; vendor_shuffle[2] = flags[2];
memcpy(vendor, vendor_shuffle, sizeof(vendor_shuffle)); memcpy(vendor, vendor_shuffle, sizeof(vendor_shuffle));
RARCH_LOG("[CPUID]: Vendor: %s\n", vendor); printf("[CPUID]: Vendor: %s\n", vendor);
vendor_is_intel = ( vendor_is_intel = (
flags[1] == VENDOR_INTEL_b && flags[1] == VENDOR_INTEL_b &&
@ -460,52 +458,52 @@ uint64_t retro_get_cpu_features(void)
x86_cpuid(1, flags); x86_cpuid(1, flags);
if (flags[3] & (1 << 23)) if (flags[3] & (1 << 23))
cpu |= RETRO_SIMD_MMX; cpu |= CPU_FEATURE_MMX;
if (flags[3] & (1 << 25)) if (flags[3] & (1 << 25))
{ {
/* SSE also implies MMXEXT (according to FFmpeg source). */ /* SSE also implies MMXEXT (according to FFmpeg source). */
cpu |= RETRO_SIMD_SSE; cpu |= CPU_FEATURE_SSE;
cpu |= RETRO_SIMD_MMXEXT; cpu |= CPU_FEATURE_MMXEXT;
} }
if (flags[3] & (1 << 26)) if (flags[3] & (1 << 26))
cpu |= RETRO_SIMD_SSE2; cpu |= CPU_FEATURE_SSE2;
if (flags[2] & (1 << 0)) if (flags[2] & (1 << 0))
cpu |= RETRO_SIMD_SSE3; cpu |= CPU_FEATURE_SSE3;
if (flags[2] & (1 << 9)) if (flags[2] & (1 << 9))
cpu |= RETRO_SIMD_SSSE3; cpu |= CPU_FEATURE_SSSE3;
if (flags[2] & (1 << 19)) if (flags[2] & (1 << 19))
cpu |= RETRO_SIMD_SSE4; cpu |= CPU_FEATURE_SSE4;
if (flags[2] & (1 << 20)) if (flags[2] & (1 << 20))
cpu |= RETRO_SIMD_SSE42; cpu |= CPU_FEATURE_SSE42;
if ((flags[2] & (1 << 23))) if ((flags[2] & (1 << 23)))
cpu |= RETRO_SIMD_POPCNT; cpu |= CPU_FEATURE_POPCNT;
if (vendor_is_intel && (flags[2] & (1 << 22))) if (vendor_is_intel && (flags[2] & (1 << 22)))
cpu |= RETRO_SIMD_MOVBE; cpu |= CPU_FEATURE_MOVBE;
if (flags[2] & (1 << 25)) if (flags[2] & (1 << 25))
cpu |= RETRO_SIMD_AES; cpu |= CPU_FEATURE_AES;
/* Must only perform xgetbv check if we have /* Must only perform xgetbv check if we have
* AVX CPU support (guaranteed to have at least i686). */ * AVX CPU support (guaranteed to have at least i686). */
if (((flags[2] & avx_flags) == avx_flags) if (((flags[2] & avx_flags) == avx_flags)
&& ((xgetbv_x86(0) & 0x6) == 0x6)) && ((xgetbv_x86(0) & 0x6) == 0x6))
cpu |= RETRO_SIMD_AVX; cpu |= CPU_FEATURE_AVX;
if (max_flag >= 7) if (max_flag >= 7)
{ {
x86_cpuid(7, flags); x86_cpuid(7, flags);
if (flags[1] & (1 << 5)) if (flags[1] & (1 << 5))
cpu |= RETRO_SIMD_AVX2; cpu |= CPU_FEATURE_AVX2;
} }
x86_cpuid(0x80000000, flags); x86_cpuid(0x80000000, flags);
@ -514,55 +512,55 @@ uint64_t retro_get_cpu_features(void)
{ {
x86_cpuid(0x80000001, flags); x86_cpuid(0x80000001, flags);
if (flags[3] & (1 << 23)) if (flags[3] & (1 << 23))
cpu |= RETRO_SIMD_MMX; cpu |= CPU_FEATURE_MMX;
if (flags[3] & (1 << 22)) if (flags[3] & (1 << 22))
cpu |= RETRO_SIMD_MMXEXT; cpu |= CPU_FEATURE_MMXEXT;
} }
#elif defined(__linux__) #elif defined(__linux__)
cpu_flags = linux_get_cpu_features(); cpu_flags = linux_get_cpu_features();
if (cpu_flags & CPU_ARM_FEATURE_NEON) if (cpu_flags & CPU_ARM_FEATURE_NEON)
{ {
cpu |= RETRO_SIMD_NEON; cpu |= CPU_FEATURE_NEON;
#ifdef __ARM_NEON__ #ifdef __ARM_NEON__
arm_enable_runfast_mode(); arm_enable_runfast_mode();
#endif #endif
} }
if (cpu_flags & CPU_ARM_FEATURE_VFPv3) if (cpu_flags & CPU_ARM_FEATURE_VFPv3)
cpu |= RETRO_SIMD_VFPV3; cpu |= CPU_FEATURE_VFPV3;
#elif defined(__ARM_NEON__) #elif defined(__ARM_NEON__)
cpu |= RETRO_SIMD_NEON; cpu |= CPU_FEATURE_NEON;
arm_enable_runfast_mode(); arm_enable_runfast_mode();
#elif defined(__ALTIVEC__) #elif defined(__ALTIVEC__)
cpu |= RETRO_SIMD_VMX; cpu |= CPU_FEATURE_VMX;
#elif defined(XBOX360) #elif defined(XBOX360)
cpu |= RETRO_SIMD_VMX128; cpu |= CPU_FEATURE_VMX128;
#elif defined(PSP) #elif defined(PSP)
cpu |= RETRO_SIMD_VFPU; cpu |= CPU_FEATURE_VFPU;
#elif defined(GEKKO) #elif defined(GEKKO)
cpu |= RETRO_SIMD_PS; cpu |= CPU_FEATURE_PS;
#endif #endif
if (cpu & RETRO_SIMD_MMX) strlcat(buf, " MMX", sizeof(buf)); if (cpu & CPU_FEATURE_MMX) strlcat(buf, " MMX", sizeof(buf));
if (cpu & RETRO_SIMD_MMXEXT) strlcat(buf, " MMXEXT", sizeof(buf)); if (cpu & CPU_FEATURE_MMXEXT) strlcat(buf, " MMXEXT", sizeof(buf));
if (cpu & RETRO_SIMD_SSE) strlcat(buf, " SSE", sizeof(buf)); if (cpu & CPU_FEATURE_SSE) strlcat(buf, " SSE", sizeof(buf));
if (cpu & RETRO_SIMD_SSE2) strlcat(buf, " SSE2", sizeof(buf)); if (cpu & CPU_FEATURE_SSE2) strlcat(buf, " SSE2", sizeof(buf));
if (cpu & RETRO_SIMD_SSE3) strlcat(buf, " SSE3", sizeof(buf)); if (cpu & CPU_FEATURE_SSE3) strlcat(buf, " SSE3", sizeof(buf));
if (cpu & RETRO_SIMD_SSSE3) strlcat(buf, " SSSE3", sizeof(buf)); if (cpu & CPU_FEATURE_SSSE3) strlcat(buf, " SSSE3", sizeof(buf));
if (cpu & RETRO_SIMD_SSE4) strlcat(buf, " SSE4", sizeof(buf)); if (cpu & CPU_FEATURE_SSE4) strlcat(buf, " SSE4", sizeof(buf));
if (cpu & RETRO_SIMD_SSE42) strlcat(buf, " SSE4.2", sizeof(buf)); if (cpu & CPU_FEATURE_SSE42) strlcat(buf, " SSE4.2", sizeof(buf));
if (cpu & RETRO_SIMD_AES) strlcat(buf, " AES", sizeof(buf)); if (cpu & CPU_FEATURE_AES) strlcat(buf, " AES", sizeof(buf));
if (cpu & RETRO_SIMD_AVX) strlcat(buf, " AVX", sizeof(buf)); if (cpu & CPU_FEATURE_AVX) strlcat(buf, " AVX", sizeof(buf));
if (cpu & RETRO_SIMD_AVX2) strlcat(buf, " AVX2", sizeof(buf)); if (cpu & CPU_FEATURE_AVX2) strlcat(buf, " AVX2", sizeof(buf));
if (cpu & RETRO_SIMD_NEON) strlcat(buf, " NEON", sizeof(buf)); if (cpu & CPU_FEATURE_NEON) strlcat(buf, " NEON", sizeof(buf));
if (cpu & RETRO_SIMD_VFPV3) strlcat(buf, " VFPv3", sizeof(buf)); if (cpu & CPU_FEATURE_VFPV3) strlcat(buf, " VFPv3", sizeof(buf));
if (cpu & RETRO_SIMD_VFPV4) strlcat(buf, " VFPv4", sizeof(buf)); if (cpu & CPU_FEATURE_VFPV4) strlcat(buf, " VFPv4", sizeof(buf));
if (cpu & RETRO_SIMD_VMX) strlcat(buf, " VMX", sizeof(buf)); if (cpu & CPU_FEATURE_VMX) strlcat(buf, " VMX", sizeof(buf));
if (cpu & RETRO_SIMD_VMX128) strlcat(buf, " VMX128", sizeof(buf)); if (cpu & CPU_FEATURE_VMX128) strlcat(buf, " VMX128", sizeof(buf));
if (cpu & RETRO_SIMD_VFPU) strlcat(buf, " VFPU", sizeof(buf)); if (cpu & CPU_FEATURE_VFPU) strlcat(buf, " VFPU", sizeof(buf));
if (cpu & RETRO_SIMD_PS) strlcat(buf, " PS", sizeof(buf)); if (cpu & CPU_FEATURE_PS) strlcat(buf, " PS", sizeof(buf));
return cpu; return cpu;
} }

View File

@ -14,42 +14,78 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef _RARCH_PERF_H #ifndef _LIBRETRO_SDK_CPU_INFO_H
#define _RARCH_PERF_H #define _LIBRETRO_SDK_CPU_INFO_H
#include <stdint.h> #include <stdint.h>
#ifdef RARCH_INTERNAL
#include "libretro.h" #include "libretro.h"
#else
typedef uint64_t retro_perf_tick_t;
typedef uint64_t retro_time_t;
#endif
/* ID values for CPU features */
#define CPU_FEATURE_SSE (1 << 0)
#define CPU_FEATURE_SSE2 (1 << 1)
#define CPU_FEATURE_VMX (1 << 2)
#define CPU_FEATURE_VMX128 (1 << 3)
#define CPU_FEATURE_AVX (1 << 4)
#define CPU_FEATURE_NEON (1 << 5)
#define CPU_FEATURE_SSE3 (1 << 6)
#define CPU_FEATURE_SSSE3 (1 << 7)
#define CPU_FEATURE_MMX (1 << 8)
#define CPU_FEATURE_MMXEXT (1 << 9)
#define CPU_FEATURE_SSE4 (1 << 10)
#define CPU_FEATURE_SSE42 (1 << 11)
#define CPU_FEATURE_AVX2 (1 << 12)
#define CPU_FEATURE_VFPU (1 << 13)
#define CPU_FEATURE_PS (1 << 14)
#define CPU_FEATURE_AES (1 << 15)
#define CPU_FEATURE_VFPV3 (1 << 16)
#define CPU_FEATURE_VFPV4 (1 << 17)
#define CPU_FEATURE_POPCNT (1 << 18)
#define CPU_FEATURE_MOVBE (1 << 19)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/** /**
* retro_get_time_usec: * cpu_features_get_perf_counter:
*
* Gets performance counter.
*
* Returns: performance counter.
**/
retro_perf_tick_t cpu_features_get_perf_counter(void);
/**
* cpu_features_get_time_usec:
* *
* Gets time in microseconds. * * Gets time in microseconds. *
* Returns: time in microseconds. * Returns: time in microseconds.
**/ **/
retro_time_t retro_get_time_usec(void); retro_time_t cpu_features_get_time_usec(void);
/** /**
* retro_get_cpu_features: * cpu_features_get:
* *
* Gets CPU features.. * Gets CPU features..
* *
* Returns: bitmask of all CPU features available. * Returns: bitmask of all CPU features available.
**/ **/
uint64_t retro_get_cpu_features(void); uint64_t cpu_features_get(void);
/** /**
* retro_get_cpu_cores: * cpu_features_get_core_amount:
* *
* Gets the amount of available CPU cores. * Gets the amount of available CPU cores.
* *
* Returns: amount of CPU cores available. * Returns: amount of CPU cores available.
**/ **/
unsigned retro_get_cpu_cores(void); unsigned cpu_features_get_core_amount(void);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -17,6 +17,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "performance.h"
#include "performance_counters.h" #include "performance_counters.h"
#include "general.h" #include "general.h"
@ -133,7 +134,7 @@ void retro_perf_start(struct retro_perf_counter *perf)
return; return;
perf->call_cnt++; perf->call_cnt++;
perf->start = retro_get_perf_counter(); perf->start = cpu_features_get_perf_counter();
} }
void retro_perf_stop(struct retro_perf_counter *perf) void retro_perf_stop(struct retro_perf_counter *perf)
@ -141,5 +142,5 @@ void retro_perf_stop(struct retro_perf_counter *perf)
if (!runloop_ctl(RUNLOOP_CTL_IS_PERFCNT_ENABLE, NULL) || !perf) if (!runloop_ctl(RUNLOOP_CTL_IS_PERFCNT_ENABLE, NULL) || !perf)
return; return;
perf->total += retro_get_perf_counter() - perf->start; perf->total += cpu_features_get_perf_counter() - perf->start;
} }

View File

@ -1545,7 +1545,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
break; break;
case RARCH_CTL_VALIDATE_CPU_FEATURES: case RARCH_CTL_VALIDATE_CPU_FEATURES:
{ {
uint64_t cpu = retro_get_cpu_features(); uint64_t cpu = cpu_features_get();
(void)cpu; (void)cpu;
#ifdef __SSE__ #ifdef __SSE__
@ -1594,7 +1594,7 @@ int retroarch_get_capabilities(enum rarch_capabilities type,
{ {
case RARCH_CAPABILITIES_CPU: case RARCH_CAPABILITIES_CPU:
{ {
uint64_t cpu = retro_get_cpu_features(); uint64_t cpu = cpu_features_get();
if (cpu & RETRO_SIMD_MMX) if (cpu & RETRO_SIMD_MMX)
strlcat(s, "MMX ", len); strlcat(s, "MMX ", len);

View File

@ -1316,7 +1316,7 @@ int runloop_iterate(unsigned *sleep_ms)
(settings->fastforward_ratio == 0.0f) (settings->fastforward_ratio == 0.0f)
? 1.0f : settings->fastforward_ratio; ? 1.0f : settings->fastforward_ratio;
frame_limit_last_time = retro_get_time_usec(); frame_limit_last_time = cpu_features_get_time_usec();
frame_limit_minimum_time = (retro_time_t)roundf(1000000.0f frame_limit_minimum_time = (retro_time_t)roundf(1000000.0f
/ (av_info->timing.fps * fastforward_ratio)); / (av_info->timing.fps * fastforward_ratio));
@ -1343,7 +1343,7 @@ int runloop_iterate(unsigned *sleep_ms)
/* Updates frame timing if frame timing callback is in use by the core. /* Updates frame timing if frame timing callback is in use by the core.
* Limits frame time if fast forward ratio throttle is enabled. */ * Limits frame time if fast forward ratio throttle is enabled. */
retro_time_t current = retro_get_time_usec(); retro_time_t current = cpu_features_get_time_usec();
retro_time_t delta = current - runloop_frame_time_last; retro_time_t delta = current - runloop_frame_time_last;
bool is_locked_fps = (runloop_ctl(RUNLOOP_CTL_IS_PAUSED, NULL) || bool is_locked_fps = (runloop_ctl(RUNLOOP_CTL_IS_PAUSED, NULL) ||
input_driver_is_nonblock_state()) | input_driver_is_nonblock_state()) |
@ -1513,7 +1513,7 @@ int runloop_iterate(unsigned *sleep_ms)
end: end:
#endif #endif
current = retro_get_time_usec(); current = cpu_features_get_time_usec();
target = frame_limit_last_time + target = frame_limit_last_time +
frame_limit_minimum_time; frame_limit_minimum_time;
to_sleep_ms = (target - current) / 1000; to_sleep_ms = (target - current) / 1000;
@ -1526,7 +1526,7 @@ end:
return 1; return 1;
} }
frame_limit_last_time = retro_get_time_usec(); frame_limit_last_time = cpu_features_get_time_usec();
return 0; return 0;
} }