From 010878638d6510ff2992e33fda84e137a1c2a9e0 Mon Sep 17 00:00:00 2001 From: notaz Date: Thu, 21 May 2009 19:16:03 +0300 Subject: [PATCH] cache (on framebuffer mem) flush fix from 2007 (gpsp09-2xb_2) --- gp2x/Makefile | 2 +- gp2x/flush_cache.S | 8 ++++++++ video.c | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gp2x/flush_cache.S diff --git a/gp2x/Makefile b/gp2x/Makefile index 2d57ebb..2552ce5 100644 --- a/gp2x/Makefile +++ b/gp2x/Makefile @@ -11,7 +11,7 @@ STRIP = $(PREFIX)/bin/arm-open2x-linux-strip OBJS = main.o cpu.o memory.u video.o input.o sound.o gp2x.o gui.o \ cheats.o zip.o cpu_threaded.z cpu_speed.o cpuctrl.o \ gp2xminilib.o font.o display.o speedtest.o cmdline.o daemon.o \ - arm_stub.o video_blend.o + arm_stub.o video_blend.o flush_cache.o BIN = gpsp.gpe # Platform specific definitions diff --git a/gp2x/flush_cache.S b/gp2x/flush_cache.S new file mode 100644 index 0000000..4bde0e7 --- /dev/null +++ b/gp2x/flush_cache.S @@ -0,0 +1,8 @@ +@ vim:filetype=armasm + +.global gp2x_flush_cache @ beginning_addr, end_addr, flags + +gp2x_flush_cache: + swi #0x9f0002 + mov pc, lr + diff --git a/video.c b/video.c index e1f749e..19a4c11 100644 --- a/video.c +++ b/video.c @@ -93,6 +93,7 @@ SDL_Surface *hw_screen; #endif SDL_Surface *screen; const u32 video_scale = 1; +extern void gp2x_flush_cache(void *beginning_addr, void *end_addr, int flags); #define get_screen_pixels() \ ((u16 *)screen->pixels) \ @@ -3409,6 +3410,9 @@ void flip_screen() { SDL_BlitSurface(screen, NULL, hw_screen, NULL); } + /* it is unclear if this syscall takes virtual or physical addresses, + * but using virtual seems to work for me. */ + gp2x_flush_cache(hw_screen->pixels, hw_screen->pixels + 320*240, 0); } #else SDL_Flip(screen); -- 2.39.5