mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-12-25 17:29:19 +00:00
Only support True Color frame buffers. Make it possible to run-time switch
depth in FBDev DGA fullscreen mode.
This commit is contained in:
parent
e8ac4897b6
commit
b46eb9ae45
@ -577,7 +577,7 @@ static bool open_window(int width, int height)
|
|||||||
use_vosf = true;
|
use_vosf = true;
|
||||||
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
||||||
the_host_buffer = the_buffer_copy;
|
the_host_buffer = the_buffer_copy;
|
||||||
the_buffer_size = page_extend((aligned_height + 2) * img->bytes_per_line);
|
the_buffer_size = page_extend((aligned_height + 2) * (the_host_buffer_row_bytes = img->bytes_per_line));
|
||||||
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
||||||
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
||||||
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
||||||
@ -643,6 +643,7 @@ static bool open_fbdev(int width, int height)
|
|||||||
}
|
}
|
||||||
D(bug("[fbdev] Device ID: %s\n", fb_finfo.id));
|
D(bug("[fbdev] Device ID: %s\n", fb_finfo.id));
|
||||||
D(bug("[fbdev] smem_start: %p [%d bytes]\n", fb_finfo.smem_start, fb_finfo.smem_len));
|
D(bug("[fbdev] smem_start: %p [%d bytes]\n", fb_finfo.smem_start, fb_finfo.smem_len));
|
||||||
|
|
||||||
int fb_type = fb_finfo.type;
|
int fb_type = fb_finfo.type;
|
||||||
const char *fb_type_str = NULL;
|
const char *fb_type_str = NULL;
|
||||||
switch (fb_type) {
|
switch (fb_type) {
|
||||||
@ -654,6 +655,12 @@ static bool open_fbdev(int width, int height)
|
|||||||
default: fb_type_str = "<unknown>"; break;
|
default: fb_type_str = "<unknown>"; break;
|
||||||
}
|
}
|
||||||
D(bug("[fbdev] type: %s\n", fb_type_str));
|
D(bug("[fbdev] type: %s\n", fb_type_str));
|
||||||
|
|
||||||
|
if (fb_type != FB_TYPE_PACKED_PIXELS) {
|
||||||
|
D(bug("[fbdev] type '%s' not supported\n", fb_type_str));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int fb_visual = fb_finfo.visual;
|
int fb_visual = fb_finfo.visual;
|
||||||
const char *fb_visual_str;
|
const char *fb_visual_str;
|
||||||
switch (fb_visual) {
|
switch (fb_visual) {
|
||||||
@ -667,8 +674,8 @@ static bool open_fbdev(int width, int height)
|
|||||||
}
|
}
|
||||||
D(bug("[fbdev] visual: %s\n", fb_visual_str));
|
D(bug("[fbdev] visual: %s\n", fb_visual_str));
|
||||||
|
|
||||||
if (fb_type != FB_TYPE_PACKED_PIXELS) {
|
if (fb_visual != FB_VISUAL_TRUECOLOR) {
|
||||||
D(bug("[fbdev] type %s not supported\n", fb_type_str));
|
D(bug("[fbdev] visual '%s' not supported\n", fb_visual_str));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,10 +693,9 @@ static bool open_fbdev(int width, int height)
|
|||||||
XSetWindowAttributes wattr;
|
XSetWindowAttributes wattr;
|
||||||
wattr.event_mask = eventmask = dga_eventmask;
|
wattr.event_mask = eventmask = dga_eventmask;
|
||||||
wattr.override_redirect = True;
|
wattr.override_redirect = True;
|
||||||
wattr.colormap = (depth == 1 ? DefaultColormap(x_display, screen) : cmap[0]);
|
|
||||||
the_win = XCreateWindow(x_display, rootwin, 0, 0, width, height, 0, xdepth,
|
the_win = XCreateWindow(x_display, rootwin, 0, 0, width, height, 0, xdepth,
|
||||||
InputOutput, vis, CWEventMask | CWOverrideRedirect |
|
InputOutput, DefaultVisual(x_display, screen),
|
||||||
(color_class == DirectColor ? CWColormap : 0), &wattr);
|
CWEventMask | CWOverrideRedirect, &wattr);
|
||||||
|
|
||||||
// Show window
|
// Show window
|
||||||
XMapRaised(x_display, the_win);
|
XMapRaised(x_display, the_win);
|
||||||
@ -711,36 +717,42 @@ static bool open_fbdev(int width, int height)
|
|||||||
XDefineCursor(x_display, the_win, mac_cursor);
|
XDefineCursor(x_display, the_win, mac_cursor);
|
||||||
|
|
||||||
// Init blitting routines
|
// Init blitting routines
|
||||||
int bytes_per_row = TrivialBytesPerRow((width + 7) & ~7, DepthModeForPixelDepth(depth));
|
|
||||||
#if ENABLE_VOSF
|
#if ENABLE_VOSF
|
||||||
bool native_byte_order;
|
// Extract current screen color masks (we are in True Color mode)
|
||||||
#ifdef WORDS_BIGENDIAN
|
VisualFormat visualFormat;
|
||||||
native_byte_order = (XImageByteOrder(x_display) == MSBFirst);
|
visualFormat.depth = xdepth = DefaultDepth(x_display, screen);
|
||||||
#else
|
XMatchVisualInfo(x_display, screen, xdepth, TrueColor, &visualInfo);
|
||||||
native_byte_order = (XImageByteOrder(x_display) == LSBFirst);
|
assert(visualFormat.depth == visualInfo.depth);
|
||||||
#endif
|
visualFormat.Rmask = visualInfo.red_mask;
|
||||||
#if REAL_ADDRESSING || DIRECT_ADDRESSING
|
visualFormat.Gmask = visualInfo.green_mask;
|
||||||
|
visualFormat.Bmask = visualInfo.blue_mask;
|
||||||
|
D(bug("[fbdev] %d bpp, (%08x,%08x,%08x)\n",
|
||||||
|
visualFormat.depth,
|
||||||
|
visualFormat.Rmask, visualFormat.Gmask, visualFormat.Bmask));
|
||||||
|
D(bug("[fbdev] Mac depth %d bpp\n", depth));
|
||||||
|
|
||||||
// Screen_blitter_init() returns TRUE if VOSF is mandatory
|
// Screen_blitter_init() returns TRUE if VOSF is mandatory
|
||||||
// i.e. the framebuffer update function is not Blit_Copy_Raw
|
// i.e. the framebuffer update function is not Blit_Copy_Raw
|
||||||
use_vosf = Screen_blitter_init(visualFormat, native_byte_order, depth);
|
#ifdef WORDS_BIGENDIAN
|
||||||
|
const bool native_byte_order = (XImageByteOrder(x_display) == MSBFirst);
|
||||||
if (use_vosf) {
|
|
||||||
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
|
||||||
the_host_buffer = the_buffer;
|
|
||||||
the_buffer_size = page_extend((height + 2) * bytes_per_row);
|
|
||||||
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
|
||||||
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
|
||||||
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
use_vosf = false;
|
const bool native_byte_order = (XImageByteOrder(x_display) == LSBFirst);
|
||||||
#endif
|
#endif
|
||||||
|
Screen_blitter_init(visualFormat, native_byte_order, depth);
|
||||||
|
|
||||||
|
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
||||||
|
the_host_buffer = the_buffer;
|
||||||
|
the_host_buffer_row_bytes = TrivialBytesPerRow((width + 7) & ~7, DepthModeForPixelDepth(visualFormat.depth));
|
||||||
|
the_buffer_size = page_extend((height + 2) * the_host_buffer_row_bytes);
|
||||||
|
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
||||||
|
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
||||||
|
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set frame buffer base
|
// Set frame buffer base
|
||||||
D(bug("the_buffer = %p, use_vosf = %d\n", the_buffer, use_vosf));
|
D(bug("the_buffer = %p, use_vosf = %d\n", the_buffer, use_vosf));
|
||||||
screen_base = Host2MacAddr(the_buffer);
|
screen_base = Host2MacAddr(the_buffer);
|
||||||
VModes[cur_mode].viRowBytes = bytes_per_row;
|
VModes[cur_mode].viRowBytes = TrivialBytesPerRow((width + 7) & ~7, DepthModeForPixelDepth(depth));
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
ErrorAlert("SheepShaver has been compiled with DGA support disabled.");
|
ErrorAlert("SheepShaver has been compiled with DGA support disabled.");
|
||||||
@ -822,7 +834,7 @@ static bool open_dga(int width, int height)
|
|||||||
if (use_vosf) {
|
if (use_vosf) {
|
||||||
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
// Allocate memory for frame buffer (SIZE is extended to page-boundary)
|
||||||
the_host_buffer = the_buffer;
|
the_host_buffer = the_buffer;
|
||||||
the_buffer_size = page_extend((height + 2) * bytes_per_row);
|
the_buffer_size = page_extend((height + 2) * (the_host_buffer_row_bytes = bytes_per_row));
|
||||||
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
the_buffer_copy = (uint8 *)malloc(the_buffer_size);
|
||||||
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
the_buffer = (uint8 *)vm_acquire(the_buffer_size);
|
||||||
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
D(bug("the_buffer = %p, the_buffer_copy = %p, the_host_buffer = %p\n", the_buffer, the_buffer_copy, the_host_buffer));
|
||||||
@ -858,6 +870,7 @@ static bool open_display(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build up visualFormat structure
|
// Build up visualFormat structure
|
||||||
|
visualFormat.fullscreen = (display_type == DIS_SCREEN);
|
||||||
visualFormat.depth = visualInfo.depth;
|
visualFormat.depth = visualInfo.depth;
|
||||||
visualFormat.Rmask = visualInfo.red_mask;
|
visualFormat.Rmask = visualInfo.red_mask;
|
||||||
visualFormat.Gmask = visualInfo.green_mask;
|
visualFormat.Gmask = visualInfo.green_mask;
|
||||||
@ -1458,6 +1471,12 @@ bool VideoInit(void)
|
|||||||
add_custom_mode(p, display_type, default_width, default_height, d, APPLE_CUSTOM);
|
add_custom_mode(p, display_type, default_width, default_height, d, APPLE_CUSTOM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef ENABLE_VOSF
|
||||||
|
} else if (display_type == DIS_SCREEN && is_fbdev_dga_mode) {
|
||||||
|
for (unsigned int d = APPLE_1_BIT; d <= default_mode; d++)
|
||||||
|
if (find_visual_for_depth(d))
|
||||||
|
add_custom_mode(p, display_type, default_width, default_height, d, APPLE_CUSTOM);
|
||||||
|
#endif
|
||||||
} else
|
} else
|
||||||
add_custom_mode(p, display_type, default_width, default_height, default_mode, APPLE_CUSTOM);
|
add_custom_mode(p, display_type, default_width, default_height, default_mode, APPLE_CUSTOM);
|
||||||
} else if (window_modes) {
|
} else if (window_modes) {
|
||||||
|
Loading…
Reference in New Issue
Block a user