* If the VESA driver remaps the frame buffer on init, it will now also make

sure that the kernel's frame buffer console points to the right data.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34835 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2010-01-01 14:54:41 +00:00
parent 1e84402302
commit e30dd2c076
3 changed files with 28 additions and 16 deletions

View File

@ -31,6 +31,8 @@ extern "C" {
#endif
bool frame_buffer_console_available(void);
status_t frame_buffer_update(addr_t baseAddress, int32 width, int32 height,
int32 depth, int32 bytesPerRow);
status_t frame_buffer_console_init(struct kernel_args* args);
status_t frame_buffer_console_init_post_modules(struct kernel_args* args);

View File

@ -238,8 +238,8 @@ vbe_set_bits_per_gun(vesa_info& info, uint8 bits)
frame buffer, there is no need to map it again.
*/
static status_t
remap_frame_buffer(vesa_info& info, addr_t physicalBase,
uint32 bytesPerRow, uint32 height, bool initializing)
remap_frame_buffer(vesa_info& info, addr_t physicalBase, uint32 width,
uint32 height, int8 depth, uint32 bytesPerRow, bool initializing)
{
vesa_shared_info& sharedInfo = *info.shared_info;
addr_t frameBuffer;
@ -263,6 +263,14 @@ remap_frame_buffer(vesa_info& info, addr_t physicalBase,
if (area < 0)
return area;
if (initializing) {
// We need to manually update the kernel's frame buffer address,
// since this frame buffer remapping has not been issued by the
// app_server (which would otherwise take care of this)
frame_buffer_update(frameBuffer, width, height, depth,
bytesPerRow);
}
delete_area(info.shared_info->frame_buffer_area);
info.frame_buffer = frameBuffer;
@ -336,7 +344,8 @@ vesa_init(vesa_info& info)
sharedInfo.frame_buffer_area = bufferInfo->area;
remap_frame_buffer(info, bufferInfo->physical_frame_buffer,
bufferInfo->bytes_per_row, bufferInfo->height, true);
bufferInfo->width, bufferInfo->height, bufferInfo->bytes_per_row,
bufferInfo->depth, true);
// Does not matter if this fails - the frame buffer was already mapped
// before.
@ -406,8 +415,9 @@ vesa_set_display_mode(vesa_info& info, uint32 mode)
// Map new frame buffer if necessary
status = remap_frame_buffer(info, modeInfo.physical_base,
modeInfo.bytes_per_row, modeInfo.height, false);
status = remap_frame_buffer(info, modeInfo.width, modeInfo.height,
modeInfo.physical_base, modeInfo.bytes_per_row, modeInfo.bits_per_pixel,
false);
if (status == B_OK) {
// Update shared frame buffer information
info.shared_info->current_mode.virtual_width = modeInfo.width;

View File

@ -363,7 +363,17 @@ console_module_info gFrameBufferConsoleModule = {
};
static status_t
// #pragma mark -
bool
frame_buffer_console_available(void)
{
return sConsole.frame_buffer != 0;
}
status_t
frame_buffer_update(addr_t baseAddress, int32 width, int32 height, int32 depth,
int32 bytesPerRow)
{
@ -394,16 +404,6 @@ frame_buffer_update(addr_t baseAddress, int32 width, int32 height, int32 depth,
}
// #pragma mark -
bool
frame_buffer_console_available(void)
{
return sConsole.frame_buffer != 0;
}
status_t
frame_buffer_console_init(kernel_args* args)
{