Initial SDL/video support. Fix VOSF code could lead to a crash on run-time

resolution/depth switching. Rearrange blitter lookup code, aka make it cleaner.
This commit is contained in:
gbeauche 2004-06-23 14:30:48 +00:00
parent 7af8aaed40
commit 19494038b3
9 changed files with 235 additions and 99 deletions

View File

@ -34,7 +34,7 @@ SRCS = ../main.cpp main_unix.cpp ../prefs.cpp ../prefs_items.cpp prefs_unix.cpp
../emul_op.cpp ../macos_util.cpp ../xpram.cpp xpram_unix.cpp ../timer.cpp \
timer_unix.cpp clip_unix.cpp ../adb.cpp ../serial.cpp ../ether.cpp \
../sony.cpp ../disk.cpp ../cdrom.cpp ../scsi.cpp ../video.cpp video_blit.cpp \
video_x.cpp vm_alloc.cpp sigsegv.cpp ../audio.cpp ../extfs.cpp extfs_unix.cpp \
vm_alloc.cpp sigsegv.cpp ../audio.cpp ../extfs.cpp extfs_unix.cpp \
../user_strings.cpp user_strings_unix.cpp sshpty.c strlcpy.c \
$(SYSSRCS) $(CPUSRCS)
APP = BasiliskII

View File

@ -19,9 +19,6 @@
*/
#include "sysdeps.h"
#include <X11/Xlib.h>
#include "clip.h"
#include "macos_util.h"
#include "prefs.h"
@ -30,8 +27,11 @@
#include "debug.h"
// From main_unix.cpp
// From video_x.cpp
#ifndef USE_SDL_VIDEO
#include <X11/Xlib.h>
extern Display *x_display;
#endif
// Conversion tables
@ -87,6 +87,7 @@ void PutScrap(uint32 type, void *scrap, int32 length)
if (length <= 0)
return;
#ifndef USE_SDL_VIDEO
switch (type) {
case FOURCC('T','E','X','T'):
D(bug(" clipping TEXT\n"));
@ -110,4 +111,5 @@ void PutScrap(uint32 type, void *scrap, int32 length)
delete[] buf;
break;
}
#endif
}

View File

@ -20,6 +20,9 @@ AC_ARG_ENABLE(xf86-vidmode, [ --enable-xf86-vidmode use the XFree86 VidMode
AC_ARG_ENABLE(fbdev-dga, [ --enable-fbdev-dga use direct frame buffer access via /dev/fb [default=yes]], [WANT_FBDEV_DGA=$enableval], [WANT_FBDEV_DGA=yes])
AC_ARG_ENABLE(vosf, [ --enable-vosf enable video on SEGV signals [default=yes]], [WANT_VOSF=$enableval], [WANT_VOSF=yes])
dnl SDL options.
AC_ARG_ENABLE(sdl-video, [ --enable-sdl-video use SDL for video graphics [default=no]], [WANT_SDL_VIDEO=$enableval], [WANT_SDL_VIDEO=no])
dnl JIT compiler options.
AC_ARG_ENABLE(jit-compiler, [ --enable-jit-compiler enable JIT compiler [default=no]], [WANT_JIT=$enableval], [WANT_JIT=no])
AC_ARG_ENABLE(jit-debug, [ --enable-jit-debug activate native code disassemblers [default=no]], [WANT_JIT_DEBUG=$enableval], [WANT_JIT_DEBUG=no])
@ -123,14 +126,39 @@ dnl Checks for libraries.
AC_CHECK_LIB(posix4, sem_init)
AC_CHECK_LIB(rt, timer_create)
dnl We need X11.
AC_PATH_XTRA
if [[ "x$no_x" = "xyes" ]]; then
AC_MSG_ERROR([You need X11 to run Basilisk II.])
dnl Do we need SDL?
WANT_SDL=no
SDL_SUPPORT="none"
if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
WANT_SDL=yes
WANT_XF86_DGA=no
WANT_XF86_VIDMODE=no
WANT_FBDEV_DGA=no
SDL_SUPPORT="video"
fi
if [[ "x$WANT_SDL" = "xyes" ]]; then
AC_PATH_PROG(sdl_config, "sdl-config")
if [[ -n "$sdl_config" ]]; then
sdl_cflags=`$sdl_config --cflags`
sdl_libs=`$sdl_config --libs`
CFLAGS="$CFLAGS $sdl_cflags"
CXXFLAGS="$CXXFLAGS $sdl_cflags"
LIBS="$LIBS $sdl_libs"
else
WANT_SDL=no
fi
fi
dnl We need X11, if not using SDL.
if [[ "x$WANT_SDL" = "xno" ]]; then
AC_PATH_XTRA
if [[ "x$no_x" = "xyes" ]]; then
AC_MSG_ERROR([You need X11 to run Basilisk II.])
fi
CFLAGS="$CFLAGS $X_CFLAGS"
CXXFLAGS="$CXXFLAGS $X_CFLAGS"
LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS"
fi
CFLAGS="$CFLAGS $X_CFLAGS"
CXXFLAGS="$CXXFLAGS $X_CFLAGS"
LIBS="$LIBS $X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS"
dnl We want pthreads. Try libpthread first, then libc_r (FreeBSD), then PTL.
HAVE_PTHREADS=yes
@ -385,6 +413,16 @@ irix*)
;;
esac
dnl SDL overrides
if [[ "x$WANT_SDL" = "xyes" ]]; then
AC_DEFINE(USE_SDL, 1, [Define to enble SDL support])
fi
if [[ "x$WANT_SDL_VIDEO" = "xyes" ]]; then
VIDEOSRC="../SDL/video_sdl.cpp"
AC_DEFINE(USE_SDL_VIDEO, 1, [Define to enable SDL video graphics support])
else
VIDEOSRC="video_x.cpp"
fi
dnl Use 68k CPU natively?
WANT_NATIVE_M68K=no
@ -400,7 +438,7 @@ if [[ "x$HAVE_PTHREADS" = "xno" ]]; then
ETHERSRC=../dummy/ether_dummy.cpp
AUDIOSRC=../dummy/audio_dummy.cpp
fi
SYSSRCS="$SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $MONSRCS $EXTRASYSSRCS"
SYSSRCS="$VIDEOSRC $SERIALSRC $ETHERSRC $SCSISRC $AUDIOSRC $SEMSRC $UISRCS $MONSRCS $EXTRASYSSRCS"
dnl Define a macro that translates a yesno-variable into a C macro definition
dnl to be put into the config.h file
@ -1204,6 +1242,7 @@ dnl Print summary.
echo
echo Basilisk II configuration summary:
echo
echo SDL support ............................ : $SDL_SUPPORT
echo XFree86 DGA support .................... : $WANT_XF86_DGA
echo XFree86 VidMode support ................ : $WANT_XF86_VIDMODE
echo fbdev DGA support ...................... : $WANT_FBDEV_DGA

View File

@ -24,7 +24,14 @@
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <X11/Xlib.h>
#ifdef USE_SDL
# include <SDL.h>
#endif
#ifndef USE_SDL_VIDEO
# include <X11/Xlib.h>
#endif
#ifdef HAVE_PTHREADS
# include <pthread.h>
@ -119,8 +126,10 @@ bool TwentyFourBitAddressing;
// Global variables
char *x_display_name = NULL; // X11 display name
Display *x_display = NULL; // X11 display handle
#ifndef USE_SDL_VIDEO
extern char *x_display_name; // X11 display name
extern Display *x_display; // X11 display handle
#endif
static uint8 last_xpram[XPRAM_SIZE]; // Buffer for monitoring XPRAM changes
@ -300,10 +309,12 @@ int main(int argc, char **argv)
for (int i=1; i<argc; i++) {
if (strcmp(argv[i], "--help") == 0) {
usage(argv[0]);
#ifndef USE_SDL_VIDEO
} else if (strcmp(argv[i], "--display") == 0) {
i++; // don't remove the argument, gtk_init() needs it too
if (i < argc)
x_display_name = strdup(argv[i]);
#endif
} else if (strcmp(argv[i], "--break") == 0) {
argv[i++] = NULL;
if (i < argc) {
@ -361,6 +372,7 @@ int main(int argc, char **argv)
}
}
#ifndef USE_SDL_VIDEO
// Open display
x_display = XOpenDisplay(x_display_name);
if (x_display == NULL) {
@ -374,6 +386,22 @@ int main(int argc, char **argv)
// Fork out, so we can return from fullscreen mode when things get ugly
XF86DGAForkApp(DefaultScreen(x_display));
#endif
#endif
#ifdef USE_SDL
// Initialize SDL system
int sdl_flags = 0;
#ifdef USE_SDL_VIDEO
sdl_flags |= SDL_INIT_VIDEO;
#endif
assert(sdl_flags != 0);
if (SDL_Init(sdl_flags) == -1) {
char str[256];
sprintf(str, "Could not initialize SDL: %s.\n", SDL_GetError());
ErrorAlert(str);
QuitEmulator();
}
#endif
// Init system routines
SysInit();
@ -756,9 +784,14 @@ void QuitEmulator(void)
// Exit preferences
PrefsExit();
#ifdef USE_SDL
// Exit SDL system
SDL_Quit();
#else
// Close X11 server connection
if (x_display)
XCloseDisplay(x_display);
#endif
exit(0);
}
@ -1006,7 +1039,7 @@ static void one_tick(...)
one_second();
}
#ifndef HAVE_PTHREADS
#if !defined(HAVE_PTHREADS) && !defined(USE_SDL_VIDEO)
// No threads available, perform video refresh and networking from here
VideoRefresh();
SetInterruptFlag(INTFLAG_ETHER);
@ -1396,7 +1429,7 @@ void display_alert(int title_id, int prefix_id, int button_id, const char *text)
void ErrorAlert(const char *text)
{
#ifdef ENABLE_GTK
#if defined(ENABLE_GTK) && !defined(USE_SDL_VIDEO)
if (PrefsFindBool("nogui") || x_display == NULL) {
printf(GetString(STR_SHELL_ERROR_PREFIX), text);
return;
@ -1415,7 +1448,7 @@ void ErrorAlert(const char *text)
void WarningAlert(const char *text)
{
#ifdef ENABLE_GTK
#if defined(ENABLE_GTK) && !defined(USE_SDL_VIDEO)
if (PrefsFindBool("nogui") || x_display == NULL) {
printf(GetString(STR_SHELL_WARNING_PREFIX), text);
return;

View File

@ -98,8 +98,8 @@
#endif
/* Direct Addressing requires Video on SEGV signals */
#if DIRECT_ADDRESSING && !ENABLE_VOSF
/* Direct Addressing requires Video on SEGV signals in plain X11 mode */
#if DIRECT_ADDRESSING && (!ENABLE_VOSF && !USE_SDL_VIDEO)
# undef ENABLE_VOSF
# define ENABLE_VOSF 1
#endif

View File

@ -20,24 +20,20 @@
#include "sysdeps.h"
#include "video.h"
#include "video_blit.h"
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef ENABLE_VOSF
// Format of the target visual
struct VisualFormat {
int depth; // Screen depth
uint32 Rmask, Gmask, Bmask; // RGB mask values
uint32 Rshift, Gshift, Bshift; // RGB shift values
};
static VisualFormat visualFormat;
// This holds the pixels values of the palette colors for 8->16/32-bit expansion
uint32 ExpandMap[256];
// Mark video_blit.h for specialization
#define DEFINE_VIDEO_BLITTERS 1
/* -------------------------------------------------------------------------- */
/* --- Raw Copy / No conversion required --- */
/* -------------------------------------------------------------------------- */
@ -306,9 +302,25 @@ static void Blit_Copy_Raw(uint8 * dest, const uint8 * source, uint32 length)
#include "video_blit.h"
/* -------------------------------------------------------------------------- */
/* --- 2/4-bit indexed to 8-bit mode conversion --- */
/* --- 1/2/4-bit indexed to 8-bit mode conversion --- */
/* -------------------------------------------------------------------------- */
static void Blit_Expand_1_To_8(uint8 * dest, const uint8 * p, uint32 length)
{
uint8 *q = (uint8 *)dest;
for (uint32 i=0; i<length; i++) {
uint8 c = *p++;
*q++ = c >> 7;
*q++ = (c >> 6) & 1;
*q++ = (c >> 5) & 1;
*q++ = (c >> 4) & 1;
*q++ = (c >> 3) & 1;
*q++ = (c >> 2) & 1;
*q++ = (c >> 1) & 1;
*q++ = c & 1;
}
}
static void Blit_Expand_2_To_8(uint8 * dest, const uint8 * p, uint32 length)
{
uint8 *q = (uint8 *)dest;
@ -444,22 +456,23 @@ static Screen_blit_func_info Screen_blitters[] = {
// Initialize the framebuffer update function
// Returns FALSE, if the function was to be reduced to a simple memcpy()
// --> In that case, VOSF is not necessary
bool Screen_blitter_init(XVisualInfo * visual_info, bool native_byte_order, int mac_depth)
bool Screen_blitter_init(VisualFormat const & visual_format, bool native_byte_order, int mac_depth)
{
#if USE_SDL_VIDEO
const bool use_sdl_video = true;
#else
const bool use_sdl_video = false;
#endif
#if REAL_ADDRESSING || DIRECT_ADDRESSING
if (mac_depth == 1) {
if (!use_sdl_video && mac_depth == 1) {
// 1-bit mode uses a 1-bit X image, so there's no need for special blitting routines
Screen_blit = Blit_Copy_Raw;
} else {
visualFormat.depth = visual_info->depth;
visualFormat.Rmask = visual_info->red_mask;
visualFormat.Gmask = visual_info->green_mask;
visualFormat.Bmask = visual_info->blue_mask;
// Compute RGB shift values
visualFormat = visual_format;
visualFormat.Rshift = 0;
for (uint32 Rmask = visualFormat.Rmask; Rmask && ((Rmask & 1) != 1); Rmask >>= 1)
++visualFormat.Rshift;
@ -470,40 +483,34 @@ bool Screen_blitter_init(XVisualInfo * visual_info, bool native_byte_order, int
for (uint32 Bmask = visualFormat.Bmask; Bmask && ((Bmask & 1) != 1); Bmask >>= 1)
++visualFormat.Bshift;
bool blitter_found = false;
// 2/4/8-bit mode on 8/16/32-bit screen?
if (visualFormat.depth == 8) {
if (mac_depth == 2) {
Screen_blit = Blit_Expand_2_To_8;
blitter_found = true;
} else if (mac_depth == 4) {
Screen_blit = Blit_Expand_4_To_8;
blitter_found = true;
// 1/2/4/8-bit mode on 8/16/32-bit screen?
Screen_blit = NULL;
switch (visualFormat.depth) {
case 8:
switch (mac_depth) {
case 1: Screen_blit = Blit_Expand_1_To_8; break;
case 2: Screen_blit = Blit_Expand_2_To_8; break;
case 4: Screen_blit = Blit_Expand_4_To_8; break;
}
} else if (visualFormat.depth == 15 || visualFormat.depth == 16) {
if (mac_depth == 2) {
Screen_blit = Blit_Expand_2_To_16;
blitter_found = true;
} else if (mac_depth == 4) {
Screen_blit = Blit_Expand_4_To_16;
blitter_found = true;
} else if (mac_depth == 8) {
Screen_blit = Blit_Expand_8_To_16;
blitter_found = true;
break;
case 15:
case 16:
switch (mac_depth) {
case 2: Screen_blit = Blit_Expand_2_To_16; break;
case 4: Screen_blit = Blit_Expand_4_To_16; break;
case 8: Screen_blit = Blit_Expand_8_To_16; break;
}
} else if (visualFormat.depth == 24 || visualFormat.depth == 32) {
if (mac_depth == 2) {
Screen_blit = Blit_Expand_2_To_32;
blitter_found = true;
} else if (mac_depth == 4) {
Screen_blit = Blit_Expand_4_To_32;
blitter_found = true;
} else if (mac_depth == 8) {
Screen_blit = Blit_Expand_8_To_32;
blitter_found = true;
break;
case 24:
case 32:
switch (mac_depth) {
case 2: Screen_blit = Blit_Expand_2_To_32; break;
case 4: Screen_blit = Blit_Expand_4_To_32; break;
case 8: Screen_blit = Blit_Expand_8_To_32; break;
}
break;
}
bool blitter_found = (Screen_blit != NULL);
// Search for an adequate blit function
const int blitters_count = sizeof(Screen_blitters)/sizeof(Screen_blitters[0]);
@ -542,4 +549,3 @@ bool Screen_blitter_init(XVisualInfo * visual_info, bool native_byte_order, int
// --> In that case, we return FALSE
return (Screen_blit != Blit_Copy_Raw);
}
#endif /* ENABLE_VOSF */

View File

@ -18,6 +18,26 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEFINE_VIDEO_BLITTERS
#ifndef VIDEO_BLIT_H
#define VIDEO_BLIT_H
// Format of the target visual
struct VisualFormat {
int depth; // Screen depth
uint32 Rmask, Gmask, Bmask; // RGB mask values
uint32 Rshift, Gshift, Bshift; // RGB shift values
};
extern void (*Screen_blit)(uint8 * dest, const uint8 * source, uint32 length);
extern bool Screen_blitter_init(VisualFormat const & visual_format, bool native_byte_order, int mac_depth);
extern uint32 ExpandMap[256];
#endif /* VIDEO_BLIT_H */
#else
#ifndef FB_DEPTH
# error "Undefined screen depth"
#endif
@ -128,3 +148,5 @@ static void FB_FUNC_NAME(uint8 * dest, const uint8 * source, uint32 length)
#ifdef FB_DEPTH
#undef FB_DEPTH
#endif
#endif /* DEFINE_VIDEO_BLITTERS */

View File

@ -31,7 +31,38 @@
// Glue for SheepShaver and BasiliskII
#if POWERPC_ROM
#define X11_MONITOR_INIT /* nothing */
enum {
VIDEO_DEPTH_1BIT = APPLE_1_BIT,
VIDEO_DEPTH_2BIT = APPLE_2_BIT,
VIDEO_DEPTH_4BIT = APPLE_4_BIT,
VIDEO_DEPTH_8BIT = APPLE_8_BIT,
VIDEO_DEPTH_16BIT = APPLE_16_BIT,
VIDEO_DEPTH_32BIT = APPLE_32_BIT
};
#else
enum {
VIDEO_DEPTH_1BIT = VDEPTH_1BIT,
VIDEO_DEPTH_2BIT = VDEPTH_2BIT,
VIDEO_DEPTH_4BIT = VDEPTH_4BIT,
VIDEO_DEPTH_8BIT = VDEPTH_8BIT,
VIDEO_DEPTH_16BIT = VDEPTH_16BIT,
VIDEO_DEPTH_32BIT = VDEPTH_32BIT
};
#endif
#ifdef USE_SDL_VIDEO
#define MONITOR_INIT SDL_monitor_desc &monitor
#define VIDEO_DRV_INIT driver_window *drv
#define VIDEO_DRV_ROW_BYTES drv->s->pitch
#define VIDEO_DRV_LOCK_PIXELS if (SDL_MUSTLOCK(drv->s)) SDL_LockSurface(drv->s)
#define VIDEO_DRV_UNLOCK_PIXELS if (SDL_MUSTLOCK(drv->s)) SDL_UnlockSurface(drv->s)
#define VIDEO_MODE_INIT video_mode const & mode = drv->mode
#define VIDEO_MODE_ROW_BYTES mode.bytes_per_row
#define VIDEO_MODE_X mode.x
#define VIDEO_MODE_Y mode.y
#define VIDEO_MODE_DEPTH (int)mode.depth
#else
#if POWERPC_ROM
#define MONITOR_INIT /* nothing */
#define VIDEO_DRV_INIT /* nothing */
#define VIDEO_DRV_WINDOW the_win
#define VIDEO_DRV_GC the_gc
@ -42,34 +73,22 @@
#define VIDEO_MODE_X mode.viXsize
#define VIDEO_MODE_Y mode.viYsize
#define VIDEO_MODE_DEPTH mode.viAppleMode
enum {
VIDEO_DEPTH_1BIT = APPLE_1_BIT,
VIDEO_DEPTH_2BIT = APPLE_2_BIT,
VIDEO_DEPTH_4BIT = APPLE_4_BIT,
VIDEO_DEPTH_8BIT = APPLE_8_BIT,
VIDEO_DEPTH_16BIT = APPLE_16_BIT,
VIDEO_DEPTH_32BIT = APPLE_32_BIT
};
#else
#define X11_MONITOR_INIT X11_monitor_desc &monitor
#define MONITOR_INIT X11_monitor_desc &monitor
#define VIDEO_DRV_INIT driver_window *drv
#define VIDEO_DRV_WINDOW drv->w
#define VIDEO_DRV_GC drv->gc
#define VIDEO_DRV_IMAGE drv->img
#define VIDEO_DRV_HAVE_SHM drv->have_shm
#define VIDEO_MODE_INIT video_mode const & mode = drv->monitor.get_current_mode();
#define VIDEO_MODE_INIT video_mode const & mode = drv->mode
#define VIDEO_MODE_ROW_BYTES mode.bytes_per_row
#define VIDEO_MODE_X mode.x
#define VIDEO_MODE_Y mode.y
#define VIDEO_MODE_DEPTH (int)mode.depth
enum {
VIDEO_DEPTH_1BIT = VDEPTH_1BIT,
VIDEO_DEPTH_2BIT = VDEPTH_2BIT,
VIDEO_DEPTH_4BIT = VDEPTH_4BIT,
VIDEO_DEPTH_8BIT = VDEPTH_8BIT,
VIDEO_DEPTH_16BIT = VDEPTH_16BIT,
VIDEO_DEPTH_32BIT = VDEPTH_32BIT
};
#endif
#define VIDEO_DRV_LOCK_PIXELS /* nothing */
#define VIDEO_DRV_UNLOCK_PIXELS /* nothing */
#define VIDEO_DRV_ROW_BYTES VIDEO_DRV_IMAGE->bytes_per_line
#endif
// Variables for Video on SEGV support
@ -204,7 +223,7 @@ static uint32 page_extend(uint32 size)
* Initialize the VOSF system (mainBuffer structure, SIGSEGV handler)
*/
static bool video_vosf_init(X11_MONITOR_INIT)
static bool video_vosf_init(MONITOR_INIT)
{
VIDEO_MODE_INIT;
@ -313,11 +332,6 @@ bool Screen_fault_handler(sigsegv_address_t fault_address, sigsegv_address_t fau
* Update display for Windowed mode and VOSF
*/
// From video_blit.cpp
extern void (*Screen_blit)(uint8 * dest, const uint8 * source, uint32 length);
extern bool Screen_blitter_init(XVisualInfo * visual_info, bool native_byte_order, int mac_depth);
extern uint32 ExpandMap[256];
/* How can we deal with array overrun conditions ?
The state of the framebuffer pages that have been touched are maintained
@ -373,12 +387,14 @@ static inline void update_display_window_vosf(VIDEO_DRV_INIT)
const int y1 = mainBuffer.pageInfo[first_page].top;
const int y2 = mainBuffer.pageInfo[page - 1].bottom;
const int height = y2 - y1 + 1;
VIDEO_DRV_LOCK_PIXELS;
if (VIDEO_MODE_DEPTH < VIDEO_DEPTH_8BIT) {
// Update the_host_buffer and copy of the_buffer
const int src_bytes_per_row = VIDEO_MODE_ROW_BYTES;
const int dst_bytes_per_row = VIDEO_DRV_IMAGE->bytes_per_line;
const int dst_bytes_per_row = VIDEO_DRV_ROW_BYTES;
const int pixels_per_byte = VIDEO_MODE_X / src_bytes_per_row;
int i1 = y1 * src_bytes_per_row, i2 = y1 * dst_bytes_per_row, j;
for (j = y1; j <= y2; j++) {
@ -391,7 +407,7 @@ static inline void update_display_window_vosf(VIDEO_DRV_INIT)
// Update the_host_buffer and copy of the_buffer
const int src_bytes_per_row = VIDEO_MODE_ROW_BYTES;
const int dst_bytes_per_row = VIDEO_DRV_IMAGE->bytes_per_line;
const int dst_bytes_per_row = VIDEO_DRV_ROW_BYTES;
const int bytes_per_pixel = src_bytes_per_row / VIDEO_MODE_X;
int i1 = y1 * src_bytes_per_row, i2 = y1 * dst_bytes_per_row, j;
for (j = y1; j <= y2; j++) {
@ -401,10 +417,16 @@ static inline void update_display_window_vosf(VIDEO_DRV_INIT)
}
}
VIDEO_DRV_UNLOCK_PIXELS;
#ifdef USE_SDL_VIDEO
SDL_UpdateRect(drv->s, 0, y1, VIDEO_MODE_X, height);
#else
if (VIDEO_DRV_HAVE_SHM)
XShmPutImage(x_display, VIDEO_DRV_WINDOW, VIDEO_DRV_GC, VIDEO_DRV_IMAGE, 0, y1, 0, y1, VIDEO_MODE_X, height, 0);
else
XPutImage(x_display, VIDEO_DRV_WINDOW, VIDEO_DRV_GC, VIDEO_DRV_IMAGE, 0, y1, 0, y1, VIDEO_MODE_X, height);
#endif
}
mainBuffer.dirty = false;
}
@ -472,6 +494,7 @@ static inline void update_display_dga_vosf(void)
// Update the_host_buffer and copy of the_buffer
// There should be at least one pixel to copy
VIDEO_DRV_LOCK_PIXELS;
const int width = x2 - x1 + 1;
i = y1 * bytes_per_row + x1 * bytes_per_pixel;
for (j = y1; j <= y2; j++) {
@ -479,6 +502,7 @@ static inline void update_display_dga_vosf(void)
memcpy(the_buffer_copy + i, the_buffer + i, bytes_per_pixel * width);
i += bytes_per_row;
}
VIDEO_DRV_UNLOCK_PIXELS;
}
mainBuffer.dirty = false;
}

View File

@ -62,6 +62,7 @@
#include "prefs.h"
#include "user_strings.h"
#include "video.h"
#include "video_blit.h"
#define DEBUG 0
#include "debug.h"
@ -122,6 +123,8 @@ static bool use_keycodes = false; // Flag: Use keycodes rather than keysyms
static int keycode_table[256]; // X keycode -> Mac keycode translation table
// X11 variables
char *x_display_name = NULL; // X11 display name
Display *x_display = NULL; // X11 display handle
static int screen; // Screen number
static Window rootwin; // Root window and our window
static int num_depths = 0; // Number of available X depths
@ -131,6 +134,7 @@ static unsigned long black_pixel, white_pixel;
static int eventmask;
static int xdepth; // Depth of X screen
static VisualFormat visualFormat;
static XVisualInfo visualInfo;
static Visual *vis;
static int color_class;
@ -754,7 +758,7 @@ driver_window::driver_window(X11_monitor_desc &m)
native_byte_order = (XImageByteOrder(x_display) == LSBFirst);
#endif
#ifdef ENABLE_VOSF
Screen_blitter_init(&visualInfo, native_byte_order, depth_of_video_mode(mode));
Screen_blitter_init(visualFormat, native_byte_order, depth_of_video_mode(mode));
#endif
// Set frame buffer base
@ -1115,7 +1119,7 @@ driver_fbdev::driver_fbdev(X11_monitor_desc &m) : driver_dga(m)
#if REAL_ADDRESSING || DIRECT_ADDRESSING
// Screen_blitter_init() returns TRUE if VOSF is mandatory
// i.e. the framebuffer update function is not Blit_Copy_Raw
use_vosf = Screen_blitter_init(&visualInfo, true, mode.depth);
use_vosf = Screen_blitter_init(visualFormat, true, mode.depth);
if (use_vosf) {
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
@ -1255,7 +1259,7 @@ driver_xf86dga::driver_xf86dga(X11_monitor_desc &m)
#if REAL_ADDRESSING || DIRECT_ADDRESSING
// Screen_blitter_init() returns TRUE if VOSF is mandatory
// i.e. the framebuffer update function is not Blit_Copy_Raw
use_vosf = Screen_blitter_init(&visualInfo, native_byte_order, depth_of_video_mode(mode));
use_vosf = Screen_blitter_init(visualFormat, native_byte_order, depth_of_video_mode(mode));
if (use_vosf) {
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
@ -1397,6 +1401,12 @@ bool X11_monitor_desc::video_open(void)
return false;
}
// Build up visualFormat structure
visualFormat.depth = visualInfo.depth;
visualFormat.Rmask = visualInfo.red_mask;
visualFormat.Gmask = visualInfo.green_mask;
visualFormat.Bmask = visualInfo.blue_mask;
// Create color maps
if (color_class == PseudoColor || color_class == DirectColor) {
cmap[0] = XCreateColormap(x_display, rootwin, vis, AllocAll);