From: notaz Date: Sat, 2 Jan 2010 22:25:55 +0000 (+0000) Subject: pprof: workaround for MMSP2 timer glitch, add draw2 X-Git-Tag: v1.85~200 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25eb407c56c95255fc1b88afe084bd5ae393193d;p=picodrive.git pprof: workaround for MMSP2 timer glitch, add draw2 git-svn-id: file:///home/notaz/opt/svn/PicoDrive@852 be3aeb3a-fb24-0410-a615-afba39da0efa --- diff --git a/pico/draw2.c b/pico/draw2.c index b2e6a710..575f6f7d 100644 --- a/pico/draw2.c +++ b/pico/draw2.c @@ -613,11 +613,16 @@ static void DrawDisplayFull(void) PICO_INTERNAL void PicoFrameFull() { + pprof_start(draw); + // prepare cram? if (PicoPrepareCram) PicoPrepareCram(); // Draw screen: BackFillFull(Pico.video.reg[7]); - if (Pico.video.reg[1]&0x40) DrawDisplayFull(); + if (Pico.video.reg[1] & 0x40) + DrawDisplayFull(); + + pprof_end(draw); } diff --git a/platform/linux/Makefile b/platform/linux/Makefile index 3362a738..627c2e21 100644 --- a/platform/linux/Makefile +++ b/platform/linux/Makefile @@ -89,7 +89,7 @@ PicoDrive : $(OBJS) $(CC) $(CFLAGS) $^ $(LDFLAGS) -Wl,-Map=PicoDrive.map -o $@ pprof: pprof.c - $(CROSS)gcc -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@ -lrt + $(CROSS)gcc -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@ %.o : %.asm @echo ">>>" $< diff --git a/platform/linux/pprof.h b/platform/linux/pprof.h index 88a97e3e..cccbcbd5 100644 --- a/platform/linux/pprof.h +++ b/platform/linux/pprof.h @@ -28,11 +28,14 @@ static __attribute__((always_inline)) inline unsigned int pprof_get_one(void) __asm__ __volatile__ ("rdtsc" : "=A" (ret)); return (unsigned int)ret; } +#define unglitch_timer(x) #elif defined(__GP2X__) -// XXX: MMSP2 only +// 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 #error no timer @@ -40,12 +43,22 @@ extern volatile unsigned long *gp2x_memregl; #define pprof_start(point) { \ unsigned int pp_start_##point = pprof_get_one() + #define pprof_end(point) \ - pp_counters->counter[pp_##point] += pprof_get_one() - pp_start_##point; \ + { \ + unsigned int di = pprof_get_one() - pp_start_##point; \ + unglitch_timer(di); \ + pp_counters->counter[pp_##point] += di; \ + } \ } + // subtract for recursive stuff #define pprof_end_sub(point) \ - pp_counters->counter[pp_##point] -= pprof_get_one() - pp_start_##point; \ + { \ + unsigned int di = pprof_get_one() - pp_start_##point; \ + unglitch_timer(di); \ + pp_counters->counter[pp_##point] -= di; \ + } \ } extern void pprof_init(void);