On 06/30/16 15:40, Michael Zimmermann wrote:
> Is this the same as OptionRomPkg/Library/FrameBufferBltLib ?

AIUI, it has the same purpose, but it has improvements. For example, the
API for the OptionRomPkg library forces all conforming library
implementations to keep their configration in internal, static data.
This limits the number of parallel configurations (per client module) to
one. The new library moves the configuration into client storage, and
makes it an explicit part of each API, so several configs can coexist
within the same client module.

Thanks
Laszlo

> On Thu, Jun 30, 2016 at 1:23 PM, Laszlo Ersek <[email protected]
> <mailto:[email protected]>> wrote:
> 
>     On 06/30/16 07:09, Ruiyu Ni wrote:
>     > This library provides interfaces to perform UEFI Graphics
>     > Output Protocol Video BLT operations.
>     >
>     > Contributed-under: TianoCore Contribution Agreement 1.0
>     > Signed-off-by: Ruiyu Ni <[email protected] <mailto:[email protected]>>
>     > Cc: Feng Tian <[email protected] <mailto:[email protected]>>
>     > Cc: Justen Jordan <[email protected] 
> <mailto:[email protected]>>
>     > Cc: Laszlo Ersek <[email protected] <mailto:[email protected]>>
>     > ---
>     >  MdeModulePkg/Include/Library/FrameBufferBltLib.h   |  94 +++
>     >  .../Library/FrameBufferBltLib/FrameBufferBltLib.c  | 704 
> +++++++++++++++++++++
>     >  .../FrameBufferBltLib/FrameBufferBltLib.inf        |  34 +
>     >  MdeModulePkg/MdeModulePkg.dec                      |   4 +
>     >  MdeModulePkg/MdeModulePkg.dsc                      |   1 +
>     >  5 files changed, 837 insertions(+)
>     >  create mode 100644 MdeModulePkg/Include/Library/FrameBufferBltLib.h
>     >  create mode 100644 
> MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.c
>     >  create mode 100644 
> MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
> 
>     In
>     <http://thread.gmane.org/gmane.comp.bios.edk2.devel/13809/focus=13835> I
>     made some comments; from them, the following seem to affect this patch:
> 
>     (1) use FRAMEBUFFER_CONFIGURE* rather than VOID*
>     (3) FrameBufferBltLib.inf should get a new FILE_GUID
>     (6) the git history should remain bisectable
> 
>     All of these have been addressed in this patch, so:
> 
>     Acked-by: Laszlo Ersek <[email protected] <mailto:[email protected]>>
> 
>     (for this patch).
> 
>     Jordan requests that this patch be split in two: lib class header and
>     lib instance (implementation). I agree that's a good idea: when you do
>     it, please add my Acked-by to both of the resultant patches.
> 
>     Jordan also requests that you re-add the OvmfPkg patch. In the message
>     linked above, I commented on that patch as well -- please consider those
>     comments. I would like to see your new version of that patch before
>     giving my R-b for it.
> 
>     Thanks!
>     Laszlo
> 
>     > diff --git a/MdeModulePkg/Include/Library/FrameBufferBltLib.h
>     b/MdeModulePkg/Include/Library/FrameBufferBltLib.h
>     > new file mode 100644
>     > index 0000000..c92eb94
>     > --- /dev/null
>     > +++ b/MdeModulePkg/Include/Library/FrameBufferBltLib.h
>     > @@ -0,0 +1,94 @@
>     > +/** @file
>     > +  Library for performing UEFI GOP Blt operations on a framebuffer
>     > +
>     > +  Copyright (c) 2009 - 2016, Intel Corporation. All rights
>     reserved.<BR>
>     > +
>     > +  This program and the accompanying materials are licensed and
>     made available
>     > +  under the terms and conditions of the BSD License which
>     accompanies this
>     > +  distribution. The full text of the license may be found at
>     > +  http://opensource.org/licenses/bsd-license.php
>     > +
>     > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>     BASIS,
>     > +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>     EXPRESS OR
>     > +  IMPLIED.
>     > +
>     > +**/
>     > +
>     > +#ifndef __FRAMEBUFFER_BLT_LIB__
>     > +#define __FRAMEBUFFER_BLT_LIB__
>     > +
>     > +#include <Protocol/GraphicsOutput.h>
>     > +
>     > +//
>     > +// Opaque structure for the frame buffer configure.
>     > +//
>     > +typedef struct FRAME_BUFFER_CONFIGURE FRAME_BUFFER_CONFIGURE;
>     > +
>     > +/**
>     > +  Create the configuration for a video frame buffer.
>     > +
>     > +  The configuration is returned in the caller provided buffer.
>     > +
>     > +  @param[in] FrameBuffer       Pointer to the start of the frame
>     buffer.
>     > +  @param[in] FrameBufferInfo   Describes the frame buffer
>     characteristics.
>     > +  @param[in,out] Configure     The created configuration information.
>     > +  @param[in,out] ConfigureSize Size of the configuration information.
>     > +
>     > +  @retval RETURN_SUCCESS            The configuration was
>     successful created.
>     > +  @retval RETURN_BUFFER_TOO_SMALL   The Configure is to too
>     small. The required
>     > +                                    size is returned in
>     ConfigureSize.
>     > +  @retval RETURN_UNSUPPORTED        The requested mode is not
>     supported by
>     > +                                    this implementaion.
>     > +**/
>     > +RETURN_STATUS
>     > +EFIAPI
>     > +FrameBufferBltConfigure (
>     > +  IN      VOID                                  *FrameBuffer,
>     > +  IN      EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *FrameBufferInfo,
>     > +  IN OUT  FRAME_BUFFER_CONFIGURE                *Configure,
>     > +  IN OUT  UINTN                                 *ConfigureSize
>     > +  );
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt operation.
>     > +
>     > +  @param[in]     Configure    Pointer to a configuration which
>     was successfully
>     > +                              created by FrameBufferBltConfigure ().
>     > +  @param[in,out] BltBuffer    The data to transfer to screen.
>     > +  @param[in]     BltOperation The operation to perform.
>     > +  @param[in]     SourceX      The X coordinate of the source for
>     BltOperation.
>     > +  @param[in]     SourceY      The Y coordinate of the source for
>     BltOperation.
>     > +  @param[in]     DestinationX The X coordinate of the destination for
>     > +                              BltOperation.
>     > +  @param[in]     DestinationY The Y coordinate of the destination for
>     > +                              BltOperation.
>     > +  @param[in]     Width        The width of a rectangle in the blt
>     rectangle
>     > +                              in pixels.
>     > +  @param[in]     Height       The height of a rectangle in the
>     blt rectangle
>     > +                              in pixels.
>     > +  @param[in]     Delta        Not used for EfiBltVideoFill and
>     > +                              EfiBltVideoToVideo operation. If a
>     Delta of 0
>     > +                              is used, the entire BltBuffer will
>     be operated
>     > +                              on. If a subrectangle of the
>     BltBuffer is
>     > +                              used, then Delta represents the
>     number of
>     > +                              bytes in a row of the BltBuffer.
>     > +
>     > +  @retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
>     > +  @retval RETURN_SUCCESS           The Blt operation was
>     performed successfully.
>     > +**/
>     > +RETURN_STATUS
>     > +EFIAPI
>     > +FrameBufferBlt (
>     > +  IN     FRAME_BUFFER_CONFIGURE             *Configure,
>     > +  IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL      *BltBuffer, OPTIONAL
>     > +  IN     EFI_GRAPHICS_OUTPUT_BLT_OPERATION  BltOperation,
>     > +  IN     UINTN                              SourceX,
>     > +  IN     UINTN                              SourceY,
>     > +  IN     UINTN                              DestinationX,
>     > +  IN     UINTN                              DestinationY,
>     > +  IN     UINTN                              Width,
>     > +  IN     UINTN                              Height,
>     > +  IN     UINTN                              Delta
>     > +  );
>     > +
>     > +#endif
>     > diff --git
>     a/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.c
>     b/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.c
>     > new file mode 100644
>     > index 0000000..c9bb206
>     > --- /dev/null
>     > +++ b/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.c
>     > @@ -0,0 +1,704 @@
>     > +/** @file
>     > +  FrameBufferBltLib - Library to perform blt operations on a
>     frame buffer.
>     > +
>     > +  Copyright (c) 2007 - 2016, Intel Corporation. All rights
>     reserved.<BR>
>     > +  This program and the accompanying materials
>     > +  are licensed and made available under the terms and conditions
>     of the BSD License
>     > +  which accompanies this distribution.  The full text of the
>     license may be found at
>     > +  http://opensource.org/licenses/bsd-license.php
>     > +
>     > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>     BASIS,
>     > +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>     EXPRESS OR IMPLIED.
>     > +
>     > +**/
>     > +
>     > +#include <Uefi/UefiBaseType.h>
>     > +#include <Protocol/GraphicsOutput.h>
>     > +
>     > +#include <Library/BaseLib.h>
>     > +#include <Library/BaseMemoryLib.h>
>     > +#include <Library/DebugLib.h>
>     > +#include <Library/FrameBufferBltLib.h>
>     > +
>     > +struct FRAME_BUFFER_CONFIGURE {
>     > +  UINTN                           ColorDepth;
>     > +  UINTN                           WidthInBytes;
>     > +  UINTN                           BytesPerPixel;
>     > +  UINTN                           WidthInPixels;
>     > +  UINTN                           Height;
>     > +  UINT8                           LineBuffer[SIZE_4KB * sizeof
>     (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)];
>     > +  UINT8                           *FrameBuffer;
>     > +  EFI_GRAPHICS_PIXEL_FORMAT       PixelFormat;
>     > +  EFI_PIXEL_BITMASK               PixelMasks;
>     > +  INTN                            PixelShl[4]; // R-G-B-Rsvd
>     > +  INTN                            PixelShr[4]; // R-G-B-Rsvd
>     > +};
>     > +
>     > +CONST EFI_PIXEL_BITMASK mRgbPixelMasks = {
>     > +  0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000
>     > +};
>     > +
>     > +CONST EFI_PIXEL_BITMASK mBgrPixelMasks = {
>     > +  0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000
>     > +};
>     > +
>     > +/**
>     > +  Initialize the bit mask in frame buffer configure.
>     > +
>     > +  @param Configure  The frame buffer configure.
>     > +  @param BitMask    The bit mask of pixel.
>     > +**/
>     > +VOID
>     > +ConfigurePixelBitMaskFormat (
>     > +  IN FRAME_BUFFER_CONFIGURE     *Configure,
>     > +  IN CONST EFI_PIXEL_BITMASK    *BitMask
>     > +  )
>     > +{
>     > +  UINTN   Loop;
>     > +  UINT32  *Masks;
>     > +  UINT32  MergedMasks;
>     > +
>     > +  MergedMasks = 0;
>     > +  Masks = (UINT32*) BitMask;
>     > +  for (Loop = 0; Loop < 3; Loop++) {
>     > +    ASSERT ((Loop == 3) || (Masks[Loop] != 0));
>     > +    ASSERT ((MergedMasks & Masks[Loop]) == 0);
>     > +    Configure->PixelShl[Loop] = HighBitSet32 (Masks[Loop]) - 23 +
>     (Loop * 8);
>     > +    if (Configure->PixelShl[Loop] < 0) {
>     > +      Configure->PixelShr[Loop] = -Configure->PixelShl[Loop];
>     > +      Configure->PixelShl[Loop] = 0;
>     > +    } else {
>     > +      Configure->PixelShr[Loop] = 0;
>     > +    }
>     > +    MergedMasks = (UINT32) (MergedMasks | Masks[Loop]);
>     > +    DEBUG ((EFI_D_VERBOSE, "%d: shl:%d shr:%d mask:%x\n", Loop,
>     > +            Configure->PixelShl[Loop], Configure->PixelShr[Loop],
>     Masks[Loop]));
>     > +  }
>     > +  MergedMasks = (UINT32) (MergedMasks | Masks[3]);
>     > +
>     > +  ASSERT (MergedMasks != 0);
>     > +  Configure->BytesPerPixel = (UINTN) ((HighBitSet32 (MergedMasks)
>     + 7) / 8);
>     > +
>     > +  DEBUG ((EFI_D_VERBOSE, "Bytes per pixel: %d\n",
>     Configure->BytesPerPixel));
>     > +
>     > +  CopyMem (&Configure->PixelMasks, BitMask, sizeof (*BitMask));
>     > +}
>     > +
>     > +/**
>     > +  Create the configuration for a video frame buffer.
>     > +
>     > +  The configuration is returned in the caller provided buffer.
>     > +
>     > +  @param[in] FrameBuffer       Pointer to the start of the frame
>     buffer.
>     > +  @param[in] FrameBufferInfo   Describes the frame buffer
>     characteristics.
>     > +  @param[in,out] Configure     The created configuration information.
>     > +  @param[in,out] ConfigureSize Size of the configuration information.
>     > +
>     > +  @retval RETURN_SUCCESS            The configuration was
>     successful created.
>     > +  @retval RETURN_BUFFER_TOO_SMALL   The Configure is to too
>     small. The required
>     > +                                    size is returned in
>     ConfigureSize.
>     > +  @retval RETURN_UNSUPPORTED        The requested mode is not
>     supported by
>     > +                                    this implementaion.
>     > +
>     > +**/
>     > +RETURN_STATUS
>     > +EFIAPI
>     > +FrameBufferBltConfigure (
>     > +  IN     VOID                                  *FrameBuffer,
>     > +  IN     EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *FrameBufferInfo,
>     > +  IN OUT FRAME_BUFFER_CONFIGURE                *Configure,
>     > +  IN OUT UINTN                                 *ConfigureSize
>     > +  )
>     > +{
>     > +  if (ConfigureSize == NULL) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (*ConfigureSize < sizeof (FRAME_BUFFER_CONFIGURE)) {
>     > +    *ConfigureSize = sizeof (FRAME_BUFFER_CONFIGURE);
>     > +    return RETURN_BUFFER_TOO_SMALL;
>     > +  }
>     > +
>     > +  if (Configure == NULL) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  switch (FrameBufferInfo->PixelFormat) {
>     > +  case PixelRedGreenBlueReserved8BitPerColor:
>     > +    ConfigurePixelBitMaskFormat (Configure, &mRgbPixelMasks);
>     > +    break;
>     > +
>     > +  case PixelBlueGreenRedReserved8BitPerColor:
>     > +    ConfigurePixelBitMaskFormat (Configure, &mBgrPixelMasks);
>     > +    break;
>     > +
>     > +  case PixelBitMask:
>     > +    ConfigurePixelBitMaskFormat (Configure,
>     &(FrameBufferInfo->PixelInformation));
>     > +    break;
>     > +
>     > +  case PixelBltOnly:
>     > +    ASSERT (FrameBufferInfo->PixelFormat != PixelBltOnly);
>     > +    return RETURN_UNSUPPORTED;
>     > +
>     > +  default:
>     > +    ASSERT (FALSE);
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  Configure->PixelFormat   = FrameBufferInfo->PixelFormat;
>     > +  Configure->FrameBuffer   = (UINT8*) FrameBuffer;
>     > +  Configure->WidthInPixels = (UINTN)
>     FrameBufferInfo->HorizontalResolution;
>     > +  Configure->Height        = (UINTN)
>     FrameBufferInfo->VerticalResolution;
>     > +  Configure->WidthInBytes  = Configure->WidthInPixels *
>     Configure->BytesPerPixel;
>     > +
>     > +  ASSERT (Configure->WidthInBytes < sizeof (Configure->LineBuffer));
>     > +
>     > +  return RETURN_SUCCESS;
>     > +}
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt Video Fill.
>     > +
>     > +  @param[in]  Configure     Pointer to a configuration which was
>     successfully
>     > +                            created by FrameBufferBltConfigure ().
>     > +  @param[in]  Color         Color to fill the region with.
>     > +  @param[in]  DestinationX  X location to start fill operation.
>     > +  @param[in]  DestinationY  Y location to start fill operation.
>     > +  @param[in]  Width         Width (in pixels) to fill.
>     > +  @param[in]  Height        Height to fill.
>     > +
>     > +  @retval  RETURN_INVALID_PARAMETER Invalid parameter was passed in.
>     > +  @retval  RETURN_SUCCESS           The video was filled
>     successfully.
>     > +
>     > +**/
>     > +EFI_STATUS
>     > +FrameBufferBltLibVideoFill (
>     > +  IN  FRAME_BUFFER_CONFIGURE        *Configure,
>     > +  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color,
>     > +  IN  UINTN                         DestinationX,
>     > +  IN  UINTN                         DestinationY,
>     > +  IN  UINTN                         Width,
>     > +  IN  UINTN                         Height
>     > +  )
>     > +{
>     > +  UINTN                             IndexX;
>     > +  UINTN                             IndexY;
>     > +  UINT8                             *Destination;
>     > +  UINT8                             Uint8;
>     > +  UINT32                            Uint32;
>     > +  UINT64                            WideFill;
>     > +  BOOLEAN                           UseWideFill;
>     > +  BOOLEAN                           LineBufferReady;
>     > +  UINTN                             Offset;
>     > +  UINTN                             WidthInBytes;
>     > +  UINTN                             SizeInBytes;
>     > +
>     > +  //
>     > +  // BltBuffer to Video: Source is BltBuffer, destination is Video
>     > +  //
>     > +  if (DestinationY + Height > Configure->Height) {
>     > +    DEBUG ((EFI_D_VERBOSE, "VideoFill: Past screen (Y)\n"));
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (DestinationX + Width > Configure->WidthInPixels) {
>     > +    DEBUG ((EFI_D_VERBOSE, "VideoFill: Past screen (X)\n"));
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (Width == 0 || Height == 0) {
>     > +    DEBUG ((EFI_D_VERBOSE, "VideoFill: Width or Height is 0\n"));
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  WidthInBytes = Width * Configure->BytesPerPixel;
>     > +
>     > +  Uint32 = *(UINT32*) Color;
>     > +  WideFill =
>     > +    (UINT32) (
>     > +    (((Uint32 << Configure->PixelShl[0]) >> Configure->PixelShr[0]) &
>     > +     Configure->PixelMasks.RedMask) |
>     > +     (((Uint32 << Configure->PixelShl[1]) >>
>     Configure->PixelShr[1]) &
>     > +      Configure->PixelMasks.GreenMask) |
>     > +      (((Uint32 << Configure->PixelShl[2]) >>
>     Configure->PixelShr[2]) &
>     > +       Configure->PixelMasks.BlueMask)
>     > +      );
>     > +  DEBUG ((EFI_D_VERBOSE, "VideoFill: color=0x%x, wide-fill=0x%x\n",
>     > +          Uint32, WideFill));
>     > +
>     > +  //
>     > +  // If the size of the pixel data evenly divides the sizeof
>     > +  // WideFill, then a wide fill operation can be used
>     > +  //
>     > +  UseWideFill = TRUE;
>     > +  if ((sizeof (WideFill) % Configure->BytesPerPixel) == 0) {
>     > +    for (IndexX = Configure->BytesPerPixel; IndexX < sizeof
>     (WideFill); IndexX++) {
>     > +      ((UINT8*) &WideFill)[IndexX] = ((UINT8*) &WideFill)[IndexX
>     % Configure->BytesPerPixel];
>     > +    }
>     > +  } else {
>     > +    //
>     > +    // If all the bytes in the pixel are the same value, then use
>     > +    // a wide fill operation.
>     > +    //
>     > +    for (
>     > +      IndexX = 1, Uint8 = ((UINT8*) &WideFill)[0];
>     > +      IndexX < Configure->BytesPerPixel;
>     > +      IndexX++) {
>     > +      if (Uint8 != ((UINT8*) &WideFill)[IndexX]) {
>     > +        UseWideFill = FALSE;
>     > +        break;
>     > +      }
>     > +    }
>     > +    if (UseWideFill) {
>     > +      SetMem (&WideFill, sizeof (WideFill), Uint8);
>     > +    }
>     > +  }
>     > +
>     > +  if (UseWideFill && (DestinationX == 0) && (Width ==
>     Configure->WidthInPixels)) {
>     > +    DEBUG ((EFI_D_VERBOSE, "VideoFill (wide, one-shot)\n"));
>     > +    Offset = DestinationY * Configure->WidthInPixels;
>     > +    Offset = Configure->BytesPerPixel * Offset;
>     > +    Destination = Configure->FrameBuffer + Offset;
>     > +    SizeInBytes = WidthInBytes * Height;
>     > +    if (SizeInBytes >= 8) {
>     > +      SetMem32 (Destination, SizeInBytes & ~3, (UINT32) WideFill);
>     > +      SizeInBytes &= 3;
>     > +    }
>     > +    if (SizeInBytes > 0) {
>     > +      SetMem (Destination, SizeInBytes, (UINT8) (UINTN) WideFill);
>     > +    }
>     > +  } else {
>     > +    LineBufferReady = FALSE;
>     > +    for (IndexY = DestinationY; IndexY < (Height + DestinationY);
>     IndexY++) {
>     > +      Offset = (IndexY * Configure->WidthInPixels) + DestinationX;
>     > +      Offset = Configure->BytesPerPixel * Offset;
>     > +      Destination = Configure->FrameBuffer + Offset;
>     > +
>     > +      if (UseWideFill && (((UINTN) Destination & 7) == 0)) {
>     > +        DEBUG ((EFI_D_VERBOSE, "VideoFill (wide)\n"));
>     > +        SizeInBytes = WidthInBytes;
>     > +        if (SizeInBytes >= 8) {
>     > +          SetMem64 (Destination, SizeInBytes & ~7, WideFill);
>     > +          SizeInBytes &= 7;
>     > +        }
>     > +        if (SizeInBytes > 0) {
>     > +          CopyMem (Destination, &WideFill, SizeInBytes);
>     > +        }
>     > +      } else {
>     > +        DEBUG ((EFI_D_VERBOSE, "VideoFill (not wide)\n"));
>     > +        if (!LineBufferReady) {
>     > +          CopyMem (Configure->LineBuffer, &WideFill,
>     Configure->BytesPerPixel);
>     > +          for (IndexX = 1; IndexX < Width; ) {
>     > +            CopyMem (
>     > +              (Configure->LineBuffer + (IndexX *
>     Configure->BytesPerPixel)),
>     > +              Configure->LineBuffer,
>     > +              MIN (IndexX, Width - IndexX) * Configure->BytesPerPixel
>     > +            );
>     > +            IndexX += MIN (IndexX, Width - IndexX);
>     > +          }
>     > +          LineBufferReady = TRUE;
>     > +        }
>     > +        CopyMem (Destination, Configure->LineBuffer, WidthInBytes);
>     > +      }
>     > +    }
>     > +  }
>     > +
>     > +  return RETURN_SUCCESS;
>     > +}
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt Video to Buffer
>     operation
>     > +  with extended parameters.
>     > +
>     > +  @param[in]  Configure     Pointer to a configuration which was
>     successfully
>     > +                            created by FrameBufferBltConfigure ().
>     > +  @param[out] BltBuffer     Output buffer for pixel color data.
>     > +  @param[in]  SourceX       X location within video.
>     > +  @param[in]  SourceY       Y location within video.
>     > +  @param[in]  DestinationX  X location within BltBuffer.
>     > +  @param[in]  DestinationY  Y location within BltBuffer.
>     > +  @param[in]  Width         Width (in pixels).
>     > +  @param[in]  Height        Height.
>     > +  @param[in]  Delta         Number of bytes in a row of BltBuffer.
>     > +
>     > +  @retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
>     > +  @retval RETURN_SUCCESS           The Blt operation was
>     performed successfully.
>     > +**/
>     > +RETURN_STATUS
>     > +FrameBufferBltLibVideoToBltBuffer (
>     > +  IN     FRAME_BUFFER_CONFIGURE          *Configure,
>     > +     OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL   *BltBuffer,
>     > +  IN     UINTN                           SourceX,
>     > +  IN     UINTN                           SourceY,
>     > +  IN     UINTN                           DestinationX,
>     > +  IN     UINTN                           DestinationY,
>     > +  IN     UINTN                           Width,
>     > +  IN     UINTN                           Height,
>     > +  IN     UINTN                           Delta
>     > +  )
>     > +{
>     > +  UINTN                                  DstY;
>     > +  UINTN                                  SrcY;
>     > +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL          *Blt;
>     > +  UINT8                                  *Source;
>     > +  UINT8                                  *Destination;
>     > +  UINTN                                  IndexX;
>     > +  UINT32                                 Uint32;
>     > +  UINTN                                  Offset;
>     > +  UINTN                                  WidthInBytes;
>     > +
>     > +  //
>     > +  // Video to BltBuffer: Source is Video, destination is BltBuffer
>     > +  //
>     > +  if (SourceY + Height > Configure->Height) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (SourceX + Width > Configure->WidthInPixels) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (Width == 0 || Height == 0) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  //
>     > +  // If Delta is zero, then the entire BltBuffer is being used,
>     so Delta is
>     > +  // the number of bytes in each row of BltBuffer. Since
>     BltBuffer is Width
>     > +  // pixels size, the number of bytes in each row can be computed.
>     > +  //
>     > +  if (Delta == 0) {
>     > +    Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
>     > +  }
>     > +
>     > +  WidthInBytes = Width * Configure->BytesPerPixel;
>     > +
>     > +  //
>     > +  // Video to BltBuffer: Source is Video, destination is BltBuffer
>     > +  //
>     > +  for (SrcY = SourceY, DstY = DestinationY;
>     > +       DstY < (Height + DestinationY);
>     > +       SrcY++, DstY++) {
>     > +
>     > +    Offset = (SrcY * Configure->WidthInPixels) + SourceX;
>     > +    Offset = Configure->BytesPerPixel * Offset;
>     > +    Source = Configure->FrameBuffer + Offset;
>     > +
>     > +    if (Configure->PixelFormat ==
>     PixelBlueGreenRedReserved8BitPerColor) {
>     > +      Destination = (UINT8 *) BltBuffer + (DstY * Delta) +
>     (DestinationX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
>     > +    } else {
>     > +      Destination = Configure->LineBuffer;
>     > +    }
>     > +
>     > +    CopyMem (Destination, Source, WidthInBytes);
>     > +
>     > +    if (Configure->PixelFormat !=
>     PixelBlueGreenRedReserved8BitPerColor) {
>     > +      for (IndexX = 0; IndexX < Width; IndexX++) {
>     > +        Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)
>     > +          ((UINT8 *) BltBuffer + (DstY * Delta) +
>     > +          (DestinationX + IndexX) * sizeof
>     (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
>     > +        Uint32 = *(UINT32*) (Configure->LineBuffer + (IndexX *
>     Configure->BytesPerPixel));
>     > +        *(UINT32*) Blt =
>     > +          (UINT32) (
>     > +          (((Uint32 & Configure->PixelMasks.RedMask) >>
>     > +            Configure->PixelShl[0]) << Configure->PixelShr[0]) |
>     > +            (((Uint32 & Configure->PixelMasks.GreenMask) >>
>     > +              Configure->PixelShl[1]) << Configure->PixelShr[1]) |
>     > +              (((Uint32 & Configure->PixelMasks.BlueMask) >>
>     > +                Configure->PixelShl[2]) << Configure->PixelShr[2])
>     > +            );
>     > +      }
>     > +    }
>     > +  }
>     > +
>     > +  return RETURN_SUCCESS;
>     > +}
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt Buffer to Video
>     operation
>     > +  with extended parameters.
>     > +
>     > +  @param[in]  Configure     Pointer to a configuration which was
>     successfully
>     > +                            created by FrameBufferBltConfigure ().
>     > +  @param[in]  BltBuffer     Output buffer for pixel color data.
>     > +  @param[in]  SourceX       X location within BltBuffer.
>     > +  @param[in]  SourceY       Y location within BltBuffer.
>     > +  @param[in]  DestinationX  X location within video.
>     > +  @param[in]  DestinationY  Y location within video.
>     > +  @param[in]  Width         Width (in pixels).
>     > +  @param[in]  Height        Height.
>     > +  @param[in]  Delta         Number of bytes in a row of BltBuffer.
>     > +
>     > +  @retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
>     > +  @retval RETURN_SUCCESS           The Blt operation was
>     performed successfully.
>     > +**/
>     > +RETURN_STATUS
>     > +FrameBufferBltLibBufferToVideo (
>     > +  IN  FRAME_BUFFER_CONFIGURE                *Configure,
>     > +  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
>     > +  IN  UINTN                                 SourceX,
>     > +  IN  UINTN                                 SourceY,
>     > +  IN  UINTN                                 DestinationX,
>     > +  IN  UINTN                                 DestinationY,
>     > +  IN  UINTN                                 Width,
>     > +  IN  UINTN                                 Height,
>     > +  IN  UINTN                                 Delta
>     > +  )
>     > +{
>     > +  UINTN                                    DstY;
>     > +  UINTN                                    SrcY;
>     > +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL            *Blt;
>     > +  UINT8                                    *Source;
>     > +  UINT8                                    *Destination;
>     > +  UINTN                                    IndexX;
>     > +  UINT32                                   Uint32;
>     > +  UINTN                                    Offset;
>     > +  UINTN                                    WidthInBytes;
>     > +
>     > +  //
>     > +  // BltBuffer to Video: Source is BltBuffer, destination is Video
>     > +  //
>     > +  if (DestinationY + Height > Configure->Height) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (DestinationX + Width > Configure->WidthInPixels) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (Width == 0 || Height == 0) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  //
>     > +  // If Delta is zero, then the entire BltBuffer is being used,
>     so Delta is
>     > +  // the number of bytes in each row of BltBuffer. Since
>     BltBuffer is Width
>     > +  // pixels size, the number of bytes in each row can be computed.
>     > +  //
>     > +  if (Delta == 0) {
>     > +    Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
>     > +  }
>     > +
>     > +  WidthInBytes = Width * Configure->BytesPerPixel;
>     > +
>     > +  for (SrcY = SourceY, DstY = DestinationY;
>     > +       SrcY < (Height + SourceY);
>     > +       SrcY++, DstY++) {
>     > +
>     > +    Offset = (DstY * Configure->WidthInPixels) + DestinationX;
>     > +    Offset = Configure->BytesPerPixel * Offset;
>     > +    Destination = Configure->FrameBuffer + Offset;
>     > +
>     > +    if (Configure->PixelFormat ==
>     PixelBlueGreenRedReserved8BitPerColor) {
>     > +      Source = (UINT8 *) BltBuffer + (SrcY * Delta);
>     > +    } else {
>     > +      for (IndexX = 0; IndexX < Width; IndexX++) {
>     > +        Blt =
>     > +          (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) (
>     > +              (UINT8 *) BltBuffer +
>     > +              (SrcY * Delta) +
>     > +              ((SourceX + IndexX) * sizeof
>     (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
>     > +            );
>     > +        Uint32 = *(UINT32*) Blt;
>     > +        *(UINT32*) (Configure->LineBuffer + (IndexX *
>     Configure->BytesPerPixel)) =
>     > +          (UINT32) (
>     > +              (((Uint32 << Configure->PixelShl[0]) >>
>     Configure->PixelShr[0]) &
>     > +               Configure->PixelMasks.RedMask) |
>     > +              (((Uint32 << Configure->PixelShl[1]) >>
>     Configure->PixelShr[1]) &
>     > +               Configure->PixelMasks.GreenMask) |
>     > +              (((Uint32 << Configure->PixelShl[2]) >>
>     Configure->PixelShr[2]) &
>     > +               Configure->PixelMasks.BlueMask)
>     > +            );
>     > +      }
>     > +      Source = Configure->LineBuffer;
>     > +    }
>     > +
>     > +    CopyMem (Destination, Source, WidthInBytes);
>     > +  }
>     > +
>     > +  return RETURN_SUCCESS;
>     > +}
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt Video to Video
>     operation
>     > +
>     > +  @param[in]  Configure     Pointer to a configuration which was
>     successfully
>     > +                            created by FrameBufferBltConfigure ().
>     > +  @param[in]  SourceX       X location within video.
>     > +  @param[in]  SourceY       Y location within video.
>     > +  @param[in]  DestinationX  X location within video.
>     > +  @param[in]  DestinationY  Y location within video.
>     > +  @param[in]  Width         Width (in pixels).
>     > +  @param[in]  Height        Height.
>     > +
>     > +  @retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
>     > +  @retval RETURN_SUCCESS           The Blt operation was
>     performed successfully.
>     > +**/
>     > +RETURN_STATUS
>     > +FrameBufferBltLibVideoToVideo (
>     > +  IN  FRAME_BUFFER_CONFIGURE                *Configure,
>     > +  IN  UINTN                                 SourceX,
>     > +  IN  UINTN                                 SourceY,
>     > +  IN  UINTN                                 DestinationX,
>     > +  IN  UINTN                                 DestinationY,
>     > +  IN  UINTN                                 Width,
>     > +  IN  UINTN                                 Height
>     > +  )
>     > +{
>     > +  UINT8                                     *Source;
>     > +  UINT8                                     *Destination;
>     > +  UINTN                                     Offset;
>     > +  UINTN                                     WidthInBytes;
>     > +  INTN                                      LineStride;
>     > +
>     > +  //
>     > +  // Video to Video: Source is Video, destination is Video
>     > +  //
>     > +  if (SourceY + Height > Configure->Height) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (SourceX + Width > Configure->WidthInPixels) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (DestinationY + Height > Configure->Height) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (DestinationX + Width > Configure->WidthInPixels) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  if (Width == 0 || Height == 0) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  WidthInBytes = Width * Configure->BytesPerPixel;
>     > +
>     > +  Offset = (SourceY * Configure->WidthInPixels) + SourceX;
>     > +  Offset = Configure->BytesPerPixel * Offset;
>     > +  Source = Configure->FrameBuffer + Offset;
>     > +
>     > +  Offset = (DestinationY * Configure->WidthInPixels) + DestinationX;
>     > +  Offset = Configure->BytesPerPixel * Offset;
>     > +  Destination = Configure->FrameBuffer + Offset;
>     > +
>     > +  LineStride = Configure->WidthInBytes;
>     > +  if (Destination > Source) {
>     > +    //
>     > +    // Copy from last line to avoid source is corrupted by copying
>     > +    //
>     > +    Source += Height * LineStride;
>     > +    Destination += Height * LineStride;
>     > +    LineStride = -LineStride;
>     > +  }
>     > +
>     > +  while (Height-- > 0) {
>     > +    CopyMem (Destination, Source, WidthInBytes);
>     > +
>     > +    Source += LineStride;
>     > +    Destination += LineStride;
>     > +  }
>     > +
>     > +  return RETURN_SUCCESS;
>     > +}
>     > +
>     > +/**
>     > +  Performs a UEFI Graphics Output Protocol Blt operation.
>     > +
>     > +  @param[in]     Configure    Pointer to a configuration which
>     was successfully
>     > +                              created by FrameBufferBltConfigure ().
>     > +  @param[in,out] BltBuffer    The data to transfer to screen.
>     > +  @param[in]     BltOperation The operation to perform.
>     > +  @param[in]     SourceX      The X coordinate of the source for
>     BltOperation.
>     > +  @param[in]     SourceY      The Y coordinate of the source for
>     BltOperation.
>     > +  @param[in]     DestinationX The X coordinate of the destination for
>     > +                              BltOperation.
>     > +  @param[in]     DestinationY The Y coordinate of the destination for
>     > +                              BltOperation.
>     > +  @param[in]     Width        The width of a rectangle in the blt
>     rectangle
>     > +                              in pixels.
>     > +  @param[in]     Height       The height of a rectangle in the
>     blt rectangle
>     > +                              in pixels.
>     > +  @param[in]     Delta        Not used for EfiBltVideoFill and
>     > +                              EfiBltVideoToVideo operation. If a
>     Delta of 0
>     > +                              is used, the entire BltBuffer will
>     be operated
>     > +                              on. If a subrectangle of the
>     BltBuffer is
>     > +                              used, then Delta represents the
>     number of
>     > +                              bytes in a row of the BltBuffer.
>     > +
>     > +  @retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
>     > +  @retval RETURN_SUCCESS           The Blt operation was
>     performed successfully.
>     > +**/
>     > +RETURN_STATUS
>     > +EFIAPI
>     > +FrameBufferBlt (
>     > +  IN     FRAME_BUFFER_CONFIGURE                *Configure,
>     > +  IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
>     > +  IN     EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
>     > +  IN     UINTN                                 SourceX,
>     > +  IN     UINTN                                 SourceY,
>     > +  IN     UINTN                                 DestinationX,
>     > +  IN     UINTN                                 DestinationY,
>     > +  IN     UINTN                                 Width,
>     > +  IN     UINTN                                 Height,
>     > +  IN     UINTN                                 Delta
>     > +  )
>     > +{
>     > +  if (Configure == NULL) {
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +
>     > +  switch (BltOperation) {
>     > +  case EfiBltVideoToBltBuffer:
>     > +    return FrameBufferBltLibVideoToBltBuffer (
>     > +             Configure,
>     > +             BltBuffer,
>     > +             SourceX,
>     > +             SourceY,
>     > +             DestinationX,
>     > +             DestinationY,
>     > +             Width,
>     > +             Height,
>     > +             Delta
>     > +             );
>     > +
>     > +  case EfiBltVideoToVideo:
>     > +    return FrameBufferBltLibVideoToVideo (
>     > +             Configure,
>     > +             SourceX,
>     > +             SourceY,
>     > +             DestinationX,
>     > +             DestinationY,
>     > +             Width,
>     > +             Height
>     > +             );
>     > +
>     > +  case EfiBltVideoFill:
>     > +    return FrameBufferBltLibVideoFill (
>     > +             Configure,
>     > +             BltBuffer,
>     > +             DestinationX,
>     > +             DestinationY,
>     > +             Width,
>     > +             Height
>     > +             );
>     > +
>     > +  case EfiBltBufferToVideo:
>     > +    return FrameBufferBltLibBufferToVideo (
>     > +             Configure,
>     > +             BltBuffer,
>     > +             SourceX,
>     > +             SourceY,
>     > +             DestinationX,
>     > +             DestinationY,
>     > +             Width,
>     > +             Height,
>     > +             Delta
>     > +             );
>     > +
>     > +  default:
>     > +    return RETURN_INVALID_PARAMETER;
>     > +  }
>     > +}
>     > diff --git
>     a/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
>     b/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
>     > new file mode 100644
>     > index 0000000..57e4adb
>     > --- /dev/null
>     > +++ b/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
>     > @@ -0,0 +1,34 @@
>     > +## @file
>     > +#  FrameBufferBltLib - Library to perform blt operations on a
>     frame buffer.
>     > +#
>     > +#  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>     reserved.<BR>
>     > +#
>     > +#  This program and the accompanying materials
>     > +#  are licensed and made available under the terms and conditions
>     of the BSD License
>     > +#  which accompanies this distribution. The full text of the
>     license may be found at
>     > +#  http://opensource.org/licenses/bsd-license.php
>     > +#
>     > +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>     BASIS,
>     > +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>     EXPRESS OR IMPLIED.
>     > +#
>     > +##
>     > +
>     > +[Defines]
>     > +  INF_VERSION                    = 0x00010005
>     > +  BASE_NAME                      = FrameBufferBltLib
>     > +  FILE_GUID                      =
>     243D3E8C-2780-4A25-9693-A410475BFCEC
>     > +  MODULE_TYPE                    = BASE
>     > +  VERSION_STRING                 = 1.0
>     > +  LIBRARY_CLASS                  = FrameBufferBltLib
>     > +
>     > +[Sources.common]
>     > +  FrameBufferBltLib.c
>     > +
>     > +[LibraryClasses]
>     > +  BaseLib
>     > +  BaseMemoryLib
>     > +  DebugLib
>     > +
>     > +[Packages]
>     > +  MdePkg/MdePkg.dec
>     > +  MdeModulePkg/MdeModulePkg.dec
>     > diff --git a/MdeModulePkg/MdeModulePkg.dec
>     b/MdeModulePkg/MdeModulePkg.dec
>     > index 27efb37..eb1ca0d 100644
>     > --- a/MdeModulePkg/MdeModulePkg.dec
>     > +++ b/MdeModulePkg/MdeModulePkg.dec
>     > @@ -153,6 +153,10 @@ [LibraryClasses]
>     >    #
>     >    PciHostBridgeLib|Include/Library/PciHostBridgeLib.h
>     >
>     > +  ##  @libraryclass  Provides an interface for performing UEFI
>     Graphics Output Protocol Video blt operations.
>     > +  ##
>     > +  FrameBufferBltLib|Include/Library/FrameBufferBltLib.h
>     > +
>     >  [Guids]
>     >    ## MdeModule package token space guid
>     >    # Include/Guid/MdeModulePkgTokenSpace.h
>     > diff --git a/MdeModulePkg/MdeModulePkg.dsc
>     b/MdeModulePkg/MdeModulePkg.dsc
>     > index abce62d..63e1f91 100644
>     > --- a/MdeModulePkg/MdeModulePkg.dsc
>     > +++ b/MdeModulePkg/MdeModulePkg.dsc
>     > @@ -306,6 +306,7 @@ [Components]
>     >   
>     MdeModulePkg/Library/DxeIpmiLibIpmiProtocol/DxeIpmiLibIpmiProtocol.inf
>     >    MdeModulePkg/Library/PeiIpmiLibIpmiPpi/PeiIpmiLibIpmiPpi.inf
>     >   
>     
> MdeModulePkg/Library/SmmIpmiLibSmmIpmiProtocol/SmmIpmiLibSmmIpmiProtocol.inf
>     > +  MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
>     >
>     >    MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
>     >    MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf
>     >
> 
>     _______________________________________________
>     edk2-devel mailing list
>     [email protected] <mailto:[email protected]>
>     https://lists.01.org/mailman/listinfo/edk2-devel
> 
> 

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to