summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2009-05-21 19:16:03 +0300
committernotaz2009-05-21 19:16:03 +0300
commit010878638d6510ff2992e33fda84e137a1c2a9e0 (patch)
tree9ff8ba3125ceab51d86dfbdefb186658df4e2893
parente9c7b1376a93375f3ebbc5b58c9b69c065b17060 (diff)
downloadpicogpsp-010878638d6510ff2992e33fda84e137a1c2a9e0.tar.gz
picogpsp-010878638d6510ff2992e33fda84e137a1c2a9e0.tar.bz2
picogpsp-010878638d6510ff2992e33fda84e137a1c2a9e0.zip
cache (on framebuffer mem) flush fix from 2007 (gpsp09-2xb_2)
-rw-r--r--gp2x/Makefile2
-rw-r--r--gp2x/flush_cache.S8
-rw-r--r--video.c4
3 files changed, 13 insertions, 1 deletions
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);