On those systems, it's really hard to get high resolution timings and the
system oftens fails to honour a timeout in less than 20 ms. The idea here
is to have an average m68k instruction count (countdown quantum) that
triggers real interrupt checks. The quantum is calibrated every 10 ticks
and has a 1000 Hz resolution on average.
fullscreen mode when VidMode extension is enabled. Also fix SDL fullscreen
to really update the screen as this is necessary by default on Linux since
simple windowed is used (and not DGA for fullscreen).
Always prefer the 64 pixel chunks update code.
Rearrange B2 video_x.cpp to match video_vosf.h updates
blitters, rewrite update_display_dga_vosf() to actually work with sub byte
pixels. Factor out update_display_window_vosf() since it's long time that
it is no longer checking for first column and last column that have changed.
variable to acknowledge cancellation. This avoids Xserver events queue
corruption when clipboard is in use. Concretely, this fixes following errors:
Xlib: unexpected async reply (sequence 0xHEX)!
This is useful to get rid of address offset sign extensions. It uses POSIX
shared memory to create aliased regions, fallback to usual sign-extension
way if shm_open et al. don't work (e.g. no /dev/shm mounted)
that case, we do need add it when creating the window otherwise we
result int a nice BadMatch for X_CreateWindow request. FIXME?
- Fix typo and do enable VOSF in DGA mode, if necessary.
converted for the new scheme; not actually tested with a mult-monitor
setup yet but at least single-monitor display doesn't seem to be broken
(UAE banked addressing would definitely require some extensions to handle
multiple frame buffers)
- struct video_mode has an extra field that is free for use by platform-
specific code
that it can be vm_protect()'ed at will afterwards
- video_x.cpp: let driver_base free() the_buffer_copy and the_host_buffer,
if necessary
- video_vosf.h: reverted to use malloc() for mainBuffer.dirtyPages and
mainBuffer.pageInfo
- vm_alloc.cpp: small cleanups
- fixed typos
- fixed possible crash in driver_window dtor (image data would be freed twice,
once by XDestroyImage() and once in driver_base dtor)
- fixed compilation problems with banked memory
- fixed typos
- ADBMouseMoved(), ADBMouseDown/Up() and ADBKeyDown/Up() trigger the ADB
interrupt
- ADB mutex is only used for mouse movement (the only input state where it
matters)
- adb.cpp: toggling relative mouse mode resets mouse_x/y
- PrimeTime(0) schedules a timer task with 0 delay time; this is still not
the correct implementation, but it makes MacSyndicate work...
- Unix: pthreads are preferred to POSIX.4 timers for 60Hz ticks because the
timers drift badly under Linux and the thread can compensate for drifting
well enough
- Unix: moved GetTicks_usec() and Delay_usec() to timer_unix.cpp
- video_x.cpp: X mouse acceleration is disabled in relative mouse mode because
MacOS does its own acceleration
- video_x.cpp: palette[].pixel and palette[].flags are always preset
- video_x.cpp: decoupled X event handling from 60Hz video refresh cycle by
using select() with a timeout on the X fd
of the internal structures used for the VOSF system
- use vm_acquire()/vm_release() for VOSF buffers and hope the_buffer is
allocated above RAM address space (temporary workaround for 64-bit
addressing systems)
- don't free() screen buffers in driver_base dtor
- don't free() memory mapped buffers in driver_base dtor
of MacOS before 7.6:
- Apple mode IDs are now allocated contiguously from 0x80 (the video_*.cpp
module must call video_init_depth_list() after adding all modes)
- if the video driver didn't receive a GetVideoParameters call, it patches
ScrnBase and the main GDevice upon a video mode switch (otherwise MacOS
will continue to use the old frame buffer base)
- the rowBytes values in the video parameters slot resources are correct
for all bit depths
implemented under Unix
- adb.cpp uses mutexes for thread-safe mouse handling
- video_x.cpp: pressing Ctrl-F5 in windowed mode switches to a "grabbed"
relative mouse mode, useful for some games
- video_x.cpp: fixed some bugs relating to the hotkeys (key releases are no
longer treated as hotkeys)
linked list
- color depth switching updates slot ROM
- video_x.cpp always supports 1-bit window modes
- timer_create()/clock_gettime() are pulled from librt if present
However, vm_init() and vm_exit() are called in main_unix.cpp to ensure proper
initialization of the internal zero_fd descriptor, if needed. i.e. no
anonymous mapping for mmap()-based memory allocation.
resolutions are 512x384, 640x480, 800x600, 1024x768 and 1280x1024 (the prefs
editor has to be updated to reflect this). The resolution selected in the
prefs editor is used as the default, but it can be changed in the Monitors
control panel. So far only tested with direct addressing.
contains all supported depths, default mode is stored in XPRAM upon startup,
and added video_switch_to_mode() call (currently unimplemented in all drivers)
- added uniform virtual memory allocation
(supports mmap(), vm_allocate(), or fallbacks to malloc()/free())
- cleaned up memory allocation in main_unix.cpp
that have to be blitted onto the screen (find_next_page_set() and
find_next_page_clear() functions)
- Cleaned up some comments
Changes from Brian J. Johnson
- Fixed mainBuffer.dirtyPages[] array overrun in VOSF code
- Fixed calculation of the frames-per-second value