cache (on framebuffer mem) flush fix from 2007 (gpsp09-2xb_2)
authornotaz <pixelinis>
Thu, 21 May 2009 16:16:03 +0000 (19:16 +0300)
committernotaz <pixelinis>
Thu, 21 May 2009 16:16:03 +0000 (19:16 +0300)
gp2x/Makefile
gp2x/flush_cache.S [new file with mode: 0644]
video.c

index 2d57ebb..2552ce5 100644 (file)
@@ -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 (file)
index 0000000..4bde0e7
--- /dev/null
@@ -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 (file)
--- 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);