EFI_STATUS\r
GetTextColors (\r
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- OUT EFI_UGA_PIXEL *Foreground,\r
- OUT EFI_UGA_PIXEL *Background\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
);\r
\r
EFI_STATUS\r
//\r
GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = {\r
GRAPHICS_CONSOLE_DEV_SIGNATURE,\r
+ (EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL,\r
(EFI_UGA_DRAW_PROTOCOL *) NULL,\r
{\r
GraphicsConsoleConOutReset,\r
},\r
{\r
{ 80, 25, 0, 0, 0, 0 }, // Mode 0\r
- { 0, 0, 0, 0, 0, 0 }, // Mode 1\r
+ { 80, 50, 0, 0, 0, 0 }, // Mode 1\r
{ 0, 0, 0, 0, 0, 0 } // Mode 2\r
},\r
- (EFI_UGA_PIXEL *) NULL,\r
+ (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
(EFI_HII_HANDLE) 0\r
};\r
\r
\r
static CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
\r
-static EFI_UGA_PIXEL mEfiColors[16] = {\r
+static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
//\r
// B G R\r
//\r
- { 0x00, 0x00, 0x00, 0x00 }, // BLACK\r
- { 0x98, 0x00, 0x00, 0x00 }, // BLUE\r
- { 0x00, 0x98, 0x00, 0x00 }, // GREEN\r
- { 0x98, 0x98, 0x00, 0x00 }, // CYAN\r
- { 0x00, 0x00, 0x98, 0x00 }, // RED\r
- { 0x98, 0x00, 0x98, 0x00 }, // MAGENTA\r
- { 0x00, 0x98, 0x98, 0x00 }, // BROWN\r
- { 0x98, 0x98, 0x98, 0x00 }, // LIGHTGRAY\r
- { 0x30, 0x30, 0x30, 0x00 }, // DARKGRAY - BRIGHT BLACK\r
- { 0xff, 0x00, 0x00, 0x00 }, // LIGHTBLUE - ?\r
- { 0x00, 0xff, 0x00, 0x00 }, // LIGHTGREEN - ?\r
- { 0xff, 0xff, 0x00, 0x00 }, // LIGHTCYAN\r
- { 0x00, 0x00, 0xff, 0x00 }, // LIGHTRED\r
- { 0xff, 0x00, 0xff, 0x00 }, // LIGHTMAGENTA\r
- { 0x00, 0xff, 0xff, 0x00 }, // LIGHTBROWN\r
- { 0xff, 0xff, 0xff, 0x00 } // WHITE\r
+ 0x00, 0x00, 0x00, 0x00, // BLACK\r
+ 0x98, 0x00, 0x00, 0x00, // BLUE\r
+ 0x00, 0x98, 0x00, 0x00, // GREEN\r
+ 0x98, 0x98, 0x00, 0x00, // CYAN\r
+ 0x00, 0x00, 0x98, 0x00, // RED\r
+ 0x98, 0x00, 0x98, 0x00, // MAGENTA\r
+ 0x00, 0x98, 0x98, 0x00, // BROWN\r
+ 0x98, 0x98, 0x98, 0x00, // LIGHTGRAY\r
+ 0x30, 0x30, 0x30, 0x00, // DARKGRAY - BRIGHT BLACK\r
+ 0xff, 0x00, 0x00, 0x00, // LIGHTBLUE - ?\r
+ 0x00, 0xff, 0x00, 0x00, // LIGHTGREEN - ?\r
+ 0xff, 0xff, 0x00, 0x00, // LIGHTCYAN\r
+ 0x00, 0x00, 0xff, 0x00, // LIGHTRED\r
+ 0xff, 0x00, 0xff, 0x00, // LIGHTMAGENTA\r
+ 0x00, 0xff, 0xff, 0x00, // LIGHTBROWN\r
+ 0xff, 0xff, 0xff, 0x00, // WHITE\r
};\r
\r
static EFI_NARROW_GLYPH mCursorGlyph = {\r
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF }\r
};\r
\r
-static CHAR16 SpaceStr[] = { (CHAR16)NARROW_CHAR, ' ', 0 };\r
-\r
-\r
EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
GraphicsConsoleControllerDriverSupported,\r
GraphicsConsoleControllerDriverStart,\r
)\r
{\r
EFI_STATUS Status;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
+ UgaDraw = NULL;\r
//\r
// Open the IO Abstraction(s) needed to perform the supported test\r
//\r
Status = gBS->OpenProtocol (\r
Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &UgaDraw,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID **) &GraphicsOutput,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
+ \r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ GraphicsOutput = NULL;\r
+ //\r
+ // Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Controller,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ (VOID **) &UgaDraw,\r
+ This->DriverBindingHandle,\r
+ Controller,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
}\r
+\r
//\r
// We need to ensure that we do not layer on top of a virtual handle.\r
// We need to ensure that the handles produced by the conspliter do not\r
// Close the I/O Abstraction(s) used to perform the supported test\r
//\r
Error:\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
+ if (GraphicsOutput != NULL) {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ } else {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ }\r
return Status;\r
}\r
\r
UINTN Columns;\r
UINTN Rows;\r
UINT8 *Location;\r
+ UINT32 ModeNumber;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ \r
+ ModeNumber = 0;\r
+\r
//\r
// Initialize the Graphics Console device instance\r
//\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &Private->UgaDraw,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID **) &Private->GraphicsOutput,\r
This->DriverBindingHandle,\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
+ if (EFI_ERROR(Status)) {\r
+ Private->GraphicsOutput = NULL;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ Controller,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ (VOID **) &Private->UgaDraw,\r
+ This->DriverBindingHandle,\r
+ Controller,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
}\r
+\r
//\r
// Get the HII protocol. If Supported() succeeds, do we really\r
// need to get HII protocol again?\r
//\r
HorizontalResolution = 800;\r
VerticalResolution = 600;\r
- ColorDepth = 32;\r
- RefreshRate = 60;\r
- Status = Private->UgaDraw->SetMode (\r
- Private->UgaDraw,\r
- HorizontalResolution,\r
- VerticalResolution,\r
- ColorDepth,\r
- RefreshRate\r
- );\r
- if (EFI_ERROR (Status)) {\r
+\r
+ if (Private->GraphicsOutput != NULL) {\r
//\r
- // Get the current mode information from the UGA Draw Protocol\r
+ // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
//\r
- Status = Private->UgaDraw->GetMode (\r
+ for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
+ Status = Private->GraphicsOutput->QueryMode (\r
+ Private->GraphicsOutput,\r
+ ModeNumber,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution == 800) &&\r
+ (Info->VerticalResolution == 600) &&\r
+ ((Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) ||\r
+ (Info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor))) {\r
+ Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->FreePool (Info);\r
+ break;\r
+ }\r
+ }\r
+ gBS->FreePool (Info);\r
+ }\r
+ }\r
+\r
+ if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
+ //\r
+ // Set default mode failed or device don't support default mode, then get the current mode information\r
+ //\r
+ HorizontalResolution = Private->GraphicsOutput->Mode->Info->HorizontalResolution;\r
+ VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
+ ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
+ }\r
+ } else {\r
+ //\r
+ // The console is build on top of UGA Draw Protocol\r
+ //\r
+ ColorDepth = 32;\r
+ RefreshRate = 60;\r
+ Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
+ ColorDepth,\r
+ RefreshRate\r
);\r
if (EFI_ERROR (Status)) {\r
- goto Error;\r
+ //\r
+ // Get the current mode information from the UGA Draw Protocol\r
+ //\r
+ Status = Private->UgaDraw->GetMode (\r
+ Private->UgaDraw,\r
+ &HorizontalResolution,\r
+ &VerticalResolution,\r
+ &ColorDepth,\r
+ &RefreshRate\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
}\r
}\r
+\r
//\r
// Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
//\r
// Add Mode #0 that must be 80x25\r
//\r
MaxMode = 0;\r
- Private->ModeData[MaxMode].UgaWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].UgaHeight = VerticalResolution;\r
+ Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
+ Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * GLYPH_HEIGHT)) >> 1;\r
MaxMode++;\r
// If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
//\r
if (Rows >= 50) {\r
- Private->ModeData[MaxMode].UgaWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].UgaHeight = VerticalResolution;\r
+ Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
+ Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
MaxMode++;\r
if (MaxMode < 2) {\r
Private->ModeData[MaxMode].Columns = 0;\r
Private->ModeData[MaxMode].Rows = 0;\r
- Private->ModeData[MaxMode].UgaWidth = 800;\r
- Private->ModeData[MaxMode].UgaHeight = 600;\r
+ Private->ModeData[MaxMode].GopWidth = 800;\r
+ Private->ModeData[MaxMode].GopHeight = 600;\r
+ Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
Private->ModeData[MaxMode].DeltaX = 0;\r
Private->ModeData[MaxMode].DeltaY = 0;\r
MaxMode++;\r
\r
Private->ModeData[MaxMode].Columns = 800 / GLYPH_WIDTH;\r
Private->ModeData[MaxMode].Rows = 600 / GLYPH_HEIGHT;\r
- Private->ModeData[MaxMode].UgaWidth = 800;\r
- Private->ModeData[MaxMode].UgaHeight = 600;\r
+ Private->ModeData[MaxMode].GopWidth = 800;\r
+ Private->ModeData[MaxMode].GopHeight = 600;\r
+ Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
Private->ModeData[MaxMode].DeltaX = (800 % GLYPH_WIDTH) >> 1;\r
Private->ModeData[MaxMode].DeltaY = (600 % GLYPH_HEIGHT) >> 1;\r
MaxMode++;\r
Error:\r
if (EFI_ERROR (Status)) {\r
//\r
- // Close the UGA IO Protocol\r
+ // Close the GOP or UGA IO Protocol\r
//\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ if (Private->GraphicsOutput != NULL) {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ } else {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ }\r
\r
//\r
// Free private data\r
\r
if (!EFI_ERROR (Status)) {\r
//\r
- // Close the UGA IO Protocol\r
+ // Close the GOP or UGA IO Protocol\r
//\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
+ if (Private->GraphicsOutput != NULL) {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ } else {\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ }\r
\r
//\r
// Remove the font pack\r
--*/\r
{\r
GRAPHICS_CONSOLE_DEV *Private;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
INTN Mode;\r
UINTN MaxColumn;\r
UINTN Delta;\r
EFI_STATUS Status;\r
BOOLEAN Warning;\r
- EFI_UGA_PIXEL Foreground;\r
- EFI_UGA_PIXEL Background;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
UINTN DeltaX;\r
UINTN DeltaY;\r
UINTN Count;\r
UINTN Index;\r
INT32 OriginAttribute;\r
+ CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
\r
//\r
// Current mode\r
//\r
Mode = This->Mode->Mode;\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
\r
MaxColumn = Private->ModeData[Mode].Columns;\r
DeltaY = Private->ModeData[Mode].DeltaY;\r
Width = MaxColumn * GLYPH_WIDTH;\r
Height = (MaxRow - 1) * GLYPH_HEIGHT;\r
- Delta = Width * sizeof (EFI_UGA_PIXEL);\r
+ Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
\r
//\r
// The Attributes won't change when during the time OutputString is called\r
// down one row.\r
//\r
if (This->Mode->CursorRow == (INT32) (MaxRow - 1)) {\r
- //\r
- // Scroll Screen Up One Row\r
- //\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- NULL,\r
- EfiUgaVideoToVideo,\r
- DeltaX,\r
- DeltaY + GLYPH_HEIGHT,\r
- DeltaX,\r
- DeltaY,\r
- Width,\r
- Height,\r
- Delta\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ //\r
+ // Scroll Screen Up One Row\r
+ //\r
+ GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ NULL,\r
+ EfiBltVideoToVideo,\r
+ DeltaX,\r
+ DeltaY + GLYPH_HEIGHT,\r
+ DeltaX,\r
+ DeltaY,\r
+ Width,\r
+ Height,\r
+ Delta\r
+ );\r
\r
- //\r
- // Print Blank Line at last line\r
- //\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- &Background,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- DeltaX,\r
- DeltaY + Height,\r
- Width,\r
- GLYPH_HEIGHT,\r
- Delta\r
- );\r
+ //\r
+ // Print Blank Line at last line\r
+ //\r
+ GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ &Background,\r
+ EfiBltVideoFill,\r
+ 0,\r
+ 0,\r
+ DeltaX,\r
+ DeltaY + Height,\r
+ Width,\r
+ GLYPH_HEIGHT,\r
+ Delta\r
+ );\r
+ } else {\r
+ //\r
+ // Scroll Screen Up One Row\r
+ //\r
+ UgaDraw->Blt (\r
+ UgaDraw,\r
+ NULL,\r
+ EfiUgaVideoToVideo,\r
+ DeltaX,\r
+ DeltaY + GLYPH_HEIGHT,\r
+ DeltaX,\r
+ DeltaY,\r
+ Width,\r
+ Height,\r
+ Delta\r
+ );\r
\r
+ //\r
+ // Print Blank Line at last line\r
+ //\r
+ UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) &Background,\r
+ EfiUgaVideoFill,\r
+ 0,\r
+ 0,\r
+ DeltaX,\r
+ DeltaY + Height,\r
+ Width,\r
+ GLYPH_HEIGHT,\r
+ Delta\r
+ );\r
+ }\r
} else {\r
This->Mode->CursorRow++;\r
}\r
{\r
EFI_STATUS Status;\r
GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
- EFI_UGA_PIXEL *NewLineBuffer;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *NewLineBuffer;\r
UINT32 HorizontalResolution;\r
UINT32 VerticalResolution;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
UINT32 ColorDepth;\r
UINT32 RefreshRate;\r
\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
ModeData = &(Private->ModeData[ModeNumber]);\r
\r
//\r
Status = gBS->AllocatePool (\r
EfiBootServicesData,\r
- sizeof (EFI_UGA_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT,\r
+ sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT,\r
(VOID **) &NewLineBuffer\r
);\r
if (EFI_ERROR (Status)) {\r
//\r
Private->LineBuffer = NewLineBuffer;\r
\r
- //\r
- // Get the current UGA Draw mode information\r
- //\r
- Status = UgaDraw->GetMode (\r
- UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
- );\r
- if (EFI_ERROR (Status) || HorizontalResolution != ModeData->UgaWidth || VerticalResolution != ModeData->UgaHeight) {\r
- //\r
- // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
- //\r
- Status = UgaDraw->SetMode (\r
- UgaDraw,\r
- ModeData->UgaWidth,\r
- ModeData->UgaHeight,\r
- 32,\r
- 60\r
- );\r
- if (EFI_ERROR (Status)) {\r
+ if (GraphicsOutput != NULL) {\r
+ if (ModeData->GopModeNumber != GraphicsOutput->Mode->Mode) {\r
//\r
- // The mode set operation failed\r
+ // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
//\r
- return Status;\r
+ Status = GraphicsOutput->SetMode (GraphicsOutput, ModeData->GopModeNumber);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // The mode set operation failed\r
+ //\r
+ return Status;\r
+ }\r
+ } else {\r
+ //\r
+ // The current graphics mode is correct, so simply clear the entire display\r
+ //\r
+ Status = GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ &mEfiColors[0],\r
+ EfiBltVideoFill,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ModeData->GopWidth,\r
+ ModeData->GopHeight,\r
+ 0\r
+ );\r
}\r
} else {\r
//\r
- // The current graphics mode is correct, so simply clear the entire display\r
+ // Get the current UGA Draw mode information\r
//\r
- Status = UgaDraw->Blt (\r
+ Status = UgaDraw->GetMode (\r
UgaDraw,\r
- &mEfiColors[0],\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->UgaWidth,\r
- ModeData->UgaHeight,\r
- 0\r
+ &HorizontalResolution,\r
+ &VerticalResolution,\r
+ &ColorDepth,\r
+ &RefreshRate\r
);\r
+ if (EFI_ERROR (Status) || HorizontalResolution != ModeData->GopWidth || VerticalResolution != ModeData->GopHeight) {\r
+ //\r
+ // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
+ //\r
+ Status = UgaDraw->SetMode (\r
+ UgaDraw,\r
+ ModeData->GopWidth,\r
+ ModeData->GopHeight,\r
+ 32,\r
+ 60\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // The mode set operation failed\r
+ //\r
+ return Status;\r
+ }\r
+ } else {\r
+ //\r
+ // The current graphics mode is correct, so simply clear the entire display\r
+ //\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) &mEfiColors[0],\r
+ EfiUgaVideoFill,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ModeData->GopWidth,\r
+ ModeData->GopHeight,\r
+ 0\r
+ );\r
+ }\r
}\r
+\r
//\r
// The new mode is valid, so commit the mode change\r
//\r
EFI_STATUS Status;\r
GRAPHICS_CONSOLE_DEV *Private;\r
GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_UGA_PIXEL Foreground;\r
- EFI_UGA_PIXEL Background;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
ModeData = &(Private->ModeData[This->Mode->Mode]);\r
\r
GetTextColors (This, &Foreground, &Background);\r
-\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- &Background,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->UgaWidth,\r
- ModeData->UgaHeight,\r
- 0\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ &Background,\r
+ EfiBltVideoFill,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ModeData->GopWidth,\r
+ ModeData->GopHeight,\r
+ 0\r
+ );\r
+ } else {\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) &Background,\r
+ EfiUgaVideoFill,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ModeData->GopWidth,\r
+ ModeData->GopHeight,\r
+ 0\r
+ );\r
+ }\r
\r
This->Mode->CursorColumn = 0;\r
This->Mode->CursorRow = 0;\r
EFI_STATUS\r
GetTextColors (\r
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- OUT EFI_UGA_PIXEL *Foreground,\r
- OUT EFI_UGA_PIXEL *Background\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
)\r
{\r
INTN Attribute;\r
GLYPH_UNION GlyphData;\r
INTN GlyphX;\r
INTN GlyphY;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_UGA_PIXEL Foreground;\r
- EFI_UGA_PIXEL Background;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
UINTN Index;\r
UINTN ArrayIndex;\r
UINTN Counts;\r
//\r
GlyphX = This->Mode->CursorColumn * GLYPH_WIDTH;\r
GlyphY = This->Mode->CursorRow * GLYPH_HEIGHT;\r
+ GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- Private->LineBuffer,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
- GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
- GLYPH_WIDTH * Count,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ Private->LineBuffer,\r
+ EfiBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ GLYPH_WIDTH * Count,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * Count * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else {\r
+ UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) Private->LineBuffer,\r
+ EfiUgaBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ GLYPH_WIDTH * Count,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ }\r
\r
return ReturnStatus;\r
}\r
EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode;\r
INTN GlyphX;\r
INTN GlyphY;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_UGA_PIXEL_UNION Foreground;\r
- EFI_UGA_PIXEL_UNION Background;\r
- EFI_UGA_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
UINTN X;\r
UINTN Y;\r
\r
}\r
\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
\r
//\r
//\r
GlyphX = (CurrentMode->CursorColumn * GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
GlyphY = (CurrentMode->CursorRow * GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) BltChar,\r
- EfiUgaVideoToBltBuffer,\r
- GlyphX,\r
- GlyphY,\r
- 0,\r
- 0,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
+ EfiBltVideoToBltBuffer,\r
+ GlyphX,\r
+ GlyphY,\r
+ 0,\r
+ 0,\r
+ GLYPH_WIDTH,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else {\r
+ UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
+ EfiUgaVideoToBltBuffer,\r
+ GlyphX,\r
+ GlyphY,\r
+ 0,\r
+ 0,\r
+ GLYPH_WIDTH,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ }\r
\r
GetTextColors (This, &Foreground.Pixel, &Background.Pixel);\r
\r
}\r
}\r
\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) BltChar,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX,\r
- GlyphY,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
+ EfiBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ GlyphX,\r
+ GlyphY,\r
+ GLYPH_WIDTH,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else {\r
+ UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
+ EfiUgaBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ GlyphX,\r
+ GlyphY,\r
+ GLYPH_WIDTH,\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ }\r
\r
return EFI_SUCCESS;\r
}\r