diff options
-rw-r--r-- | stand/common/gfx_fb.c | 10 | ||||
-rw-r--r-- | stand/efi/loader/framebuffer.c | 26 |
2 files changed, 32 insertions, 4 deletions
diff --git a/stand/common/gfx_fb.c b/stand/common/gfx_fb.c index 63036f3c07f6..395332af9990 100644 --- a/stand/common/gfx_fb.c +++ b/stand/common/gfx_fb.c @@ -161,6 +161,14 @@ static const int vga_to_cons_colors[NCOLORS] = { 8, 9, 10, 11, 12, 13, 14, 15 }; +/* + * It is reported very slow console draw in some systems. + * in order to exclude buggy gop->Blt(), we want option + * to use direct draw to framebuffer and avoid gop->Blt. + * Can be toggled with "gop" command. + */ +bool ignore_gop_blt = false; + struct text_pixel *screen_buffer; #if defined(EFI) static EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GlyphBuffer; @@ -795,7 +803,7 @@ gfxfb_blt(void *BltBuffer, GFXFB_BLT_OPERATION BltOperation, * done as they are provided by protocols that disappear when exit * boot services. */ - if (gop != NULL && boot_services_active) { + if (!ignore_gop_blt && gop != NULL && boot_services_active) { tpl = BS->RaiseTPL(TPL_NOTIFY); switch (BltOperation) { case GfxFbBltVideoFill: diff --git a/stand/efi/loader/framebuffer.c b/stand/efi/loader/framebuffer.c index ea4131b751c8..141a29305f7c 100644 --- a/stand/efi/loader/framebuffer.c +++ b/stand/efi/loader/framebuffer.c @@ -856,6 +856,7 @@ command_gop(int argc, char *argv[]) struct efi_fb efifb; EFI_STATUS status; u_int mode; + extern bool ignore_gop_blt; if (gop == NULL) { snprintf(command_errbuf, sizeof(command_errbuf), @@ -866,7 +867,7 @@ command_gop(int argc, char *argv[]) if (argc < 2) goto usage; - if (!strcmp(argv[1], "set")) { + if (strcmp(argv[1], "set") == 0) { char *cp; if (argc != 3) @@ -884,7 +885,26 @@ command_gop(int argc, char *argv[]) return (CMD_ERROR); } (void) cons_update_mode(true); + } else if (strcmp(argv[1], "blt") == 0) { + /* + * "blt on" does allow gop->Blt() to be used (default). + * "blt off" does block gop->Blt() to be used and use + * software rendering instead. + */ + if (argc != 3) + goto usage; + if (strcmp(argv[2], "on") == 0) + ignore_gop_blt = false; + else if (strcmp(argv[2], "off") == 0) + ignore_gop_blt = true; + else + goto usage; } else if (strcmp(argv[1], "off") == 0) { + /* + * Tell console to use SimpleTextOutput protocol. + * This means that we do not render the glyphs, but rely on + * UEFI firmware to draw on ConsOut device(s). + */ (void) cons_update_mode(false); } else if (strcmp(argv[1], "get") == 0) { edid_res_list_t res; @@ -908,7 +928,7 @@ command_gop(int argc, char *argv[]) } print_efifb(gop->Mode->Mode, &efifb, 1); printf("\n"); - } else if (!strcmp(argv[1], "list")) { + } else if (strcmp(argv[1], "list") == 0) { EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; UINTN infosz; @@ -931,7 +951,7 @@ command_gop(int argc, char *argv[]) usage: snprintf(command_errbuf, sizeof(command_errbuf), - "usage: %s [list | get | set <mode> | off]", argv[0]); + "usage: %s [list | get | set <mode> | off | blt <on|off>]", argv[0]); return (CMD_ERROR); } |