From 015d42aefa7cdebee79f12f9eca113e234574c89 Mon Sep 17 00:00:00 2001
From: Matt DeVillier <matt.devillier(a)puri.sm>
Date: Tue, 24 Sep 2019 12:29:55 -0500
Subject: [PATCH] Reduce video modeswitching when using a boot splash
image
In the normal boot flow, the VGA console is enabled immediately after
running the VGA option ROM. Later, after device hardware setup, if a
bootsplash is used, the video modeis changed from VGA text to a
graphics mode, then back to VGA text mode to show the boot menu. In the
normal case where the boot menu is not invoked, this can produce a bit
of flickering as the display mode changes 3x in a short period of time.
To mitigate this, display the bootsplash earlier in the boot process if
used, and switch to VGA text mode only as needed to show the boot menu.
Show the Boot Menu Message only if a boot splash is not currently being
shown.
Signed-off-by: Matt DeVillier <matt.devillier(a)puri.sm>
---
src/boot.c | 10 ++++++----
src/bootsplash.c | 2 +-
src/post.c | 2 +-
src/util.h | 1 +
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/boot.c b/src/boot.c
index 9f82f3c..f4c0f42 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -479,11 +479,13 @@ interactive_bootmenu(void)
char *bootmsg = romfile_loadfile("etc/boot-menu-message", NULL);
int menukey = romfile_loadint("etc/boot-menu-key", 1);
- printf("%s", bootmsg ?: "\nPress ESC for boot menu.\n\n");
- free(bootmsg);
-
u32 menutime = romfile_loadint("etc/boot-menu-wait",
DEFAULT_BOOTMENU_WAIT);
- enable_bootsplash();
+
+ if (!BootsplashActive) {
+ enable_vga_console();
+ printf("%s", bootmsg ?: "\nPress ESC for boot menu.\n\n");
+ free(bootmsg);
+ }
int scan_code = get_keystroke(menutime);
disable_bootsplash();
if (scan_code != menukey)
diff --git a/src/bootsplash.c b/src/bootsplash.c
index 538b316..6fa91dd 100644
--- a/src/bootsplash.c
+++ b/src/bootsplash.c
@@ -92,7 +92,7 @@ find_videomode(struct vbe_info *vesa_info, struct
vbe_mode_info *mode_info
}
}
-static int BootsplashActive;
+int BootsplashActive = 0;
void
enable_bootsplash(void)
diff --git a/src/post.c b/src/post.c
index f93106a..ad45b07 100644
--- a/src/post.c
+++ b/src/post.c
@@ -209,7 +209,7 @@ maininit(void)
// Run vga option rom
vgarom_setup();
sercon_setup();
- enable_vga_console();
+ enable_bootsplash();
// Do hardware initialization (if running synchronously)
if (!threads_during_optionroms()) {
diff --git a/src/util.h b/src/util.h
index 9c06850..997789d 100644
--- a/src/util.h
+++ b/src/util.h
@@ -42,6 +42,7 @@ int get_keystroke(int msec);
void enable_vga_console(void);
void enable_bootsplash(void);
void disable_bootsplash(void);
+extern int BootsplashActive;
// cdrom.c
extern struct eltorito_s CDEmu;
--
2.20.1