From 2f2cd626e33053b5259e0829d261be5883f1a009 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Thu, 24 Dec 2020 03:21:02 +0100 Subject: [PATCH] Implement non linear framebuffer detection for VBE multiboot Real hardware doesn't often use a linear framebuffer. It can causes graphics issues. --- source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs index b7174ef8a..0839b17a9 100644 --- a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs +++ b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs @@ -81,8 +81,21 @@ namespace Cosmos.HAL.Drivers if (VBE.IsAvailable()) //VBE VESA Enabled Mulitboot Parsing { Global.mDebugger.SendInternal($"Creating VBE VESA driver with Mode {xres}*{yres}@{bpp}"); - IO.LinearFrameBuffer = new MemoryBlock(VBE.getLfbOffset(), (uint)xres * yres * (uint)(bpp / 8)); - lastbuffer = new ManagedMemoryBlock((uint)xres * yres * (uint)(bpp / 8)); + + var ModeInfo = VBE.getModeInfo(); + + if ((ModeInfo.pitch / 4) == ModeInfo.width) //linear framebuffer detection + { + IO.LinearFrameBuffer = new MemoryBlock(VBE.getLfbOffset(), (uint)xres * yres * (uint)(bpp / 8)); + lastbuffer = new ManagedMemoryBlock((uint)xres * yres * (uint)(bpp / 8)); + } + else + { + uint OffScreenSize = (ModeInfo.pitch / (uint)(bpp / 8)) - ModeInfo.width; + + IO.LinearFrameBuffer = new MemoryBlock(VBE.getLfbOffset(), (uint)(xres * yres * (uint)(bpp / 8)) + (OffScreenSize * yres * (uint)(bpp / 8))); + lastbuffer = new ManagedMemoryBlock((uint)(xres * yres * (uint)(bpp / 8)) + (OffScreenSize * yres * (uint)(bpp / 8))); + } } else if (ISAModeAvailable()) //Bochs Graphics Adaptor ISA Mode {