]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c
Merge GOP related code from r8->r9.
[mirror_edk2.git] / EdkModulePkg / Universal / Console / GraphicsConsole / Dxe / GraphicsConsole.c
index d70c979b72964b569b2b2dd88c24ae25f8335cd6..6cea2e11b60def5cecdf8996a12a1152fc82e243 100644 (file)
@@ -60,8 +60,8 @@ GraphicsConsoleControllerDriverStop (
 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
@@ -87,6 +87,7 @@ EraseCursor (
 //\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
@@ -110,10 +111,10 @@ GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {
   },\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
@@ -121,26 +122,26 @@ EFI_HII_PROTOCOL            *mHii;
 \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
@@ -149,9 +150,6 @@ static EFI_NARROW_GLYPH     mCursorGlyph = {
   { 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
@@ -170,23 +168,41 @@ GraphicsConsoleControllerDriverSupported (
   )\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
@@ -219,13 +235,21 @@ GraphicsConsoleControllerDriverSupported (
   // 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
@@ -268,6 +292,12 @@ GraphicsConsoleControllerDriverStart (
   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
@@ -283,15 +313,28 @@ GraphicsConsoleControllerDriverStart (
 \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
@@ -331,30 +374,71 @@ GraphicsConsoleControllerDriverStart (
   //\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
@@ -371,8 +455,9 @@ GraphicsConsoleControllerDriverStart (
   // 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
@@ -381,8 +466,9 @@ GraphicsConsoleControllerDriverStart (
   // 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
@@ -395,8 +481,9 @@ GraphicsConsoleControllerDriverStart (
     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
@@ -404,8 +491,9 @@ GraphicsConsoleControllerDriverStart (
 \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
@@ -440,14 +528,23 @@ GraphicsConsoleControllerDriverStart (
 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
@@ -496,14 +593,23 @@ GraphicsConsoleControllerDriverStop (
 \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
@@ -640,6 +746,7 @@ GraphicsConsoleConOutOutputString (
 --*/\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
@@ -649,19 +756,21 @@ GraphicsConsoleConOutOutputString (
   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
@@ -670,7 +779,7 @@ GraphicsConsoleConOutOutputString (
   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
@@ -720,38 +829,71 @@ GraphicsConsoleConOutOutputString (
       // 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
@@ -1018,15 +1160,17 @@ GraphicsConsoleConOutSetMode (
 {\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
@@ -1045,7 +1189,7 @@ GraphicsConsoleConOutSetMode (
   //\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
@@ -1084,50 +1228,82 @@ GraphicsConsoleConOutSetMode (
   //\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
@@ -1223,28 +1399,44 @@ GraphicsConsoleConOutClearScreen (
   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
@@ -1353,8 +1545,8 @@ GraphicsConsoleConOutEnableCursor (
 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
@@ -1381,9 +1573,10 @@ DrawUnicodeWeightAtCursorN (
   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
@@ -1473,19 +1666,35 @@ DrawUnicodeWeightAtCursorN (
   //\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
@@ -1499,10 +1708,11 @@ EraseCursor (
   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
@@ -1513,6 +1723,7 @@ EraseCursor (
   }\r
 \r
   Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw = Private->UgaDraw;\r
 \r
   //\r
@@ -1523,18 +1734,33 @@ EraseCursor (
   //\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
@@ -1549,18 +1775,33 @@ EraseCursor (
     }\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