]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Library/EdkGraphicsLib/Graphics.c
Merge GOP related code from r8->r9.
[mirror_edk2.git] / EdkModulePkg / Library / EdkGraphicsLib / Graphics.c
index 52936e3c40ae29de34b17362baacd7789f78f75c..4f0d37894ecdef682f92cdba38516ba463bc9734 100644 (file)
@@ -107,11 +107,11 @@ Returns:
 \r
 \r
 EFI_STATUS\r
-ConvertBmpToUgaBlt (\r
+ConvertBmpToGopBlt (\r
   IN  VOID      *BmpImage,\r
   IN  UINTN     BmpImageSize,\r
-  IN OUT VOID   **UgaBlt,\r
-  IN OUT UINTN  *UgaBltSize,\r
+  IN OUT VOID   **GopBlt,\r
+  IN OUT UINTN  *GopBltSize,\r
   OUT UINTN     *PixelHeight,\r
   OUT UINTN     *PixelWidth\r
   )\r
@@ -152,8 +152,8 @@ Returns:
   UINT8             *ImageHeader;\r
   BMP_IMAGE_HEADER  *BmpHeader;\r
   BMP_COLOR_MAP     *BmpColorMap;\r
-  EFI_UGA_PIXEL     *BltBuffer;\r
-  EFI_UGA_PIXEL     *Blt;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
   UINTN             BltBufferSize;\r
   UINTN             Index;\r
   UINTN             Height;\r
@@ -182,18 +182,18 @@ Returns:
   Image         = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;\r
   ImageHeader   = Image;\r
 \r
-  BltBufferSize = BmpHeader->PixelWidth * BmpHeader->PixelHeight * sizeof (EFI_UGA_PIXEL);\r
+  BltBufferSize = BmpHeader->PixelWidth * BmpHeader->PixelHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
   IsAllocated   = FALSE;\r
-  if (*UgaBlt == NULL) {\r
-    *UgaBltSize = BltBufferSize;\r
-    *UgaBlt     = AllocatePool (*UgaBltSize);\r
-    if (*UgaBlt == NULL) {\r
+  if (*GopBlt == NULL) {\r
+    *GopBltSize = BltBufferSize;\r
+    *GopBlt     = AllocatePool (*GopBltSize);\r
+    IsAllocated = TRUE;\r
+    if (*GopBlt == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    IsAllocated = TRUE;\r
   } else {\r
-    if (*UgaBltSize < BltBufferSize) {\r
-      *UgaBltSize = BltBufferSize;\r
+    if (*GopBltSize < BltBufferSize) {\r
+      *GopBltSize = BltBufferSize;\r
       return EFI_BUFFER_TOO_SMALL;\r
     }\r
   }\r
@@ -204,7 +204,7 @@ Returns:
   //\r
   // Convert image from BMP to Blt buffer format\r
   //\r
-  BltBuffer = *UgaBlt;\r
+  BltBuffer = *GopBlt;\r
   for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {\r
     Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth];\r
     for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) {\r
@@ -260,8 +260,8 @@ Returns:
 \r
       default:\r
         if (IsAllocated) {\r
-          gBS->FreePool (*UgaBlt);\r
-          *UgaBlt = NULL;\r
+          gBS->FreePool (*GopBlt);\r
+          *GopBlt = NULL;\r
         }\r
         return EFI_UNSUPPORTED;\r
         break;\r
@@ -345,20 +345,14 @@ Returns:
 {\r
   EFI_STATUS                    Status;\r
   EFI_CONSOLE_CONTROL_PROTOCOL  *ConsoleControl;\r
-  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
   EFI_OEM_BADGING_PROTOCOL      *Badging;\r
   UINT32                        SizeOfX;\r
   UINT32                        SizeOfY;\r
-  UINT32                        ColorDepth;\r
-  UINT32                        RefreshRate;\r
   INTN                          DestX;\r
   INTN                          DestY;\r
-\r
   UINT8                         *ImageData;\r
   UINTN                         ImageSize;\r
-  EFI_UGA_PIXEL                 *UgaBlt;\r
-  UINTN                         UgaBltSize;\r
-\r
+  UINTN                         BltSize;\r
   UINT32                        Instance;\r
   EFI_BADGING_FORMAT            Format;\r
   EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;\r
@@ -366,15 +360,31 @@ Returns:
   UINTN                         CoordinateY;\r
   UINTN                         Height;\r
   UINTN                         Width;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
+  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
+  UINT32                        ColorDepth;\r
+  UINT32                        RefreshRate;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
 \r
   Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
   if (EFI_ERROR (Status)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
+  UgaDraw = NULL;\r
+  //\r
+  // Try to open GOP first\r
+  //\r
+  Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput); \r
+  if (EFI_ERROR(Status)) {\r
+    GraphicsOutput = NULL;\r
+    //\r
+    // Open GOP failed, try to open UGA\r
+    //\r
+    Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
   }\r
 \r
   Badging = NULL;\r
@@ -382,9 +392,14 @@ Returns:
 \r
   ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics);\r
 \r
-  Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
+  if (GraphicsOutput != NULL) {\r
+    SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+    SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
+  } else {\r
+    Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
   }\r
 \r
   Instance = 0;\r
@@ -425,18 +440,22 @@ Returns:
       Attribute   = EfiBadgingDisplayAttributeCenter;\r
     }\r
 \r
-    UgaBlt = NULL;\r
-    Status = ConvertBmpToUgaBlt (\r
+    Blt = NULL;\r
+    Status = ConvertBmpToGopBlt (\r
               ImageData,\r
               ImageSize,\r
-              (VOID **) &UgaBlt,\r
-              &UgaBltSize,\r
+              (VOID**)&Blt,\r
+              &BltSize,\r
               &Height,\r
               &Width\r
               );\r
     if (EFI_ERROR (Status)) {\r
       gBS->FreePool (ImageData);\r
-      continue;\r
+      if (Badging == NULL) {\r
+        return Status;\r
+      } else {\r
+        continue;\r
+      }\r
     }\r
 \r
     switch (Attribute) {\r
@@ -492,22 +511,37 @@ Returns:
     }\r
 \r
     if ((DestX >= 0) && (DestY >= 0)) {\r
-      Status = UgaDraw->Blt (\r
-                          UgaDraw,\r
-                          UgaBlt,\r
-                          EfiUgaBltBufferToVideo,\r
-                          0,\r
-                          0,\r
-                          (UINTN) DestX,\r
-                          (UINTN) DestY,\r
-                          Width,\r
-                          Height,\r
-                          Width * sizeof (EFI_UGA_PIXEL)\r
-                          );\r
+      if (GraphicsOutput != NULL) {\r
+        Status = GraphicsOutput->Blt (\r
+                            GraphicsOutput,\r
+                            Blt,\r
+                            EfiBltBufferToVideo,\r
+                            0,\r
+                            0,\r
+                            (UINTN) DestX,\r
+                            (UINTN) DestY,\r
+                            Width,\r
+                            Height,\r
+                            Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+                            );\r
+      } else {\r
+        Status = UgaDraw->Blt (\r
+                            UgaDraw,\r
+                            (EFI_UGA_PIXEL *) Blt,\r
+                            EfiUgaBltBufferToVideo,\r
+                            0,\r
+                            0,\r
+                            (UINTN) DestX,\r
+                            (UINTN) DestY,\r
+                            Width,\r
+                            Height,\r
+                            Width * sizeof (EFI_UGA_PIXEL)\r
+                            );\r
+      }\r
     }\r
 \r
     gBS->FreePool (ImageData);\r
-    gBS->FreePool (UgaBlt);\r
+    gBS->FreePool (Blt);\r
 \r
     if (Badging == NULL) {\r
       break;\r
@@ -551,7 +585,7 @@ Returns:
   return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
 }\r
 \r
-static EFI_UGA_PIXEL  mEfiColors[16] = {\r
+static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
   { 0x00, 0x00, 0x00, 0x00 },\r
   { 0x98, 0x00, 0x00, 0x00 },\r
   { 0x00, 0x98, 0x00, 0x00 },\r
@@ -573,12 +607,13 @@ static EFI_UGA_PIXEL  mEfiColors[16] = {
 STATIC\r
 UINTN\r
 _IPrint (\r
+  IN EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput,\r
   IN EFI_UGA_DRAW_PROTOCOL            *UgaDraw,\r
   IN EFI_SIMPLE_TEXT_OUT_PROTOCOL     *Sto,\r
   IN UINTN                            X,\r
   IN UINTN                            Y,\r
-  IN EFI_UGA_PIXEL                    *Foreground,\r
-  IN EFI_UGA_PIXEL                    *Background,\r
+  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Foreground,\r
+  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Background,\r
   IN CHAR16                           *fmt,\r
   IN VA_LIST                          args\r
   )\r
@@ -590,6 +625,8 @@ Routine Description:
 \r
 Arguments:\r
 \r
+  GraphicsOutput  - Graphics output protocol interface\r
+  \r
   UgaDraw         - UGA draw protocol interface\r
   \r
   Sto             - Simple text out protocol interface\r
@@ -622,7 +659,7 @@ Returns:
   CHAR16            *UnicodeWeight;\r
   EFI_NARROW_GLYPH  *Glyph;\r
   EFI_HII_PROTOCOL  *Hii;\r
-  EFI_UGA_PIXEL     *LineBuffer;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL     *LineBuffer;\r
   UINT32            HorizontalResolution;\r
   UINT32            VerticalResolution;\r
   UINT32            ColorDepth;\r
@@ -637,10 +674,18 @@ Returns:
   if (Buffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+  \r
+  if (GraphicsOutput != NULL) {\r
+    HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+    VerticalResolution   = GraphicsOutput->Mode->Info->VerticalResolution;\r
+  } else {\r
+    //\r
+    // Get the current mode information from the UGA Draw Protocol\r
+    //\r
+    UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate);\r
+  }\r
 \r
-  UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate);\r
-\r
-  LineBuffer = AllocatePool (sizeof (EFI_UGA_PIXEL) * HorizontalResolution * GLYPH_WIDTH * GLYPH_HEIGHT);\r
+  LineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * GLYPH_WIDTH * GLYPH_HEIGHT);\r
   if (LineBuffer == NULL) {\r
     gBS->FreePool (Buffer);\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -698,18 +743,33 @@ Returns:
   //\r
   // Blt a character to the screen\r
   //\r
-  Status = UgaDraw->Blt (\r
-                      UgaDraw,\r
-                      LineBuffer,\r
-                      EfiUgaBltBufferToVideo,\r
-                      0,\r
-                      0,\r
-                      X,\r
-                      Y,\r
-                      GLYPH_WIDTH * StrLen (Buffer),\r
-                      GLYPH_HEIGHT,\r
-                      GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_UGA_PIXEL)\r
-                      );\r
+  if (GraphicsOutput != NULL) {\r
+    Status = GraphicsOutput->Blt (\r
+                        GraphicsOutput,\r
+                        LineBuffer,\r
+                        EfiBltBufferToVideo,\r
+                        0,\r
+                        0,\r
+                        X,\r
+                        Y,\r
+                        GLYPH_WIDTH * StrLen (Buffer),\r
+                        GLYPH_HEIGHT,\r
+                        GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+                        );\r
+  } else {\r
+    Status = UgaDraw->Blt (\r
+                        UgaDraw,\r
+                        (EFI_UGA_PIXEL *) (UINTN) LineBuffer,\r
+                        EfiUgaBltBufferToVideo,\r
+                        0,\r
+                        0,\r
+                        X,\r
+                        Y,\r
+                        GLYPH_WIDTH * StrLen (Buffer),\r
+                        GLYPH_HEIGHT,\r
+                        GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_UGA_PIXEL)\r
+                        );\r
+  }\r
 \r
 Error:\r
   gBS->FreePool (LineBuffer);\r
@@ -722,8 +782,8 @@ UINTN
 PrintXY (\r
   IN UINTN                            X,\r
   IN UINTN                            Y,\r
-  IN EFI_UGA_PIXEL                    *ForeGround, OPTIONAL\r
-  IN EFI_UGA_PIXEL                    *BackGround, OPTIONAL\r
+  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *ForeGround, OPTIONAL\r
+  IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *BackGround, OPTIONAL\r
   IN CHAR16                           *Fmt,\r
   ...\r
   )\r
@@ -754,6 +814,8 @@ Returns:
 --*/\r
 {\r
   EFI_HANDLE                    Handle;\r
+\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
   EFI_SIMPLE_TEXT_OUT_PROTOCOL  *Sto;\r
   EFI_STATUS                    Status;\r
@@ -761,16 +823,28 @@ Returns:
 \r
   VA_START (Args, Fmt);\r
 \r
+  UgaDraw = NULL;\r
+\r
   Handle = gST->ConsoleOutHandle;\r
 \r
   Status = gBS->HandleProtocol (\r
                   Handle,\r
-                  &gEfiUgaDrawProtocolGuid,\r
-                  (VOID **) &UgaDraw\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID **) &GraphicsOutput\r
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    GraphicsOutput = NULL;\r
+\r
+    Status = gBS->HandleProtocol (\r
+                    Handle,\r
+                    &gEfiUgaDrawProtocolGuid,\r
+                    (VOID **) &UgaDraw\r
+                    );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
   }\r
 \r
   Status = gBS->HandleProtocol (\r
@@ -783,5 +857,5 @@ Returns:
     return Status;\r
   }\r
 \r
-  return _IPrint (UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args);\r
+  return _IPrint (GraphicsOutput, UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args);\r
 }\r