diff --git a/BasiliskII/ChangeLog b/BasiliskII/ChangeLog index 94b9682a..23e84b5c 100644 --- a/BasiliskII/ChangeLog +++ b/BasiliskII/ChangeLog @@ -1,3 +1,7 @@ +V0.9 - + - Unix: some performance improvements to VOSF screen update code + [Brian J. Johnson] + V0.9 (snapshot) - 17.Feb.2001 - adapted for mon V3.0 which is now the required minimum - UAE cpu: fixed a bug in the memory handlers preventing from diff --git a/BasiliskII/src/Unix/aclocal.m4 b/BasiliskII/src/Unix/aclocal.m4 index 3243d88f..83e412d9 100644 --- a/BasiliskII/src/Unix/aclocal.m4 +++ b/BasiliskII/src/Unix/aclocal.m4 @@ -370,3 +370,40 @@ int main () rm -f conf.esdtest ]) +dnl AM_ESD_SUPPORTS_MULTIPLE_RECORD([ACTION-IF-SUPPORTS [, ACTION-IF-NOT-SUPPORTS]]) +dnl Test, whether esd supports multiple recording clients (version >=0.2.21) +dnl +AC_DEFUN(AM_ESD_SUPPORTS_MULTIPLE_RECORD, +[dnl + AC_MSG_NOTICE([whether installed esd version supports multiple recording clients]) + ac_save_ESD_CFLAGS="$ESD_CFLAGS" + ac_save_ESD_LIBS="$ESD_LIBS" + AM_PATH_ESD(0.2.21, + ifelse([$1], , [ + AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, true) + AC_DEFINE(ESD_SUPPORTS_MULTIPLE_RECORD, 1, + [Define if you have esound with support of multiple recording clients.])], + [$1]), + ifelse([$2], , [AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, false)], [$2]) + if test "x$ac_save_ESD_CFLAGS" != x ; then + ESD_CFLAGS="$ac_save_ESD_CFLAGS" + fi + if test "x$ac_save_ESD_LIBS" != x ; then + ESD_LIBS="$ac_save_ESD_LIBS" + fi + ) +]) + +# Define a conditional. + +AC_DEFUN(AM_CONDITIONAL, +[AC_SUBST($1_TRUE) +AC_SUBST($1_FALSE) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + diff --git a/BasiliskII/src/Unix/video_vosf.h b/BasiliskII/src/Unix/video_vosf.h index 32711f30..bde296ed 100644 --- a/BasiliskII/src/Unix/video_vosf.h +++ b/BasiliskII/src/Unix/video_vosf.h @@ -227,89 +227,31 @@ static inline void update_display_window_vosf(void) const int bytes_per_row = VideoMonitor.bytes_per_row; const int bytes_per_pixel = VideoMonitor.bytes_per_row / VideoMonitor.x; - int i, j; + int i = y1 * bytes_per_row, j; - // Check for first column from left and first column - // from right that have changed - int x1, x2, width; if (depth == 1) { - x1 = VideoMonitor.x - 1; - for (j = y1; j <= y2; j++) { - uint8 * const p1 = &the_buffer[j * bytes_per_row]; - uint8 * const p2 = &the_buffer_copy[j * bytes_per_row]; - for (i = 0; i < (x1>>3); i++) { - if (p1[i] != p2[i]) { - x1 = i << 3; - break; - } - } - } - - x2 = x1; - for (j = y2; j >= y1; j--) { - uint8 * const p1 = &the_buffer[j * bytes_per_row]; - uint8 * const p2 = &the_buffer_copy[j * bytes_per_row]; - for (i = (VideoMonitor.x>>3) - 1; i > (x2>>3); i--) { - if (p1[i] != p2[i]) { - x2 = (i << 3) + 7; - break; - } - } - } - width = x2 - x1 + 1; - // Update the_host_buffer and copy of the_buffer - i = y1 * bytes_per_row + (x1 >> 3); for (j = y1; j <= y2; j++) { - Screen_blit(the_host_buffer + i, the_buffer + i, width >> 3); - memcpy(the_buffer_copy + i, the_buffer + i, width >> 3); + Screen_blit(the_host_buffer + i, the_buffer + i, VideoMonitor.x >> 3); i += bytes_per_row; } } else { - x1 = VideoMonitor.x * bytes_per_pixel - 1; - for (j = y1; j <= y2; j++) { - uint8 * const p1 = &the_buffer[j * bytes_per_row]; - uint8 * const p2 = &the_buffer_copy[j * bytes_per_row]; - for (i = 0; i < x1; i++) { - if (p1[i] != p2[i]) { - x1 = i; - break; - } - } - } - x1 /= bytes_per_pixel; - - x2 = x1 * bytes_per_pixel; - for (j = y2; j >= y1; j--) { - uint8 * const p1 = &the_buffer[j * bytes_per_row]; - uint8 * const p2 = &the_buffer_copy[j * bytes_per_row]; - for (i = VideoMonitor.x * bytes_per_pixel - 1; i > x2; i--) { - if (p1[i] != p2[i]) { - x2 = i; - break; - } - } - } - x2 /= bytes_per_pixel; - width = x2 - x1 + 1; - // Update the_host_buffer and copy of the_buffer - i = y1 * bytes_per_row + x1 * bytes_per_pixel; for (j = y1; j <= y2; j++) { - Screen_blit(the_host_buffer + i, the_buffer + i, bytes_per_pixel * width); - memcpy(the_buffer_copy + i, the_buffer + i, bytes_per_pixel * width); + Screen_blit(the_host_buffer + i, the_buffer + i, bytes_per_pixel * VideoMonitor.x); i += bytes_per_row; } } - + if (have_shm) - XShmPutImage(x_display, the_win, the_gc, img, x1, y1, x1, y1, width, height, 0); + XShmPutImage(x_display, the_win, the_gc, img, 0, y1, 0, y1, VideoMonitor.x, height, 0); else - XPutImage(x_display, the_win, the_gc, img, x1, y1, x1, y1, width, height); + XPutImage(x_display, the_win, the_gc, img, 0, y1, 0, y1, VideoMonitor.x, height); } + mainBuffer.dirty = false; } diff --git a/BasiliskII/src/Unix/video_x.cpp b/BasiliskII/src/Unix/video_x.cpp index ad3201f7..5f597c47 100644 --- a/BasiliskII/src/Unix/video_x.cpp +++ b/BasiliskII/src/Unix/video_x.cpp @@ -2053,6 +2053,7 @@ static void video_refresh_window_vosf(void) LOCK_VOSF; update_display_window_vosf(); UNLOCK_VOSF; + XSync(x_display, false); // Let the server catch up } } } @@ -2140,7 +2141,7 @@ static void *redraw_func(void *arg) ticks++; } uint64 end = GetTicks_usec(); - printf("%Ld ticks in %Ld usec = %Ld ticks/sec\n", ticks, end - start, ticks * 1000000 / (end - start)); + // printf("%Ld ticks in %Ld usec = %Ld ticks/sec\n", ticks, end - start, ticks * 1000000 / (end - start)); return NULL; } #endif