From 15db6949b6e25285e0bed89c23104a0d6d75ebf0 Mon Sep 17 00:00:00 2001 From: Fredrik Holmqvist Date: Wed, 1 Aug 2018 20:08:04 +0200 Subject: [PATCH] Don't clear video mem on UEFI, efi video mode refactor Writes to videomem is slow without memory remapping Can't do the mapping without leaving UEFI, so skipping the clear. Afaict it should always be cleared by UEFI This saves ~10 seconds of booting on my machine (1920*1080*4 bytes) EFI video mode (should have been it's own commit) * Only do strcmp if there are enough params * break when found --- .../kernel/boot/platform/generic/video.h | 2 +- src/system/boot/platform/amiga_m68k/video.cpp | 2 +- src/system/boot/platform/atari_m68k/video.cpp | 2 +- src/system/boot/platform/bios_ia32/video.cpp | 2 +- src/system/boot/platform/efi/video.cpp | 23 ++++++++----------- .../boot/platform/generic/video_splash.cpp | 8 +++---- .../boot/platform/openfirmware/video.cpp | 3 ++- src/system/boot/platform/u-boot/video.cpp | 2 +- 8 files changed, 21 insertions(+), 23 deletions(-) diff --git a/headers/private/kernel/boot/platform/generic/video.h b/headers/private/kernel/boot/platform/generic/video.h index b157372b90..50effc0f5b 100644 --- a/headers/private/kernel/boot/platform/generic/video.h +++ b/headers/private/kernel/boot/platform/generic/video.h @@ -32,7 +32,7 @@ void uncompress_24bit_RLE(const uint8 compressed[], uint8 *uncompressed); void uncompress_8bit_RLE(const uint8 compressed[], uint8 *uncompressed); /* default splash display */ -status_t video_display_splash(addr_t frameBuffer); +status_t video_display_splash(addr_t frameBuffer, bool clear); #ifdef __cplusplus } diff --git a/src/system/boot/platform/amiga_m68k/video.cpp b/src/system/boot/platform/amiga_m68k/video.cpp index 686b043872..031673a88d 100644 --- a/src/system/boot/platform/amiga_m68k/video.cpp +++ b/src/system/boot/platform/amiga_m68k/video.cpp @@ -234,7 +234,7 @@ platform_switch_to_logo(void) sFrameBuffer = gKernelArgs.frame_buffer.physical_buffer.start; - //video_display_splash(sFrameBuffer); + //video_display_splash(sFrameBuffer, true); } diff --git a/src/system/boot/platform/atari_m68k/video.cpp b/src/system/boot/platform/atari_m68k/video.cpp index 073f492db2..5e5cd7daf2 100644 --- a/src/system/boot/platform/atari_m68k/video.cpp +++ b/src/system/boot/platform/atari_m68k/video.cpp @@ -1153,7 +1153,7 @@ platform_switch_to_logo(void) gKernelArgs.frame_buffer.physical_buffer.size, kDefaultPageFlags); } #endif - video_display_splash(sFrameBuffer); + video_display_splash(sFrameBuffer, true); dump_vars(); spin(10000000); platform_switch_to_text_mode(); diff --git a/src/system/boot/platform/bios_ia32/video.cpp b/src/system/boot/platform/bios_ia32/video.cpp index fa9b1fba8c..2800305571 100644 --- a/src/system/boot/platform/bios_ia32/video.cpp +++ b/src/system/boot/platform/bios_ia32/video.cpp @@ -877,7 +877,7 @@ fallback: gKernelArgs.frame_buffer.physical_buffer.size, kDefaultPageFlags); } - video_display_splash(sFrameBuffer); + video_display_splash(sFrameBuffer, true); } diff --git a/src/system/boot/platform/efi/video.cpp b/src/system/boot/platform/efi/video.cpp index 3399c3b117..61ab14120a 100644 --- a/src/system/boot/platform/efi/video.cpp +++ b/src/system/boot/platform/efi/video.cpp @@ -118,8 +118,6 @@ get_mode_from_settings(void) if (handle == NULL) return; - bool found = false; - const driver_settings *settings = get_driver_settings(handle); if (settings == NULL) goto out; @@ -129,17 +127,16 @@ get_mode_from_settings(void) for (int32 i = 0; i < settings->parameter_count; i++) { driver_parameter ¶meter = settings->parameters[i]; - if (strcmp(parameter.name, "mode") == 0 && parameter.value_count > 2) { - uint32 width = strtoul(parameter.values[0], NULL, 0); - uint32 height = strtoul(parameter.values[1], NULL, 0); - uint32 depth = strtoul(parameter.values[2], NULL, 0); + if (parameter.value_count < 3 || strcmp(parameter.name, "mode") != 0) continue; + uint32 width = strtoul(parameter.values[0], NULL, 0); + uint32 height = strtoul(parameter.values[1], NULL, 0); + uint32 depth = strtoul(parameter.values[2], NULL, 0); - // search mode that fits - video_mode *mode = closest_video_mode(width, height, depth); - if (mode != NULL) { - found = true; - sGraphicsMode = mode->mode; - } + // search mode that fits + video_mode *mode = closest_video_mode(width, height, depth); + if (mode != NULL) { + sGraphicsMode = mode->mode; + break; } } @@ -257,7 +254,7 @@ platform_switch_to_logo(void) sGraphicsOutput->Mode->Info->PixelsPerScanLine * gKernelArgs.frame_buffer.depth / 8; - video_display_splash(gKernelArgs.frame_buffer.physical_buffer.start); + video_display_splash(gKernelArgs.frame_buffer.physical_buffer.start, false); } diff --git a/src/system/boot/platform/generic/video_splash.cpp b/src/system/boot/platform/generic/video_splash.cpp index 5d1c41166a..53f92763ce 100644 --- a/src/system/boot/platform/generic/video_splash.cpp +++ b/src/system/boot/platform/generic/video_splash.cpp @@ -81,14 +81,14 @@ uncompress(const uint8 compressed[], unsigned int compressedSize, extern "C" status_t -video_display_splash(addr_t frameBuffer) +video_display_splash(addr_t frameBuffer, bool clear) { if (!gKernelArgs.frame_buffer.enabled) return B_NO_INIT; - // clear the video memory - memset((void*)frameBuffer, 0, - gKernelArgs.frame_buffer.physical_buffer.size); + if (clear) + memset((void*)frameBuffer, 0, + gKernelArgs.frame_buffer.physical_buffer.size); uint8* uncompressedLogo = NULL; unsigned int uncompressedSize = kSplashLogoWidth * kSplashLogoHeight; diff --git a/src/system/boot/platform/openfirmware/video.cpp b/src/system/boot/platform/openfirmware/video.cpp index 639723d09b..38c6646d6e 100644 --- a/src/system/boot/platform/openfirmware/video.cpp +++ b/src/system/boot/platform/openfirmware/video.cpp @@ -93,7 +93,8 @@ platform_switch_to_logo(void) gKernelArgs.frame_buffer.enabled = true; // the memory will be identity-mapped already - video_display_splash(gKernelArgs.frame_buffer.physical_buffer.start); + video_display_splash(gKernelArgs.frame_buffer.physical_buffer.start, + true); } diff --git a/src/system/boot/platform/u-boot/video.cpp b/src/system/boot/platform/u-boot/video.cpp index 1c149b0523..e2392c1146 100644 --- a/src/system/boot/platform/u-boot/video.cpp +++ b/src/system/boot/platform/u-boot/video.cpp @@ -89,7 +89,7 @@ platform_switch_to_logo(void) return; } - err = video_display_splash(gFramebuffer->Base()); + err = video_display_splash(gFramebuffer->Base(), true); } }