Is this the same as OptionRomPkg/Library/FrameBufferBltLib ?

Thanks
Michael

On Thu, Jun 30, 2016 at 1:23 PM, Laszlo Ersek <[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]>
> > Cc: Feng Tian <[email protected]>
> > Cc: Justen Jordan <[email protected]>
> > Cc: Laszlo Ersek <[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]>
>
> (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]
> 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