1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-11-24 07:40:52 +00:00

vt: splash: Use splash screen passed from loader

If loader(8) gives use a splash screen to use using the MODINFOMD_SPLASH
type, use it if RB_MUTE is set to "YES".
By design only argb data will be displayed.

Differential Revision:	https://reviews.freebsd.org/D45931
Reviewed by:		imp, tsoome
Sponsored by:		Beckhoff Automation GmbH & Co. KG
This commit is contained in:
Emmanuel Vadot 2024-07-09 14:38:41 +02:00
parent 966e53a4e5
commit f6e8b0e850

View File

@ -44,6 +44,7 @@
#include <sys/lock.h> #include <sys/lock.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/splash.h>
#include <sys/power.h> #include <sys/power.h>
#include <sys/priv.h> #include <sys/priv.h>
#include <sys/proc.h> #include <sys/proc.h>
@ -1657,18 +1658,33 @@ vtterm_done(struct terminal *tm)
static void static void
vtterm_splash(struct vt_device *vd) vtterm_splash(struct vt_device *vd)
{ {
caddr_t kmdp;
struct splash_info *si;
uintptr_t image;
vt_axis_t top, left; vt_axis_t top, left;
/* Display a nice boot splash. */ kmdp = preload_search_by_type("elf kernel");
if (kmdp == NULL)
kmdp = preload_search_by_type("elf64 kernel");
si = MD_FETCH(kmdp, MODINFOMD_SPLASH, struct splash_info *);
if (!(vd->vd_flags & VDF_TEXTMODE) && (boothowto & RB_MUTE)) { if (!(vd->vd_flags & VDF_TEXTMODE) && (boothowto & RB_MUTE)) {
top = (vd->vd_height - vt_logo_height) / 2; if (si == NULL) {
left = (vd->vd_width - vt_logo_width) / 2; top = (vd->vd_height - vt_logo_height) / 2;
switch (vt_logo_depth) { left = (vd->vd_width - vt_logo_width) / 2;
case 1:
/* XXX: Unhardcode colors! */
vd->vd_driver->vd_bitblt_bmp(vd, vd->vd_curwindow, vd->vd_driver->vd_bitblt_bmp(vd, vd->vd_curwindow,
vt_logo_image, NULL, vt_logo_width, vt_logo_height, vt_logo_image, NULL, vt_logo_width, vt_logo_height,
left, top, TC_WHITE, TC_BLACK); left, top, TC_WHITE, TC_BLACK);
} else {
if (si->si_depth != 4)
return;
printf("SPLASH: width: %d height: %d depth: %d\n", si->si_width, si->si_height, si->si_depth);
image = (uintptr_t)si + sizeof(struct splash_info);
image = roundup2(image, 8);
top = (vd->vd_height - si->si_height) / 2;
left = (vd->vd_width - si->si_width) / 2;
vd->vd_driver->vd_bitblt_argb(vd, vd->vd_curwindow,
(unsigned char *)image, si->si_width, si->si_height,
left, top);
} }
vd->vd_flags |= VDF_SPLASH; vd->vd_flags |= VDF_SPLASH;
} }