Home | History | Annotate | Download | only in GopBltLib
      1 /** @file
      2   GopBltLib - Library to perform blt using the UEFI Graphics Output Protocol.
      3 
      4   Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "PiDxe.h"
     16 
     17 #include <Protocol/GraphicsOutput.h>
     18 
     19 #include <Library/BaseLib.h>
     20 #include <Library/BaseMemoryLib.h>
     21 #include <Library/BltLib.h>
     22 #include <Library/DebugLib.h>
     23 #include <Library/MemoryAllocationLib.h>
     24 #include <Library/UefiBootServicesTableLib.h>
     25 
     26 EFI_GRAPHICS_OUTPUT_PROTOCOL         *mGop = NULL;
     27 
     28 
     29 /**
     30   Configure the FrameBufferLib instance
     31 
     32   @param[in] FrameBuffer      Pointer to the start of the frame buffer
     33   @param[in] FrameBufferInfo  Describes the frame buffer characteristics
     34 
     35   @retval  EFI_INVALID_PARAMETER - Invalid parameter
     36   @retval  EFI_UNSUPPORTED - The BltLib does not support this configuration
     37   @retval  EFI_SUCCESS - Blt operation success
     38 
     39 **/
     40 EFI_STATUS
     41 EFIAPI
     42 BltLibConfigure (
     43   IN  VOID                                 *FrameBuffer,
     44   IN  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo
     45   )
     46 {
     47   EFI_STATUS                      Status;
     48   EFI_HANDLE                      *HandleBuffer;
     49   UINTN                           HandleCount;
     50   UINTN                           Index;
     51   EFI_GRAPHICS_OUTPUT_PROTOCOL    *Gop;
     52 
     53   Status = gBS->LocateHandleBuffer (
     54                   ByProtocol,
     55                   &gEfiGraphicsOutputProtocolGuid,
     56                   NULL,
     57                   &HandleCount,
     58                   &HandleBuffer
     59                   );
     60   if (!EFI_ERROR (Status)) {
     61     for (Index = 0; Index < HandleCount; Index++) {
     62       Status = gBS->HandleProtocol (
     63                       HandleBuffer[Index],
     64                       &gEfiGraphicsOutputProtocolGuid,
     65                       (VOID*) &Gop
     66                       );
     67       if (!EFI_ERROR (Status) &&
     68           (FrameBuffer == (VOID*)(UINTN) Gop->Mode->FrameBufferBase)) {
     69         mGop = Gop;
     70         FreePool (HandleBuffer);
     71         return EFI_SUCCESS;
     72       }
     73     }
     74 
     75     FreePool (HandleBuffer);
     76   }
     77 
     78   return EFI_UNSUPPORTED;
     79 }
     80 
     81 
     82 /**
     83   Performs a UEFI Graphics Output Protocol Blt operation.
     84 
     85   @param[in,out] BltBuffer     - The data to transfer to screen
     86   @param[in]     BltOperation  - The operation to perform
     87   @param[in]     SourceX       - The X coordinate of the source for BltOperation
     88   @param[in]     SourceY       - The Y coordinate of the source for BltOperation
     89   @param[in]     DestinationX  - The X coordinate of the destination for BltOperation
     90   @param[in]     DestinationY  - The Y coordinate of the destination for BltOperation
     91   @param[in]     Width         - The width of a rectangle in the blt rectangle in pixels
     92   @param[in]     Height        - The height of a rectangle in the blt rectangle in pixels
     93   @param[in]     Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
     94                                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
     95                                  If a subrectangle of the BltBuffer is used, then Delta represents
     96                                  the number of bytes in a row of the BltBuffer.
     97 
     98   @retval  EFI_DEVICE_ERROR - A hardware error occured
     99   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    100   @retval  EFI_SUCCESS - Blt operation success
    101 
    102 **/
    103 EFI_STATUS
    104 InternalGopBltCommon (
    105   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
    106   IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
    107   IN  UINTN                                 SourceX,
    108   IN  UINTN                                 SourceY,
    109   IN  UINTN                                 DestinationX,
    110   IN  UINTN                                 DestinationY,
    111   IN  UINTN                                 Width,
    112   IN  UINTN                                 Height,
    113   IN  UINTN                                 Delta
    114   )
    115 {
    116   if (mGop == NULL) {
    117     return EFI_DEVICE_ERROR;
    118   }
    119 
    120   return mGop->Blt (
    121                  mGop,
    122                  BltBuffer,
    123                  BltOperation,
    124                  SourceX,
    125                  SourceY,
    126                  DestinationX,
    127                  DestinationY,
    128                  Width,
    129                  Height,
    130                  Delta
    131                  );
    132 }
    133 
    134 
    135 /**
    136   Performs a UEFI Graphics Output Protocol Blt operation.
    137 
    138   @param[in,out] BltBuffer     - The data to transfer to screen
    139   @param[in]     BltOperation  - The operation to perform
    140   @param[in]     SourceX       - The X coordinate of the source for BltOperation
    141   @param[in]     SourceY       - The Y coordinate of the source for BltOperation
    142   @param[in]     DestinationX  - The X coordinate of the destination for BltOperation
    143   @param[in]     DestinationY  - The Y coordinate of the destination for BltOperation
    144   @param[in]     Width         - The width of a rectangle in the blt rectangle in pixels
    145   @param[in]     Height        - The height of a rectangle in the blt rectangle in pixels
    146   @param[in]     Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
    147                                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
    148                                  If a subrectangle of the BltBuffer is used, then Delta represents
    149                                  the number of bytes in a row of the BltBuffer.
    150 
    151   @retval  EFI_DEVICE_ERROR - A hardware error occured
    152   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    153   @retval  EFI_SUCCESS - Blt operation success
    154 
    155 **/
    156 EFI_STATUS
    157 EFIAPI
    158 BltLibGopBlt (
    159   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
    160   IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
    161   IN  UINTN                                 SourceX,
    162   IN  UINTN                                 SourceY,
    163   IN  UINTN                                 DestinationX,
    164   IN  UINTN                                 DestinationY,
    165   IN  UINTN                                 Width,
    166   IN  UINTN                                 Height,
    167   IN  UINTN                                 Delta
    168   )
    169 {
    170   return InternalGopBltCommon (
    171            BltBuffer,
    172            BltOperation,
    173            SourceX,
    174            SourceY,
    175            DestinationX,
    176            DestinationY,
    177            Width,
    178            Height,
    179            Delta
    180            );
    181 }
    182 
    183 
    184 /**
    185   Performs a UEFI Graphics Output Protocol Blt Video Fill.
    186 
    187   @param[in]  Color         Color to fill the region with
    188   @param[in]  DestinationX  X location to start fill operation
    189   @param[in]  DestinationY  Y location to start fill operation
    190   @param[in]  Width         Width (in pixels) to fill
    191   @param[in]  Height        Height to fill
    192 
    193   @retval  EFI_DEVICE_ERROR - A hardware error occured
    194   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    195   @retval  EFI_SUCCESS - The sizes were returned
    196 
    197 **/
    198 EFI_STATUS
    199 EFIAPI
    200 BltLibVideoFill (
    201   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *Color,
    202   IN  UINTN                                 DestinationX,
    203   IN  UINTN                                 DestinationY,
    204   IN  UINTN                                 Width,
    205   IN  UINTN                                 Height
    206   )
    207 {
    208   return InternalGopBltCommon (
    209            Color,
    210            EfiBltVideoFill,
    211            0,
    212            0,
    213            DestinationX,
    214            DestinationY,
    215            Width,
    216            Height,
    217            0
    218            );
    219 }
    220 
    221 
    222 /**
    223   Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation.
    224 
    225   @param[out] BltBuffer     Output buffer for pixel color data
    226   @param[in]  SourceX       X location within video
    227   @param[in]  SourceY       Y location within video
    228   @param[in]  Width         Width (in pixels)
    229   @param[in]  Height        Height
    230 
    231   @retval  EFI_DEVICE_ERROR - A hardware error occured
    232   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    233   @retval  EFI_SUCCESS - The sizes were returned
    234 
    235 **/
    236 EFI_STATUS
    237 EFIAPI
    238 BltLibVideoToBltBuffer (
    239   OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
    240   IN  UINTN                                 SourceX,
    241   IN  UINTN                                 SourceY,
    242   IN  UINTN                                 Width,
    243   IN  UINTN                                 Height
    244   )
    245 {
    246   return InternalGopBltCommon (
    247            BltBuffer,
    248            EfiBltVideoToBltBuffer,
    249            SourceX,
    250            SourceY,
    251            0,
    252            0,
    253            Width,
    254            Height,
    255            0
    256            );
    257 }
    258 
    259 
    260 /**
    261   Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
    262   with extended parameters.
    263 
    264   @param[out] BltBuffer     Output buffer for pixel color data
    265   @param[in]  SourceX       X location within video
    266   @param[in]  SourceY       Y location within video
    267   @param[in]  DestinationX  X location within BltBuffer
    268   @param[in]  DestinationY  Y location within BltBuffer
    269   @param[in]  Width         Width (in pixels)
    270   @param[in]  Height        Height
    271   @param[in]  Delta         Number of bytes in a row of BltBuffer
    272 
    273   @retval  EFI_DEVICE_ERROR - A hardware error occured
    274   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    275   @retval  EFI_SUCCESS - The sizes were returned
    276 
    277 **/
    278 EFI_STATUS
    279 EFIAPI
    280 BltLibVideoToBltBufferEx (
    281   OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
    282   IN  UINTN                                 SourceX,
    283   IN  UINTN                                 SourceY,
    284   IN  UINTN                                 DestinationX,
    285   IN  UINTN                                 DestinationY,
    286   IN  UINTN                                 Width,
    287   IN  UINTN                                 Height,
    288   IN  UINTN                                 Delta
    289   )
    290 {
    291   return InternalGopBltCommon (
    292            BltBuffer,
    293            EfiBltVideoToBltBuffer,
    294            SourceX,
    295            SourceY,
    296            DestinationX,
    297            DestinationY,
    298            Width,
    299            Height,
    300            Delta
    301            );
    302 }
    303 
    304 
    305 /**
    306   Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation.
    307 
    308   @param[in]  BltBuffer     Output buffer for pixel color data
    309   @param[in]  DestinationX  X location within video
    310   @param[in]  DestinationY  Y location within video
    311   @param[in]  Width         Width (in pixels)
    312   @param[in]  Height        Height
    313 
    314   @retval  EFI_DEVICE_ERROR - A hardware error occured
    315   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    316   @retval  EFI_SUCCESS - The sizes were returned
    317 
    318 **/
    319 EFI_STATUS
    320 EFIAPI
    321 BltLibBufferToVideo (
    322   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
    323   IN  UINTN                                 DestinationX,
    324   IN  UINTN                                 DestinationY,
    325   IN  UINTN                                 Width,
    326   IN  UINTN                                 Height
    327   )
    328 {
    329   return InternalGopBltCommon (
    330            BltBuffer,
    331            EfiBltBufferToVideo,
    332            0,
    333            0,
    334            DestinationX,
    335            DestinationY,
    336            Width,
    337            Height,
    338            0
    339            );
    340 }
    341 
    342 
    343 /**
    344   Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation
    345   with extended parameters.
    346 
    347   @param[in]  BltBuffer     Output buffer for pixel color data
    348   @param[in]  SourceX       X location within BltBuffer
    349   @param[in]  SourceY       Y location within BltBuffer
    350   @param[in]  DestinationX  X location within video
    351   @param[in]  DestinationY  Y location within video
    352   @param[in]  Width         Width (in pixels)
    353   @param[in]  Height        Height
    354   @param[in]  Delta         Number of bytes in a row of BltBuffer
    355 
    356   @retval  EFI_DEVICE_ERROR - A hardware error occured
    357   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    358   @retval  EFI_SUCCESS - The sizes were returned
    359 
    360 **/
    361 EFI_STATUS
    362 EFIAPI
    363 BltLibBufferToVideoEx (
    364   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
    365   IN  UINTN                                 SourceX,
    366   IN  UINTN                                 SourceY,
    367   IN  UINTN                                 DestinationX,
    368   IN  UINTN                                 DestinationY,
    369   IN  UINTN                                 Width,
    370   IN  UINTN                                 Height,
    371   IN  UINTN                                 Delta
    372   )
    373 {
    374   return InternalGopBltCommon (
    375            BltBuffer,
    376            EfiBltBufferToVideo,
    377            SourceX,
    378            SourceY,
    379            DestinationX,
    380            DestinationY,
    381            Width,
    382            Height,
    383            Delta
    384            );
    385 }
    386 
    387 
    388 /**
    389   Performs a UEFI Graphics Output Protocol Blt Video to Video operation
    390 
    391   @param[in]  SourceX       X location within video
    392   @param[in]  SourceY       Y location within video
    393   @param[in]  DestinationX  X location within video
    394   @param[in]  DestinationY  Y location within video
    395   @param[in]  Width         Width (in pixels)
    396   @param[in]  Height        Height
    397 
    398   @retval  EFI_DEVICE_ERROR - A hardware error occured
    399   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    400   @retval  EFI_SUCCESS - The sizes were returned
    401 
    402 **/
    403 EFI_STATUS
    404 EFIAPI
    405 BltLibVideoToVideo (
    406   IN  UINTN                                 SourceX,
    407   IN  UINTN                                 SourceY,
    408   IN  UINTN                                 DestinationX,
    409   IN  UINTN                                 DestinationY,
    410   IN  UINTN                                 Width,
    411   IN  UINTN                                 Height
    412   )
    413 {
    414   return InternalGopBltCommon (
    415            NULL,
    416            EfiBltVideoToVideo,
    417            SourceX,
    418            SourceY,
    419            DestinationX,
    420            DestinationY,
    421            Width,
    422            Height,
    423            0
    424            );
    425 }
    426 
    427 /**
    428   Returns the sizes related to the video device
    429 
    430   @param[out]  Width   Width (in pixels)
    431   @param[out]  Height  Height (in pixels)
    432 
    433   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
    434   @retval  EFI_SUCCESS - The sizes were returned
    435 
    436 **/
    437 EFI_STATUS
    438 EFIAPI
    439 BltLibGetSizes (
    440   OUT UINTN                                 *Width,  OPTIONAL
    441   OUT UINTN                                 *Height  OPTIONAL
    442   )
    443 {
    444   ASSERT (mGop != NULL);
    445 
    446   if (Width != NULL) {
    447     *Width = mGop->Mode->Info->HorizontalResolution;
    448   }
    449   if (Height != NULL) {
    450     *Height = mGop->Mode->Info->VerticalResolution;
    451   }
    452 
    453   return EFI_SUCCESS;
    454 }
    455 
    456