// FIXME: pass real dimensions to blitters
static void mlc_flip(void *src, int bpp)
{
- u32 *srcp = NULL;
+ static int old_bpp;
// only pass pal to host if it's dirty
if (bpp <= 8 && mmsp2.dirty_pal) {
- srcp = mmsp2.mlc_stl_pallt_d32;
+ host_video_update_pal(mmsp2.mlc_stl_pallt_d32);
mmsp2.dirty_pal = 0;
}
+ if (bpp != old_bpp) {
+ host_video_change_bpp(bpp);
+ old_bpp = bpp;
+ }
+
switch (bpp) {
case 4:
- host_video_blit4(src, 320, 240, srcp);
+ host_video_blit4(src, 320, 240);
break;
case 8:
- host_video_blit8(src, 320, 240, srcp);
+ host_video_blit8(src, 320, 240);
break;
case 16:
} \
}
+static int fb_sync_thread_paused;
+
static void *fb_sync_thread(void *arg)
{
int invalid_fb_addr = 1;
sleep(1);
continue;
}
+ if (fb_sync_thread_paused) {
+ ts_add_nsec(ts, 100000000);
+ continue;
+ }
if (wait_ret != ETIMEDOUT) {
clock_gettime(CLOCK_REALTIME, &ts);
}
}
+static void fb_thread_pause(void)
+{
+ fb_sync_thread_paused = 1;
+ // wait until it finishes last refresh
+ // that it might be doing now
+ usleep(10000);
+}
+
+static void fb_thread_resume(void)
+{
+ fb_sync_thread_paused = 0;
+}
+
static u32 xread8(u32 a)
{
iolog("r8 ", a, 0, 8);
static char tmp_path[512];
const char *p2;
char *p;
+ int ret;
if (command == NULL)
return -1;
free((void *)p2);
dbg("system: \"%s\"\n", tmp_path);
- return system(tmp_path);
+
+ // the app might want the screen too..
+ fb_thread_pause();
+ ret = system(tmp_path);
+ fb_thread_resume();
+ return ret;
}