Some more work to get video support working, add generic code to support the boot splash in.
However all modes available are planar, and there doesn't seem to be a way to tell it in the kernel args framebuffer struct... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39255 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -19,6 +19,13 @@ UsePrivateHeaders [ FDirName storage ] ;
|
|||||||
|
|
||||||
#SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons accelerants common ] ;
|
#SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons accelerants common ] ;
|
||||||
|
|
||||||
|
local genericPlatformSources =
|
||||||
|
text_menu.cpp
|
||||||
|
video_blit.cpp
|
||||||
|
video_splash.cpp
|
||||||
|
video_rle.cpp
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
KernelMergeObject boot_platform_amiga_m68k_shell.o :
|
KernelMergeObject boot_platform_amiga_m68k_shell.o :
|
||||||
shell.S
|
shell.S
|
||||||
@@ -46,9 +53,8 @@ KernelMergeObject boot_platform_amiga_m68k_other.o :
|
|||||||
video.cpp
|
video.cpp
|
||||||
#apm.cpp
|
#apm.cpp
|
||||||
|
|
||||||
# generic
|
$(genericPlatformSources)
|
||||||
text_menu.cpp
|
|
||||||
|
|
||||||
# VESA/DDC EDID
|
# VESA/DDC EDID
|
||||||
#decode_edid.c
|
#decode_edid.c
|
||||||
#dump_edid.c
|
#dump_edid.c
|
||||||
@@ -88,8 +94,7 @@ actions ChecksumAmigaLoader bind TARGET_CHECKSUM
|
|||||||
ChecksumAmigaLoader haiku_loader ;
|
ChecksumAmigaLoader haiku_loader ;
|
||||||
|
|
||||||
|
|
||||||
|
SEARCH on [ FGristFiles $(genericPlatformSources) ]
|
||||||
SEARCH on [ FGristFiles text_menu.cpp ]
|
|
||||||
= [ FDirName $(HAIKU_TOP) src system boot platform generic ] ;
|
= [ FDirName $(HAIKU_TOP) src system boot platform generic ] ;
|
||||||
|
|
||||||
# Tell the build system to where stage1.bin can be found, so it can be used
|
# Tell the build system to where stage1.bin can be found, so it can be used
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "rom_calls.h"
|
#include "rom_calls.h"
|
||||||
|
#include "console.h"
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
//#include "mmu.h"
|
//#include "mmu.h"
|
||||||
//#include "images.h"
|
//#include "images.h"
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
#include <boot/platform.h>
|
#include <boot/platform.h>
|
||||||
#include <boot/menu.h>
|
#include <boot/menu.h>
|
||||||
#include <boot/kernel_args.h>
|
#include <boot/kernel_args.h>
|
||||||
|
#include <boot/platform/generic/video.h>
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
#include <drivers/driver_settings.h>
|
#include <drivers/driver_settings.h>
|
||||||
#include <GraphicsDefs.h>
|
#include <GraphicsDefs.h>
|
||||||
@@ -30,8 +32,51 @@
|
|||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static addr_t sFrameBuffer;
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
probe_video_mode()
|
||||||
|
{
|
||||||
|
if (gScreen == NULL) {
|
||||||
|
gKernelArgs.frame_buffer.enabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (gScreen->RastPort.BitMap->Depth < 8) {
|
||||||
|
gKernelArgs.frame_buffer.enabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
dprintf("Video mode:\n");
|
||||||
|
dprintf("BytesPerRow %d\n", gScreen->RastPort.BitMap->BytesPerRow);
|
||||||
|
dprintf("Rows %d\n", gScreen->RastPort.BitMap->Rows);
|
||||||
|
dprintf("Flags %02x\n", gScreen->RastPort.BitMap->Flags);
|
||||||
|
dprintf("Depth %d\n", gScreen->RastPort.BitMap->Depth);
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
dprintf("Planes[%d] %p\n", i, gScreen->RastPort.BitMap->Planes[i]);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//XXX how do we tell it's a planar framebuffer ??
|
||||||
|
|
||||||
|
gKernelArgs.frame_buffer.width = gScreen->RastPort.BitMap->BytesPerRow * 8;
|
||||||
|
gKernelArgs.frame_buffer.height = gScreen->RastPort.BitMap->Rows;
|
||||||
|
gKernelArgs.frame_buffer.bytes_per_row = gScreen->RastPort.BitMap->BytesPerRow;
|
||||||
|
gKernelArgs.frame_buffer.depth = gScreen->RastPort.BitMap->Depth;
|
||||||
|
gKernelArgs.frame_buffer.physical_buffer.size
|
||||||
|
= gKernelArgs.frame_buffer.width
|
||||||
|
* gKernelArgs.frame_buffer.height
|
||||||
|
* gScreen->RastPort.BitMap->Depth / 8;
|
||||||
|
gKernelArgs.frame_buffer.physical_buffer.start
|
||||||
|
= (phys_addr_t)(gScreen->RastPort.BitMap->Planes[0]);
|
||||||
|
|
||||||
|
dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
|
||||||
|
gKernelArgs.frame_buffer.height, gKernelArgs.frame_buffer.depth);
|
||||||
|
|
||||||
|
gKernelArgs.frame_buffer.enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
@@ -89,8 +134,15 @@ video_mode_menu()
|
|||||||
continue;*/
|
continue;*/
|
||||||
if (info.NotAvailable)
|
if (info.NotAvailable)
|
||||||
continue;
|
continue;
|
||||||
|
if (info.PropertyFlags & DIPF_IS_HAM)
|
||||||
|
continue;
|
||||||
|
if (info.PropertyFlags & DIPF_IS_DUALPF)
|
||||||
|
continue;
|
||||||
if (dimension.MaxDepth < 4)
|
if (dimension.MaxDepth < 4)
|
||||||
continue;
|
continue;
|
||||||
|
// skip 5 & 6 bit modes
|
||||||
|
if (dimension.MaxDepth < 8 && dimension.MaxDepth != 4)
|
||||||
|
continue;
|
||||||
//dprintf("name: %s\n", name.Name);
|
//dprintf("name: %s\n", name.Name);
|
||||||
/*
|
/*
|
||||||
dprintf("mode 0x%08lx: %dx%d flags: 0x%08lx bpp: %d\n",
|
dprintf("mode 0x%08lx: %dx%d flags: 0x%08lx bpp: %d\n",
|
||||||
@@ -99,18 +151,19 @@ video_mode_menu()
|
|||||||
dprintf("mode: %dx%d -> %dx%d\n",
|
dprintf("mode: %dx%d -> %dx%d\n",
|
||||||
dimension.MinRasterWidth, dimension.MinRasterHeight,
|
dimension.MinRasterWidth, dimension.MinRasterHeight,
|
||||||
dimension.MaxRasterWidth, dimension.MaxRasterHeight);
|
dimension.MaxRasterWidth, dimension.MaxRasterHeight);
|
||||||
|
*/
|
||||||
dprintf("mode: %dx%d %dbpp flags: 0x%08lx\n",
|
dprintf("mode: %dx%d %dbpp flags: 0x%08lx\n",
|
||||||
dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
|
dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
|
||||||
dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
|
dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
|
||||||
dimension.MaxDepth, info.PropertyFlags);
|
dimension.MaxDepth, info.PropertyFlags);
|
||||||
*/
|
|
||||||
char label[128];
|
char label[128];
|
||||||
sprintf(label, "%ux%u %u bit %08lx%s%s",
|
sprintf(label, "%ux%u %u bit %08lx%s%s",
|
||||||
dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
|
dimension.Nominal.MaxX - dimension.Nominal.MinX + 1,
|
||||||
dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
|
dimension.Nominal.MaxY - dimension.Nominal.MinY + 1,
|
||||||
dimension.MaxDepth, info.PropertyFlags,
|
dimension.MaxDepth, info.PropertyFlags,
|
||||||
(info.PropertyFlags & DIPF_IS_LACE) ? "" : " i",
|
(info.PropertyFlags & DIPF_IS_LACE) ? " i" : "",
|
||||||
(info.PropertyFlags & DIPF_IS_PAL) ? "" : " pal");
|
(info.PropertyFlags & DIPF_IS_PAL) ? " pal" : "");
|
||||||
|
|
||||||
menu->AddItem(item = new(nothrow) MenuItem(label));
|
menu->AddItem(item = new(nothrow) MenuItem(label));
|
||||||
item->SetData((void *)modeID);
|
item->SetData((void *)modeID);
|
||||||
@@ -127,13 +180,62 @@ video_mode_menu()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - blit
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
platform_blit4(addr_t frameBuffer, const uint8 *data,
|
||||||
|
uint16 width, uint16 height, uint16 imageWidth, uint16 left, uint16 top)
|
||||||
|
{
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" void
|
||||||
|
platform_set_palette(const uint8 *palette)
|
||||||
|
{
|
||||||
|
switch (gKernelArgs.frame_buffer.depth) {
|
||||||
|
case 4:
|
||||||
|
//vga_set_palette((const uint8 *)kPalette16, 0, 16);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
//if (vesa_set_palette((const uint8 *)palette, 0, 256) != B_OK)
|
||||||
|
// dprintf("set palette failed!\n");
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
platform_switch_to_logo(void)
|
platform_switch_to_logo(void)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
// in debug mode, we'll never show the logo
|
||||||
|
if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
addr_t lastBase = gKernelArgs.frame_buffer.physical_buffer.start;
|
||||||
|
size_t lastSize = gKernelArgs.frame_buffer.physical_buffer.size;
|
||||||
|
|
||||||
// TODO: implement me
|
// TODO: implement me
|
||||||
|
|
||||||
|
probe_video_mode();
|
||||||
|
|
||||||
|
// map to virtual memory
|
||||||
|
// (should be ok in bootloader thanks to TT0)
|
||||||
|
|
||||||
|
sFrameBuffer = gKernelArgs.frame_buffer.physical_buffer.start;
|
||||||
|
|
||||||
|
video_display_splash(sFrameBuffer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -148,6 +250,8 @@ extern "C" status_t
|
|||||||
platform_init_video(void)
|
platform_init_video(void)
|
||||||
{
|
{
|
||||||
// TODO: implement me
|
// TODO: implement me
|
||||||
|
probe_video_mode();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user