mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
config for x86 (32 bit only, for SH2 drc), add/revive profiling
This commit is contained in:
parent
78d817c370
commit
c1d15f7397
7 changed files with 91 additions and 15 deletions
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue