config for x86 (32 bit only, for SH2 drc), add/revive profiling

This commit is contained in:
kub 2019-03-20 20:33:43 +01:00
parent 78d817c370
commit c1d15f7397
7 changed files with 91 additions and 15 deletions

View file

@ -40,6 +40,10 @@ ifeq "$(pprof)" "1"
DEFINES += PPROF
SRCS_COMMON += $(R)platform/linux/pprof.c
endif
ifeq "$(gperf)" "1"
DEFINES += GPERF
LDFLAGS += -lprofiler -lstdc++
endif
# ARM asm stuff
ifeq "$(ARCH)" "arm"

View file

@ -90,6 +90,10 @@ int main(int argc, char *argv[])
emu_init();
menu_init();
#ifdef GPERF
ProfilerStart("gperf.out");
#endif
engineState = PGS_Menu;
if (argc > 1)
@ -145,6 +149,9 @@ int main(int argc, char *argv[])
}
endloop:
#ifdef GPERF
ProfilerStop();
#endif
emu_finish();
plat_finish();

View file

@ -1,21 +1,46 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <pico/pico_int.h>
int rc_mem[pp_total_points];
struct pp_counters *pp_counters;
int *refcounts = rc_mem;
static int shmemid;
static unsigned long devMem;
volatile unsigned long *gp2x_memregl;
volatile unsigned short *gp2x_memregs;
void pprof_init(void)
{
int this_is_new_shmem = 1;
key_t shmemkey;
void *shmem;
#if 0
devMem = open("/dev/mem", O_RDWR);
if (devMem == -1)
{
perror("pprof: open failed");
return;
}
gp2x_memregl = (unsigned long *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, devMem, 0xc0000000);
if (gp2x_memregl == (unsigned long *)-1)
{
perror("pprof: mmap failed");
return;
}
gp2x_memregs = (unsigned short *)gp2x_memregl;
#endif
#ifndef PPROF_TOOL
unsigned int tmp = pprof_get_one();
printf("pprof: measured diff is %u\n", pprof_get_one() - tmp);
@ -28,11 +53,11 @@ void pprof_init(void)
return;
}
#ifndef PPROF_TOOL
//#ifndef PPROF_TOOL
shmemid = shmget(shmemkey, sizeof(*pp_counters),
IPC_CREAT | IPC_EXCL | 0644);
if (shmemid == -1)
#endif
//#endif
{
shmemid = shmget(shmemkey, sizeof(*pp_counters),
0644);
@ -76,15 +101,18 @@ static const struct {
IT(draw),
IT(sound),
IT(m68k),
IT(s68k),
IT(mem68),
IT(z80),
IT(msh2),
IT(ssh2),
IT(memsh),
IT(dummy),
};
int main(int argc, char *argv[])
{
unsigned long long old[pp_total_points], new[pp_total_points];
pp_type old[pp_total_points], new[pp_total_points];
int base = 0;
int l, i;
@ -107,11 +135,12 @@ int main(int argc, char *argv[])
memcpy(new, pp_counters->counter, sizeof(new));
for (i = 0; i < ARRAY_SIZE(pp_tab); i++)
{
unsigned long long idiff = new[i] - old[i];
unsigned long long bdiff = (new[base] - old[base]) | 1;
pp_type idiff = new[i] - old[i];
pp_type bdiff = (new[base] - old[base]) | 1;
printf("%6.2f ", (double)idiff * 100.0 / bdiff);
}
printf("\n");
fflush(stdout);
memcpy(old, new, sizeof(old));
if (argc < 3)

View file

@ -7,21 +7,22 @@ enum pprof_points {
pp_draw,
pp_sound,
pp_m68k,
pp_s68k,
pp_mem68,
pp_z80,
pp_msh2,
pp_ssh2,
pp_memsh,
pp_dummy,
pp_total_points
};
struct pp_counters
{
unsigned long long counter[pp_total_points];
};
extern struct pp_counters *pp_counters;
extern int *refcounts;
#ifdef __i386__
typedef unsigned long long pp_type;
static __attribute__((always_inline)) inline unsigned int pprof_get_one(void)
{
unsigned long long ret;
@ -31,24 +32,38 @@ static __attribute__((always_inline)) inline unsigned int pprof_get_one(void)
#define unglitch_timer(x)
#elif defined(__GP2X__)
typedef unsigned long pp_type;
#if 0
// XXX: MMSP2 only, timer sometimes seems to return lower vals?
extern volatile unsigned long *gp2x_memregl;
#define pprof_get_one() (unsigned int)gp2x_memregl[0x0a00 >> 2]
#define unglitch_timer(di) \
if ((signed int)(di) < 0) di = 0
#else
extern unsigned int (*gp2x_get_ticks_us)(void);
#define pprof_get_one() gp2x_get_ticks_us()
#define unglitch_timer(di) \
if ((signed int)(di) < 0) di = 0
#endif
#else
#error no timer
#endif
struct pp_counters
{
pp_type counter[pp_total_points];
};
#define pprof_start(point) { \
unsigned int pp_start_##point = pprof_get_one()
unsigned int pp_start_##point = pprof_get_one(); refcounts[pp_##point]++
#define pprof_end(point) \
{ \
unsigned int di = pprof_get_one() - pp_start_##point; \
unglitch_timer(di); \
pp_counters->counter[pp_##point] += di; \
if (!--refcounts[pp_##point]) pp_counters->counter[pp_##point] += di; \
} \
}
@ -57,7 +72,7 @@ extern volatile unsigned long *gp2x_memregl;
{ \
unsigned int di = pprof_get_one() - pp_start_##point; \
unglitch_timer(di); \
pp_counters->counter[pp_##point] -= di; \
if (--refcounts[pp_##point]) pp_counters->counter[pp_##point] -= di; \
} \
}