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)
{
unsigned i;
dspfilter_simd_mask_t mask = retro_get_cpu_features();
dspfilter_simd_mask_t mask = cpu_features_get();
(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)
{
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++)
{

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)
{
#ifdef RARCH_INTERNAL
return retro_get_cpu_features();
return cpu_features_get();
#else
return perf_get_cpu_features_cb();
#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)
{
#ifdef RARCH_INTERNAL
return retro_get_cpu_features();
return cpu_features_get();
#else
return perf_get_cpu_features_cb();
#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;
RARCH_LOG("Environ GET_PERF_INTERFACE.\n");
cb->get_time_usec = retro_get_time_usec;
cb->get_cpu_features = retro_get_cpu_features;
cb->get_perf_counter = retro_get_perf_counter;
cb->get_time_usec = cpu_features_get_time_usec;
cb->get_cpu_features = cpu_features_get;
cb->get_perf_counter = cpu_features_get_perf_counter;
cb->perf_register = retro_perf_register;
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 fps_time;
retro_time_t new_time = retro_get_time_usec();
retro_time_t new_time = cpu_features_get_time_usec();
*buf = '\0';

View File

@ -204,7 +204,7 @@ static bool create_softfilter_graph(rarch_softfilter_t *filt,
filt->impl_data = filt->impl->create(
&softfilter_config, input_fmt, input_fmt, max_width, max_height,
threads != RARCH_SOFTFILTER_THREADS_AUTO ? threads :
retro_get_cpu_cores(), cpu_features,
cpu_features_get_core_amount(), cpu_features,
&userdata);
if (!filt->impl_data)
{
@ -262,7 +262,7 @@ static bool append_softfilter_plugs(rarch_softfilter_t *filt,
struct string_list *list)
{
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++)
{
@ -345,7 +345,7 @@ static bool append_softfilter_plugs(rarch_softfilter_t *filt,
struct string_list *list)
{
unsigned i;
softfilter_simd_mask_t mask = retro_get_cpu_features();
softfilter_simd_mask_t mask = cpu_features_get();
(void)list;
@ -382,7 +382,7 @@ rarch_softfilter_t *rarch_softfilter_new(const char *filter_config,
enum retro_pixel_format in_pixel_format,
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];
#ifdef HAVE_DYLIB
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. */
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;
if (delta <= 0)
@ -743,7 +743,7 @@ static bool video_thread_frame(void *data, const void *frame_,
retro_perf_stop(&thr_frame);
thr->last_time = retro_get_time_usec();
thr->last_time = cpu_features_get_time_usec();
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);
thr->last_time = retro_get_time_usec();
thr->last_time = cpu_features_get_time_usec();
thr->thread = sthread_create(video_thread_loop, thr);
if (!thr->thread)

View File

@ -53,11 +53,11 @@ static int action_iterate_help(menu_handle_t *menu,
int64_t timeout;
static bool timer_begin = false;
static bool timer_end = false;
int64_t current = retro_get_time_usec();
int64_t current = cpu_features_get_time_usec();
if (!timer_begin)
{
timeout_end = retro_get_time_usec() +
timeout_end = cpu_features_get_time_usec() +
3 /* seconds */ * 1000000;
timer_begin = true;
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;
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;
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.begin++;
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;
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->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;
keys.userdata = menu;
@ -574,7 +574,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len)
struct menu_bind_state binds;
bool timed_out = false;
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 =
(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.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;
timed_out = true;
}
@ -631,7 +631,7 @@ static bool menu_input_key_bind_iterate(char *s, size_t len)
}
binds.target++;
binds.timeout_end = retro_get_time_usec() +
binds.timeout_end = cpu_features_get_time_usec() +
MENU_KEYBOARD_BIND_TIMEOUT_SECONDS * 1000000;
}
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)
{
uint8_t* data;
size_t length;
char* res;
int ret = NET_HTTP_GET_OK;
struct http_t* http = NULL;
retro_time_t t0 = retro_get_time_usec();
uint8_t* data = NULL;
char* res = NULL;
int ret = NET_HTTP_GET_OK;
struct http_t* http = NULL;
retro_time_t t0 = cpu_features_get_time_usec();
struct http_connection_t *conn = net_http_connection_new(url);
*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))
{
/* Timeout error. */
if (timeout && (retro_get_time_usec() - t0) > *timeout)
if (timeout && (cpu_features_get_time_usec() - t0) > *timeout)
{
ret = NET_HTTP_GET_TIMEOUT;
goto error;
@ -99,7 +99,7 @@ error:
if (timeout)
{
t0 = retro_get_time_usec() - t0;
t0 = cpu_features_get_time_usec() - t0;
if (t0 < *timeout)
*timeout -= t0;

View File

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

View File

@ -14,42 +14,78 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _RARCH_PERF_H
#define _RARCH_PERF_H
#ifndef _LIBRETRO_SDK_CPU_INFO_H
#define _LIBRETRO_SDK_CPU_INFO_H
#include <stdint.h>
#ifdef RARCH_INTERNAL
#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
extern "C" {
#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. *
* 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..
*
* 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.
*
* Returns: amount of CPU cores available.
**/
unsigned retro_get_cpu_cores(void);
unsigned cpu_features_get_core_amount(void);
#ifdef __cplusplus

View File

@ -17,6 +17,7 @@
#include <stdio.h>
#include <string.h>
#include "performance.h"
#include "performance_counters.h"
#include "general.h"
@ -133,7 +134,7 @@ void retro_perf_start(struct retro_perf_counter *perf)
return;
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)
@ -141,5 +142,5 @@ void retro_perf_stop(struct retro_perf_counter *perf)
if (!runloop_ctl(RUNLOOP_CTL_IS_PERFCNT_ENABLE, NULL) || !perf)
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;
case RARCH_CTL_VALIDATE_CPU_FEATURES:
{
uint64_t cpu = retro_get_cpu_features();
uint64_t cpu = cpu_features_get();
(void)cpu;
#ifdef __SSE__
@ -1594,7 +1594,7 @@ int retroarch_get_capabilities(enum rarch_capabilities type,
{
case RARCH_CAPABILITIES_CPU:
{
uint64_t cpu = retro_get_cpu_features();
uint64_t cpu = cpu_features_get();
if (cpu & RETRO_SIMD_MMX)
strlcat(s, "MMX ", len);

View File

@ -1316,7 +1316,7 @@ int runloop_iterate(unsigned *sleep_ms)
(settings->fastforward_ratio == 0.0f)
? 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
/ (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.
* 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;
bool is_locked_fps = (runloop_ctl(RUNLOOP_CTL_IS_PAUSED, NULL) ||
input_driver_is_nonblock_state()) |
@ -1513,7 +1513,7 @@ int runloop_iterate(unsigned *sleep_ms)
end:
#endif
current = retro_get_time_usec();
current = cpu_features_get_time_usec();
target = frame_limit_last_time +
frame_limit_minimum_time;
to_sleep_ms = (target - current) / 1000;
@ -1526,7 +1526,7 @@ end:
return 1;
}
frame_limit_last_time = retro_get_time_usec();
frame_limit_last_time = cpu_features_get_time_usec();
return 0;
}