Jordan, Sorry I missed your previous questions. Let me try to answer all your questions in this email. Q1: Why merging Ex and non-Ex APIs? Providing Non-Ex APIs was to make simpler functions available for blt operations. Merging the Ex and non-EX APIs is to avoid the library APIs provide overlapped functionalities. And it aligns to the interfaces defined in GOP protocol.
Q2: If removing BltConfigure, does that mean the library will have to check to see if the mode is different? what's the benefit? After removing BltConfigure(), the library will calculate the shift/mask every time when doing the BLT operations. The benefit is to make the library stateless so it doesn't contain any state information so it can be called from different threads/CPUs. For example strtok_r() is the stateless and reentrant version of strtok(). char *strtok(char *str, const char *delim); char *strtok_r(char *str, const char *delim, char **saveptr); Q3: What if we design a VideoModeSetLib? GraphicsOutputDxe + null_VideoModeSetLib + BltLib -> current GraphicsOutputDxe GraphicsOutputDxe + qemu_VideoModeSetLib + BltLib -> current QemuVideoDxe Null_VideoModeSetLib only allows the video in the fixed mode supplied from PEI HOB Qemu_VideoModeSetLib allows the video in several modes for QEMU. Is my understanding correct? Do you have more usage scenarios about the VideoModeSetLib? For now I only see two and only two, considering the design complexity introduced by VideoModeSetLib, leave the QemuVideoDxe driver as is make people easier to understand. Thanks, Ray -----Original Message----- From: Justen, Jordan L Sent: Tuesday, August 18, 2015 1:18 AM To: Ni, Ruiyu <ruiyu...@intel.com>; edk2-devel@lists.01.org Cc: Ni, Ruiyu <ruiyu...@intel.com>; Laszlo Ersek <ler...@redhat.com> Subject: Re: [Patch 6/8] OptionRomPkg/OvmfPkg: Remove BltLib::BltConfigure API On 2015-08-17 06:45:27, Ruiyu Ni wrote: > The BltConfigure() API caches the video frame buffer meta data which > forbids the library to be implemented to support re-entry. How does this help? GraphicsOutputDxe will set a mode, and then use BltLib with that mode. I already asked this, and I had some other questions: http://article.gmane.org/gmane.comp.bios.edk2.devel/1209 -Jordan > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ruiyu Ni <ruiyu...@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > Cc: Jordan Justen <jordan.l.jus...@intel.com> > --- > .../Application/BltLibSample/BltLibSample.c | 129 +++--- > OptionRomPkg/Include/Library/BltLib.h | 151 +++--- > .../Library/FrameBufferBltLib/FrameBufferBltLib.c | 514 > +++++++++++---------- > OptionRomPkg/Library/GopBltLib/GopBltLib.c | 289 ++++++------ > OvmfPkg/QemuVideoDxe/Gop.c | 13 +- > 5 files changed, 576 insertions(+), 520 deletions(-) > > diff --git a/OptionRomPkg/Application/BltLibSample/BltLibSample.c > b/OptionRomPkg/Application/BltLibSample/BltLibSample.c > index 333b054..3c7e392 100644 > --- a/OptionRomPkg/Application/BltLibSample/BltLibSample.c > +++ b/OptionRomPkg/Application/BltLibSample/BltLibSample.c > @@ -18,6 +18,7 @@ > #include <Library/UefiLib.h> > #include <Library/UefiApplicationEntryPoint.h> > #include <Library/UefiBootServicesTableLib.h> > +#include <Library/MemoryAllocationLib.h> > > > UINT64 > @@ -68,8 +69,8 @@ Rand32 ( > > VOID > TestFills ( > - UINT32 HorizontalResolution, > - UINT32 VerticalResolution > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > ) > { > EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; > @@ -79,44 +80,45 @@ TestFills ( > UINTN W; > UINTN H; > > - for (Loop = 0; Loop < 10000; Loop++) { > - W = HorizontalResolution - (Rand32 () % HorizontalResolution); > - H = VerticalResolution - (Rand32 () % VerticalResolution); > - if (W != HorizontalResolution) { > - X = Rand32 () % (HorizontalResolution - W); > + for (Loop = 0; Loop < 1000; Loop++) { > + W = FrameBufferInfo->HorizontalResolution - (Rand32 () % > FrameBufferInfo->HorizontalResolution); > + H = FrameBufferInfo->VerticalResolution - (Rand32 () % > FrameBufferInfo->VerticalResolution); > + if (W != FrameBufferInfo->HorizontalResolution) { > + X = Rand32 () % (FrameBufferInfo->HorizontalResolution - W); > } else { > X = 0; > } > - if (H != VerticalResolution) { > - Y = Rand32 () % (VerticalResolution - H); > + if (H != FrameBufferInfo->VerticalResolution) { > + Y = Rand32 () % (FrameBufferInfo->VerticalResolution - H); > } else { > Y = 0; > } > *(UINT32*) (&Color) = Rand32 () & 0xffffff; > - BltVideoFill (&Color, X, Y, W, H); > + BltVideoFill (FrameBuffer, FrameBufferInfo, &Color, X, Y, W, H); > } > } > > > VOID > TestColor1 ( > - UINT32 HorizontalResolution, > - UINT32 VerticalResolution > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > ) > { > - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; > + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer; > UINTN X; > UINTN Y; > > - *(UINT32*) (&Color) = 0; > + BltBuffer = AllocatePool (sizeof (*BltBuffer) * > FrameBufferInfo->HorizontalResolution); > + ASSERT (BltBuffer != NULL); > > - for (Y = 0; Y < VerticalResolution; Y++) { > - for (X = 0; X < HorizontalResolution; X++) { > - Color.Red = (UINT8) ((X * 0x100) / HorizontalResolution); > - Color.Green = (UINT8) ((Y * 0x100) / VerticalResolution); > - Color.Blue = (UINT8) ((Y * 0x100) / VerticalResolution); > - BltVideoFill (&Color, X, Y, 1, 1); > + for (Y = 0; Y < FrameBufferInfo->VerticalResolution; Y++) { > + for (X = 0; X < FrameBufferInfo->HorizontalResolution; X++) { > + BltBuffer[X].Red = (UINT8) ((X * 0x100) / > FrameBufferInfo->HorizontalResolution); > + BltBuffer[X].Green = (UINT8) ((Y * 0x100) / > FrameBufferInfo->VerticalResolution); > + BltBuffer[X].Blue = (UINT8) ((Y * 0x100) / > FrameBufferInfo->VerticalResolution); > } > + BltBufferToVideo (FrameBuffer, FrameBufferInfo, BltBuffer, 0, 0, 0, Y, > FrameBufferInfo->HorizontalResolution, 1, 0); > } > } > > @@ -176,8 +178,8 @@ GetTriColor ( > > VOID > TestColor ( > - UINT32 HorizontalResolution, > - UINT32 VerticalResolution > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > ) > { > EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; > @@ -187,34 +189,38 @@ TestColor ( > UINTN LineWidth, TriWidth; > UINTN TriHeight; > UINT32 ColorDist; > + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer; > > *(UINT32*) (&Color) = 0; > - BltVideoFill (&Color, 0, 0, HorizontalResolution, VerticalResolution); > + BltVideoFill (FrameBuffer, FrameBufferInfo, &Color, 0, 0, > FrameBufferInfo->HorizontalResolution, FrameBufferInfo->VerticalResolution); > > TriWidth = (UINTN) DivU64x32 ( > - MultU64x32 (11547005, (UINT32) VerticalResolution), > + MultU64x32 (11547005, > FrameBufferInfo->HorizontalResolution), > 10000000 > ); > TriHeight = (UINTN) DivU64x32 ( > - MultU64x32 (8660254, (UINT32) HorizontalResolution), > + MultU64x32 (8660254, > FrameBufferInfo->VerticalResolution), > 10000000 > ); > - if (TriWidth > HorizontalResolution) { > + if (TriWidth > FrameBufferInfo->HorizontalResolution) { > DEBUG ((EFI_D_INFO, "TriWidth at %d was too big\n", TriWidth)); > - TriWidth = HorizontalResolution; > - } else if (TriHeight > VerticalResolution) { > + TriWidth = FrameBufferInfo->HorizontalResolution; > + } else if (TriHeight > FrameBufferInfo->VerticalResolution) { > DEBUG ((EFI_D_INFO, "TriHeight at %d was too big\n", TriHeight)); > - TriHeight = VerticalResolution; > + TriHeight = FrameBufferInfo->VerticalResolution; > } > > DEBUG ((EFI_D_INFO, "Triangle Width: %d; Height: %d\n", TriWidth, > TriHeight)); > > - X1 = (HorizontalResolution - TriWidth) / 2; > + X1 = (FrameBufferInfo->HorizontalResolution - TriWidth) / 2; > X3 = X1 + TriWidth - 1; > X2 = (X1 + X3) / 2; > - Y2 = (VerticalResolution - TriHeight) / 2; > + Y2 = (FrameBufferInfo->VerticalResolution - TriHeight) / 2; > Y1 = Y2 + TriHeight - 1; > > + BltBuffer = AllocatePool (sizeof (*BltBuffer) * > FrameBufferInfo->HorizontalResolution); > + ASSERT (BltBuffer != NULL); > + > for (Y = Y2; Y <= Y1; Y++) { > LineWidth = > (UINTN) DivU64x32 ( > @@ -223,26 +229,25 @@ TestColor ( > ); > for (X = X2 - LineWidth; X < (X2 + LineWidth); X++) { > ColorDist = Uint32Dist(X - X1, Y1 - Y); > - Color.Red = GetTriColor (ColorDist, TriWidth); > + BltBuffer[X - (X2 - LineWidth)].Red = GetTriColor (ColorDist, > TriWidth); > > ColorDist = Uint32Dist((X < X2) ? X2 - X : X - X2, Y - Y2); > - Color.Green = GetTriColor (ColorDist, TriWidth); > + BltBuffer[X - (X2 - LineWidth)].Green = GetTriColor (ColorDist, > TriWidth); > > ColorDist = Uint32Dist(X3 - X, Y1 - Y); > - Color.Blue = GetTriColor (ColorDist, TriWidth); > - > - BltVideoFill (&Color, X, Y, 1, 1); > + BltBuffer[X - (X2 - LineWidth)].Blue = GetTriColor (ColorDist, > TriWidth); > } > + BltBufferToVideo (FrameBuffer, FrameBufferInfo, BltBuffer, 0, 0, X2 - > LineWidth, Y, LineWidth * 2, 1, 0); > } > - > + FreePool (BltBuffer); > gBS->Stall (1000 * 1000); > } > > > VOID > -TestMove1 ( > - UINT32 HorizontalResolution, > - UINT32 VerticalResolution > +TestMove ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > ) > { > EFI_GRAPHICS_OUTPUT_BLT_PIXEL Blue; > @@ -251,18 +256,18 @@ TestMove1 ( > UINTN Width; > UINTN Height; > > - *(UINT32 *) &Black = 0; > Width = 100; > Height = 20; > > - BltVideoFill (&Black, 0, 0, HorizontalResolution, VerticalResolution); > + *(UINT32 *) &Black = 0; > + BltVideoFill (FrameBuffer, FrameBufferInfo, &Black, 0, 0, > FrameBufferInfo->HorizontalResolution, FrameBufferInfo->VerticalResolution); > > *(UINT32 *) &Blue = 0; > Blue.Blue = 0xff; > - BltVideoFill (&Blue, 0, 0, Width, Height); > + BltVideoFill (FrameBuffer, FrameBufferInfo, &Blue, 0, 0, Width, Height); > > - for (X = 1, Y = 1; X < HorizontalResolution && Y < VerticalResolution; > X++, Y++) { > - BltVideoToVideo (X - 1, Y - 1, X, Y, Width, Height); > + for (X = 1, Y = 1; X < FrameBufferInfo->HorizontalResolution && Y < > FrameBufferInfo->VerticalResolution; X++, Y++) { > + BltVideoToVideo (FrameBuffer, FrameBufferInfo, X - 1, Y - 1, X, Y, > Width, Height); > gBS->Stall (100); > } > gBS->Stall (1000 * 1000 * 2); > @@ -298,19 +303,25 @@ UefiMain ( > return Status; > } > > - Status = BltConfigure ( > - (VOID*)(UINTN) Gop->Mode->FrameBufferBase, > - Gop->Mode->Info > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - TestFills (Gop->Mode->Info->HorizontalResolution, > Gop->Mode->Info->VerticalResolution); > - > - TestColor (Gop->Mode->Info->HorizontalResolution, > Gop->Mode->Info->VerticalResolution); > - > - TestMove1 (Gop->Mode->Info->HorizontalResolution, > Gop->Mode->Info->VerticalResolution); > - > + TestMove ( > + (VOID *) (UINTN) Gop->Mode->FrameBufferBase, > + Gop->Mode->Info > + ); > + > + TestFills ( > + (VOID *) (UINTN) Gop->Mode->FrameBufferBase, > + Gop->Mode->Info > + ); > + > + TestColor ( > + (VOID *) (UINTN) Gop->Mode->FrameBufferBase, > + Gop->Mode->Info > + ); > + gBS->Stall (3 * 1000 * 1000); > + > + TestColor1 ( > + (VOID *) (UINTN) Gop->Mode->FrameBufferBase, > + Gop->Mode->Info > + ); > return EFI_SUCCESS; > } > diff --git a/OptionRomPkg/Include/Library/BltLib.h > b/OptionRomPkg/Include/Library/BltLib.h > index 230dac2..65ea9d4 100644 > --- a/OptionRomPkg/Include/Library/BltLib.h > +++ b/OptionRomPkg/Include/Library/BltLib.h > @@ -17,41 +17,27 @@ > > #include <Protocol/GraphicsOutput.h> > > - > -/** > - Configure the BltLib for a frame-buffer > - > - @param[in] FrameBuffer Pointer to the start of the frame buffer > - @param[in] FrameBufferInfo Describes the frame buffer characteristics > - > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > - > -**/ > -EFI_STATUS > -EFIAPI > -BltConfigure ( > - IN VOID *FrameBuffer, > - IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > - ); > - > /** > Performs a UEFI Graphics Output Protocol Blt Video Fill. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoFill ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color, > IN UINTN DestinationX, > IN UINTN DestinationY, > @@ -62,82 +48,93 @@ BltVideoFill ( > /** > Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToBuffer ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ); > > /** > Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltBufferToVideo ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ); > > - > /** > - Performs a UEFI Graphics Output Protocol Blt Video to Video operation > + Performs a UEFI Graphics Output Protocol Blt Video to Video operation. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToVideo ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN UINTN SourceX, > IN UINTN SourceY, > IN UINTN DestinationX, > diff --git a/OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.c > b/OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.c > index 8b0d2bd..977f852 100644 > --- a/OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.c > +++ b/OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.c > @@ -16,7 +16,6 @@ > #include <Library/BaseLib.h> > #include <Library/BaseMemoryLib.h> > #include <Library/DebugLib.h> > -#include <Library/BltLib.h> > #include <Protocol/GraphicsOutput.h> > > #if 0 > @@ -27,100 +26,101 @@ > > #define MAX_LINE_BUFFER_SIZE (SIZE_4KB * sizeof > (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) > > -UINTN mBltLibColorDepth; > -UINTN mBltLibWidthInBytes; > -UINTN mBltLibBytesPerPixel; > -UINTN mBltLibWidthInPixels; > -UINTN mBltLibHeight; > -UINT8 mBltLibLineBuffer[MAX_LINE_BUFFER_SIZE]; > -UINT8 *mBltLibFrameBuffer; > -EFI_GRAPHICS_PIXEL_FORMAT mPixelFormat; > -EFI_PIXEL_BITMASK mPixelBitMasks; > -INTN mPixelShl[4]; // R-G-B-Rsvd > -INTN mPixelShr[4]; // R-G-B-Rsvd > - > -VOID > -ConfigurePixelBitMaskFormat ( > - IN EFI_PIXEL_BITMASK *BitMask > +UINT8 mBltLibLineBuffer[MAX_LINE_BUFFER_SIZE]; > +EFI_PIXEL_BITMASK mBltLibRgbPixelMasks = {0x000000ff, 0x0000ff00, > 0x00ff0000, 0xff000000}; > +EFI_PIXEL_BITMASK mBltLibBgrPixelMasks = {0x00ff0000, 0x0000ff00, > 0x000000ff, 0xff000000}; > + > +EFI_STATUS > +BltLibParsePixelFormat ( > + IN EFI_GRAPHICS_PIXEL_FORMAT PixelFormat, > + IN EFI_PIXEL_BITMASK *PixelInformation, > + OUT UINT8 *PixelShl, > + OUT UINT8 *PixelShr, > + OUT UINT32 *PixelMask, > + OUT UINT8 *BytesPerPixel > ) > { > - UINTN Loop; > - UINT32 *Masks; > - UINT32 MergedMasks; > + UINTN Index; > + UINT32 MergedMasks; > + UINT32 *Mask; > > - MergedMasks = 0; > - Masks = (UINT32*) BitMask; > - for (Loop = 0; Loop < 3; Loop++) { > - ASSERT ((Loop == 3) || (Masks[Loop] != 0)); > - ASSERT ((MergedMasks & Masks[Loop]) == 0); > - mPixelShl[Loop] = HighBitSet32 (Masks[Loop]) - 23 + (Loop * 8); > - if (mPixelShl[Loop] < 0) { > - mPixelShr[Loop] = -mPixelShl[Loop]; > - mPixelShl[Loop] = 0; > - } else { > - mPixelShr[Loop] = 0; > - } > - MergedMasks = (UINT32) (MergedMasks | Masks[Loop]); > - DEBUG ((EFI_D_INFO, "%d: shl:%d shr:%d mask:%x\n", Loop, > mPixelShl[Loop], mPixelShr[Loop], Masks[Loop])); > - } > - MergedMasks = (UINT32) (MergedMasks | Masks[3]); > + switch (PixelFormat) { > + case PixelRedGreenBlueReserved8BitPerColor: > + return BltLibParsePixelFormat (PixelBitMask, &mBltLibRgbPixelMasks, > PixelShl, PixelShr, PixelMask, BytesPerPixel); > > - ASSERT (MergedMasks != 0); > - mBltLibBytesPerPixel = (UINTN) ((HighBitSet32 (MergedMasks) + 7) / 8); > + case PixelBlueGreenRedReserved8BitPerColor: > + return BltLibParsePixelFormat (PixelBitMask, &mBltLibBgrPixelMasks, > PixelShl, PixelShr, PixelMask, BytesPerPixel); > > - DEBUG ((EFI_D_INFO, "Bytes per pixel: %d\n", mBltLibBytesPerPixel)); > + case PixelBitMask: > + break; > > - CopyMem (&mPixelBitMasks, BitMask, sizeof (*BitMask)); > -} > + default: > + return EFI_INVALID_PARAMETER; > + } > > -/** > - Configure the FrameBufferLib instance > + MergedMasks = 0; > + Mask = (UINT32 *) PixelInformation; > + for (Index = 0; Index < 4; Index++) { > + // > + // Only ReservedMask can be 0 > + // > + if (Index != 3 && Mask[Index] == 0) { > + return EFI_INVALID_PARAMETER; > + } > + // > + // The Mask of each color shouldn't overlap > + // > + if ((MergedMasks & Mask[Index]) != 0) { > + return EFI_INVALID_PARAMETER; > + } > + MergedMasks |= Mask[Index]; > + > + if (PixelShl != NULL && PixelShr != NULL) { > + PixelShl[Index] = (UINT8) (HighBitSet32 (Mask[Index]) - 23 + (Index * > 8)); > + PixelShl[Index] %= 32; > + if ((INT8) PixelShl[Index] < 0) { > + PixelShr[Index] = -PixelShl[Index]; > + PixelShl[Index] = 0; > + } else { > + PixelShr[Index] = 0; > + } > + VDEBUG ((EFI_D_INFO, "%d: shl:%d shr:%d mask:%x\n", Index, > PixelShl[Index], PixelShr[Index], Mask[Index])); > + } > + } > + if (PixelMask != NULL) { > + CopyMem (PixelMask, PixelInformation, sizeof (EFI_PIXEL_BITMASK)); > + } > > - @param[in] FrameBuffer Pointer to the start of the frame buffer > - @param[in] FrameBufferInfo Describes the frame buffer characteristics > + if (BytesPerPixel != NULL) { > + *BytesPerPixel = (UINT8) ((HighBitSet32 (MergedMasks) + 7) / 8); > + VDEBUG ((EFI_D_INFO, "Bytes per pixel: %d\n", *BytesPerPixel)); > + } > > - @retval EFI_INVALID_PARAMETER - Invalid parameter > - @retval EFI_UNSUPPORTED - The BltLib does not support this configuration > - @retval EFI_SUCCESS - Blt operation success > + return EFI_SUCCESS; > +} > > -**/ > EFI_STATUS > -EFIAPI > -BltConfigure ( > - IN VOID *FrameBuffer, > - IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > +BltLibVerifyLocation ( > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + IN UINTN X, > + IN UINTN Y, > + IN UINTN Width, > + IN UINTN Height > ) > { > - STATIC EFI_PIXEL_BITMASK RgbPixelMasks = > - { 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; > - STATIC EFI_PIXEL_BITMASK BgrPixelMasks = > - { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; > - > - switch (FrameBufferInfo->PixelFormat) { > - case PixelRedGreenBlueReserved8BitPerColor: > - ConfigurePixelBitMaskFormat (&RgbPixelMasks); > - break; > - case PixelBlueGreenRedReserved8BitPerColor: > - ConfigurePixelBitMaskFormat (&BgrPixelMasks); > - break; > - case PixelBitMask: > - ConfigurePixelBitMaskFormat (&(FrameBufferInfo->PixelInformation)); > - break; > - case PixelBltOnly: > - ASSERT (FrameBufferInfo->PixelFormat != PixelBltOnly); > - return EFI_UNSUPPORTED; > - default: > - ASSERT (FALSE); > + if ((X >= FrameBufferInfo->HorizontalResolution) || > + (Width > FrameBufferInfo->HorizontalResolution - X) > + ) { > + VDEBUG ((EFI_D_INFO, "VideoFill: Past screen (X)\n")); > return EFI_INVALID_PARAMETER; > } > - mPixelFormat = FrameBufferInfo->PixelFormat; > - > - mBltLibFrameBuffer = (UINT8*) FrameBuffer; > - mBltLibWidthInPixels = (UINTN) FrameBufferInfo->HorizontalResolution; > - mBltLibHeight = (UINTN) FrameBufferInfo->VerticalResolution; > - mBltLibWidthInBytes = mBltLibWidthInPixels * mBltLibBytesPerPixel; > > - ASSERT (mBltLibWidthInBytes < sizeof (mBltLibLineBuffer)); > + if ((Y >= FrameBufferInfo->VerticalResolution) || > + (Height > FrameBufferInfo->VerticalResolution - Y) > + ) { > + VDEBUG ((EFI_D_INFO, "VideoFill: Past screen (Y)\n")); > + return EFI_INVALID_PARAMETER; > + } > > return EFI_SUCCESS; > } > @@ -128,20 +128,24 @@ BltConfigure ( > /** > Performs a UEFI Graphics Output Protocol Blt Video Fill. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoFill ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color, > IN UINTN DestinationX, > IN UINTN DestinationY, > @@ -149,6 +153,7 @@ BltVideoFill ( > IN UINTN Height > ) > { > + EFI_STATUS Status; > UINTN Y; > UINT8 *Destination; > UINTN X; > @@ -160,34 +165,32 @@ BltVideoFill ( > UINTN Offset; > UINTN WidthInBytes; > UINTN SizeInBytes; > - > - // > - // BltBuffer to Video: Source is BltBuffer, destination is Video > - // > - if (DestinationY + Height > mBltLibHeight) { > - DEBUG ((EFI_D_INFO, "VideoFill: Past screen (Y)\n")); > - return EFI_INVALID_PARAMETER; > - } > - > - if (DestinationX + Width > mBltLibWidthInPixels) { > - DEBUG ((EFI_D_INFO, "VideoFill: Past screen (X)\n")); > - return EFI_INVALID_PARAMETER; > + UINT8 PixelShr[4]; > + UINT8 PixelShl[4]; > + UINT32 PixelMask[4]; > + UINT8 BytesPerPixel; > + > + Status = BltLibVerifyLocation (FrameBufferInfo, DestinationX, > DestinationY, Width, Height); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - if (Width == 0 || Height == 0) { > - DEBUG ((EFI_D_INFO, "VideoFill: Width or Height is 0\n")); > - return EFI_INVALID_PARAMETER; > + Status = BltLibParsePixelFormat ( > + FrameBufferInfo->PixelFormat, > + &FrameBufferInfo->PixelInformation, > + PixelShr, PixelShl, PixelMask, &BytesPerPixel > + ); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - WidthInBytes = Width * mBltLibBytesPerPixel; > + WidthInBytes = Width * BytesPerPixel; > > - Uint32 = *(UINT32*) Color; > - WideFill = > - (UINT32) ( > - (((Uint32 << mPixelShl[0]) >> mPixelShr[0]) & > mPixelBitMasks.RedMask) | > - (((Uint32 << mPixelShl[1]) >> mPixelShr[1]) & > mPixelBitMasks.GreenMask) | > - (((Uint32 << mPixelShl[2]) >> mPixelShr[2]) & > mPixelBitMasks.BlueMask) > - ); > + Uint32 = *(UINT32 *) Color; > + WideFill = (((Uint32 << PixelShl[0]) >> PixelShr[0]) & PixelMask[0]) | > + (((Uint32 << PixelShl[1]) >> PixelShr[1]) & PixelMask[1]) | > + (((Uint32 << PixelShl[2]) >> PixelShr[2]) & PixelMask[2]) | > + (((Uint32 << PixelShl[3]) >> PixelShr[3]) & PixelMask[3]); > VDEBUG ((EFI_D_INFO, "VideoFill: color=0x%x, wide-fill=0x%x\n", Uint32, > WideFill)); > > // > @@ -195,20 +198,17 @@ BltVideoFill ( > // WideFill, then a wide fill operation can be used > // > UseWideFill = TRUE; > - if ((sizeof (WideFill) % mBltLibBytesPerPixel) == 0) { > - for (X = mBltLibBytesPerPixel; X < sizeof (WideFill); X++) { > - ((UINT8*)&WideFill)[X] = ((UINT8*)&WideFill)[X % mBltLibBytesPerPixel]; > + if (sizeof (WideFill) % BytesPerPixel == 0) { > + for (X = BytesPerPixel; X < sizeof (WideFill); X++) { > + ((UINT8 *) &WideFill)[X] = ((UINT8 *) &WideFill)[X % BytesPerPixel]; > } > } else { > // > // If all the bytes in the pixel are the same value, then use > // a wide fill operation. > // > - for ( > - X = 1, Uint8 = ((UINT8*)&WideFill)[0]; > - X < mBltLibBytesPerPixel; > - X++) { > - if (Uint8 != ((UINT8*)&WideFill)[X]) { > + for (X = 1, Uint8 = ((UINT8*) &WideFill)[0]; X < BytesPerPixel; X++) { > + if (Uint8 != ((UINT8*) &WideFill)[X]) { > UseWideFill = FALSE; > break; > } > @@ -218,31 +218,31 @@ BltVideoFill ( > } > } > > - if (UseWideFill && (DestinationX == 0) && (Width == mBltLibWidthInPixels)) > { > + if (UseWideFill && (DestinationX == 0) && (Width == > FrameBufferInfo->HorizontalResolution)) { > VDEBUG ((EFI_D_INFO, "VideoFill (wide, one-shot)\n")); > - Offset = DestinationY * mBltLibWidthInPixels; > - Offset = mBltLibBytesPerPixel * Offset; > - Destination = mBltLibFrameBuffer + Offset; > + Offset = DestinationY * FrameBufferInfo->PixelsPerScanLine * > BytesPerPixel; > + Destination = (UINT8 *) FrameBuffer + Offset; > SizeInBytes = WidthInBytes * Height; > if (SizeInBytes >= 8) { > - SetMem32 (Destination, SizeInBytes & ~3, (UINT32) WideFill); > - SizeInBytes &= 3; > + SetMem64 (Destination, SizeInBytes & ~7, WideFill); > + Destination += (SizeInBytes & ~7); > + SizeInBytes &= 7; > } > if (SizeInBytes > 0) { > - SetMem (Destination, SizeInBytes, (UINT8)(UINTN) WideFill); > + CopyMem (Destination, &WideFill, SizeInBytes); > } > } else { > LineBufferReady = FALSE; > for (Y = DestinationY; Y < (Height + DestinationY); Y++) { > - Offset = (Y * mBltLibWidthInPixels) + DestinationX; > - Offset = mBltLibBytesPerPixel * Offset; > - Destination = mBltLibFrameBuffer + Offset; > + Offset = ((Y * FrameBufferInfo->PixelsPerScanLine) + DestinationX) * > BytesPerPixel; > + Destination = (UINT8 *) FrameBuffer + Offset; > > if (UseWideFill && (((UINTN) Destination & 7) == 0)) { > VDEBUG ((EFI_D_INFO, "VideoFill (wide)\n")); > SizeInBytes = WidthInBytes; > if (SizeInBytes >= 8) { > SetMem64 (Destination, SizeInBytes & ~7, WideFill); > + Destination += (SizeInBytes & ~7); > SizeInBytes &= 7; > } > if (SizeInBytes > 0) { > @@ -251,12 +251,12 @@ BltVideoFill ( > } else { > VDEBUG ((EFI_D_INFO, "VideoFill (not wide)\n")); > if (!LineBufferReady) { > - CopyMem (mBltLibLineBuffer, &WideFill, mBltLibBytesPerPixel); > + CopyMem (mBltLibLineBuffer, &WideFill, BytesPerPixel); > for (X = 1; X < Width; ) { > - CopyMem( > - (mBltLibLineBuffer + (X * mBltLibBytesPerPixel)), > + CopyMem ( > + (mBltLibLineBuffer + (X * BytesPerPixel)), > mBltLibLineBuffer, > - MIN (X, Width - X) * mBltLibBytesPerPixel > + MIN (X, Width - X) * BytesPerPixel > ); > X += MIN (X, Width - X); > } > @@ -273,33 +273,38 @@ BltVideoFill ( > /** > Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToBuffer ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ) > { > + EFI_STATUS Status; > UINTN DstY; > UINTN SrcY; > EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; > @@ -309,22 +314,27 @@ BltVideoToBuffer ( > UINT32 Uint32; > UINTN Offset; > UINTN WidthInBytes; > + UINT8 PixelShr[4]; > + UINT8 PixelShl[4]; > + UINT32 PixelMask[4]; > + UINT8 BytesPerPixel; > > // > // Video to BltBuffer: Source is Video, destination is BltBuffer > // > - if (SourceY + Height > mBltLibHeight) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (SourceX + Width > mBltLibWidthInPixels) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibVerifyLocation (FrameBufferInfo, SourceX, SourceY, Width, > Height); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - if (Width == 0 || Height == 0) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibParsePixelFormat ( > + FrameBufferInfo->PixelFormat, > + &FrameBufferInfo->PixelInformation, > + PixelShl, PixelShr, PixelMask, &BytesPerPixel > + ); > + if (EFI_ERROR (Status)) { > + return Status; > } > - > // > // 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, > @@ -334,18 +344,17 @@ BltVideoToBuffer ( > Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); > } > > - WidthInBytes = Width * mBltLibBytesPerPixel; > + WidthInBytes = Width * BytesPerPixel; > > // > // Video to BltBuffer: Source is Video, destination is BltBuffer > // > - for (SrcY = SourceY, DstY = DestinationY; DstY < (Height + DestinationY); > SrcY++, DstY++) { > + for (SrcY = SourceY, DstY = DestinationY; DstY < (DestinationY + Height); > SrcY++, DstY++) { > > - Offset = (SrcY * mBltLibWidthInPixels) + SourceX; > - Offset = mBltLibBytesPerPixel * Offset; > - Source = mBltLibFrameBuffer + Offset; > + Offset = ((SrcY * FrameBufferInfo->PixelsPerScanLine) + SourceX) * > BytesPerPixel; > + Source = (UINT8 *) FrameBuffer + Offset; > > - if (mPixelFormat == PixelBlueGreenRedReserved8BitPerColor) { > + if (FrameBufferInfo->PixelFormat == > PixelBlueGreenRedReserved8BitPerColor) { > Destination = (UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX * > sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); > } else { > Destination = mBltLibLineBuffer; > @@ -353,16 +362,14 @@ BltVideoToBuffer ( > > CopyMem (Destination, Source, WidthInBytes); > > - if (mPixelFormat != PixelBlueGreenRedReserved8BitPerColor) { > + if (FrameBufferInfo->PixelFormat != > PixelBlueGreenRedReserved8BitPerColor) { > for (X = 0; X < Width; X++) { > - Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer > + (DstY * Delta) + (DestinationX + X) * sizeof > (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); > - Uint32 = *(UINT32*) (mBltLibLineBuffer + (X * mBltLibBytesPerPixel)); > - *(UINT32*) Blt = > - (UINT32) ( > - (((Uint32 & mPixelBitMasks.RedMask) >> mPixelShl[0]) << > mPixelShr[0]) | > - (((Uint32 & mPixelBitMasks.GreenMask) >> mPixelShl[1]) << > mPixelShr[1]) | > - (((Uint32 & mPixelBitMasks.BlueMask) >> mPixelShl[2]) << > mPixelShr[2]) > - ); > + Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + > (DstY * Delta) + (DestinationX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); > + Uint32 = * (UINT32 *) (mBltLibLineBuffer + (X * BytesPerPixel)); > + *(UINT32*) Blt = (((Uint32 & PixelMask[0]) >> PixelShl[0]) << > PixelShr[0]) | > + (((Uint32 & PixelMask[1]) >> PixelShl[1]) << > PixelShr[1]) | > + (((Uint32 & PixelMask[2]) >> PixelShl[2]) << > PixelShr[2]) | > + (((Uint32 & PixelMask[3]) >> PixelShl[3]) << > PixelShr[3]); > } > } > } > @@ -373,33 +380,38 @@ BltVideoToBuffer ( > /** > Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltBufferToVideo ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ) > { > + EFI_STATUS Status; > UINTN DstY; > UINTN SrcY; > EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; > @@ -409,22 +421,27 @@ BltBufferToVideo ( > UINT32 Uint32; > UINTN Offset; > UINTN WidthInBytes; > + UINT8 PixelShr[4]; > + UINT8 PixelShl[4]; > + UINT32 PixelMask[4]; > + UINT8 BytesPerPixel; > > // > // BltBuffer to Video: Source is BltBuffer, destination is Video > // > - if (DestinationY + Height > mBltLibHeight) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (DestinationX + Width > mBltLibWidthInPixels) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibVerifyLocation (FrameBufferInfo, DestinationX, > DestinationY, Width, Height); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - if (Width == 0 || Height == 0) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibParsePixelFormat ( > + FrameBufferInfo->PixelFormat, > + &FrameBufferInfo->PixelInformation, > + PixelShl, PixelShr, PixelMask, &BytesPerPixel > + ); > + if (EFI_ERROR (Status)) { > + return Status; > } > - > // > // 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, > @@ -434,15 +451,14 @@ BltBufferToVideo ( > Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); > } > > - WidthInBytes = Width * mBltLibBytesPerPixel; > + WidthInBytes = Width * BytesPerPixel; > > for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); > SrcY++, DstY++) { > > - Offset = (DstY * mBltLibWidthInPixels) + DestinationX; > - Offset = mBltLibBytesPerPixel * Offset; > - Destination = mBltLibFrameBuffer + Offset; > + Offset = ((DstY * FrameBufferInfo->PixelsPerScanLine) + DestinationX) * > BytesPerPixel; > + Destination = (UINT8 *) FrameBuffer + Offset; > > - if (mPixelFormat == PixelBlueGreenRedReserved8BitPerColor) { > + if (FrameBufferInfo->PixelFormat == > PixelBlueGreenRedReserved8BitPerColor) { > Source = (UINT8 *) BltBuffer + (SrcY * Delta); > } else { > for (X = 0; X < Width; X++) { > @@ -453,12 +469,11 @@ BltBufferToVideo ( > ((SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) > ); > Uint32 = *(UINT32*) Blt; > - *(UINT32*) (mBltLibLineBuffer + (X * mBltLibBytesPerPixel)) = > - (UINT32) ( > - (((Uint32 << mPixelShl[0]) >> mPixelShr[0]) & > mPixelBitMasks.RedMask) | > - (((Uint32 << mPixelShl[1]) >> mPixelShr[1]) & > mPixelBitMasks.GreenMask) | > - (((Uint32 << mPixelShl[2]) >> mPixelShr[2]) & > mPixelBitMasks.BlueMask) > - ); > + *(UINT32*) (mBltLibLineBuffer + (X * BytesPerPixel)) = > + (((Uint32 << PixelShl[0]) >> PixelShr[0]) & PixelMask[0]) | > + (((Uint32 << PixelShl[1]) >> PixelShr[1]) & PixelMask[1]) | > + (((Uint32 << PixelShl[2]) >> PixelShr[2]) & PixelMask[2]) | > + (((Uint32 << PixelShl[3]) >> PixelShr[3]) & PixelMask[3]); > } > Source = mBltLibLineBuffer; > } > @@ -470,23 +485,27 @@ BltBufferToVideo ( > } > > /** > - Performs a UEFI Graphics Output Protocol Blt Video to Video operation > + Performs a UEFI Graphics Output Protocol Blt Video to Video operation. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToVideo ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN UINTN SourceX, > IN UINTN SourceY, > IN UINTN DestinationX, > @@ -495,46 +514,45 @@ BltVideoToVideo ( > IN UINTN Height > ) > { > + EFI_STATUS Status; > UINT8 *Source; > UINT8 *Destination; > UINTN Offset; > UINTN WidthInBytes; > INTN LineStride; > + UINT8 BytesPerPixel; > > // > // Video to Video: Source is Video, destination is Video > // > - if (SourceY + Height > mBltLibHeight) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibVerifyLocation (FrameBufferInfo, SourceX, SourceY, Width, > Height); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - if (SourceX + Width > mBltLibWidthInPixels) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibVerifyLocation (FrameBufferInfo, DestinationX, > DestinationY, Width, Height); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - if (DestinationY + Height > mBltLibHeight) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (DestinationX + Width > mBltLibWidthInPixels) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Width == 0 || Height == 0) { > - return EFI_INVALID_PARAMETER; > + Status = BltLibParsePixelFormat ( > + FrameBufferInfo->PixelFormat, > + &FrameBufferInfo->PixelInformation, > + NULL, NULL, NULL, &BytesPerPixel > + ); > + if (EFI_ERROR (Status)) { > + return Status; > } > > - WidthInBytes = Width * mBltLibBytesPerPixel; > + WidthInBytes = Width * BytesPerPixel; > > - Offset = (SourceY * mBltLibWidthInPixels) + SourceX; > - Offset = mBltLibBytesPerPixel * Offset; > - Source = mBltLibFrameBuffer + Offset; > + Offset = ((SourceY * FrameBufferInfo->PixelsPerScanLine) + SourceX) * > BytesPerPixel; > + Source = (UINT8 *) FrameBuffer + Offset; > > - Offset = (DestinationY * mBltLibWidthInPixels) + DestinationX; > - Offset = mBltLibBytesPerPixel * Offset; > - Destination = mBltLibFrameBuffer + Offset; > + Offset = ((DestinationY * FrameBufferInfo->PixelsPerScanLine) + > DestinationX) * BytesPerPixel; > + Destination = (UINT8 *) FrameBuffer + Offset; > > - LineStride = mBltLibWidthInBytes; > + LineStride = FrameBufferInfo->PixelsPerScanLine * BytesPerPixel; > if (Destination > Source) { > // > // Copy from last line to avoid source is corrupted by copying > diff --git a/OptionRomPkg/Library/GopBltLib/GopBltLib.c > b/OptionRomPkg/Library/GopBltLib/GopBltLib.c > index 8f598f2..486690f 100644 > --- a/OptionRomPkg/Library/GopBltLib/GopBltLib.c > +++ b/OptionRomPkg/Library/GopBltLib/GopBltLib.c > @@ -12,34 +12,26 @@ > > **/ > > -#include "PiDxe.h" > +#include <Uefi.h> > > #include <Protocol/GraphicsOutput.h> > > #include <Library/BaseLib.h> > #include <Library/BaseMemoryLib.h> > -#include <Library/BltLib.h> > #include <Library/DebugLib.h> > #include <Library/MemoryAllocationLib.h> > #include <Library/UefiBootServicesTableLib.h> > > -EFI_GRAPHICS_OUTPUT_PROTOCOL *mGop = NULL; > - > - > /** > - Configure the FrameBufferLib instance > + Look for the GOP instance based on the FrameBuffer and the FrameBufferInfo. > > @param[in] FrameBuffer Pointer to the start of the frame buffer > @param[in] FrameBufferInfo Describes the frame buffer characteristics > > - @retval EFI_INVALID_PARAMETER - Invalid parameter > - @retval EFI_UNSUPPORTED - The BltLib does not support this configuration > - @retval EFI_SUCCESS - Blt operation success > - > + @return The found GOP instance. > **/ > -EFI_STATUS > -EFIAPI > -BltConfigure ( > +EFI_GRAPHICS_OUTPUT_PROTOCOL * > +BltLibFindGopInstance ( > IN VOID *FrameBuffer, > IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo > ) > @@ -50,6 +42,8 @@ BltConfigure ( > UINTN Index; > EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; > > + Gop = NULL; > + > Status = gBS->LocateHandleBuffer ( > ByProtocol, > &gEfiGraphicsOutputProtocolGuid, > @@ -57,97 +51,113 @@ BltConfigure ( > &HandleCount, > &HandleBuffer > ); > - if (!EFI_ERROR (Status)) { > - for (Index = 0; Index < HandleCount; Index++) { > - Status = gBS->HandleProtocol ( > - HandleBuffer[Index], > - &gEfiGraphicsOutputProtocolGuid, > - (VOID*) &Gop > - ); > - if (!EFI_ERROR (Status) && > - (FrameBuffer == (VOID*)(UINTN) Gop->Mode->FrameBufferBase)) { > - mGop = Gop; > - FreePool (HandleBuffer); > - return EFI_SUCCESS; > - } > - } > + if (EFI_ERROR (Status)) { > + return NULL; > + } > > - FreePool (HandleBuffer); > + for (Index = 0; Index < HandleCount; Index++) { > + Status = gBS->HandleProtocol ( > + HandleBuffer[Index], > + &gEfiGraphicsOutputProtocolGuid, > + (VOID **) &Gop > + ); > + if (!EFI_ERROR (Status) && > + (FrameBuffer == (VOID *) (UINTN) Gop->Mode->FrameBufferBase) && > + (CompareMem (FrameBufferInfo, Gop->Mode->Info, sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)) == 0) > + ) { > + break; > + } > } > > - return EFI_UNSUPPORTED; > -} > + FreePool (HandleBuffer); > > + if (Index == HandleCount) { > + return NULL; > + } else { > + return Gop; > + } > +} > > /** > Performs a UEFI Graphics Output Protocol Blt operation. > > - @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. > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - Blt operation success > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > -InternalGopBltCommon ( > - IN 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 > +BltLibGopBltCommon ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + IN 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 (mGop == NULL) { > - return EFI_DEVICE_ERROR; > + EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; > + > + Gop = BltLibFindGopInstance (FrameBuffer, FrameBufferInfo); > + if (Gop == NULL) { > + return EFI_INVALID_PARAMETER; > } > > - return mGop->Blt ( > - mGop, > - BltBuffer, > - BltOperation, > - SourceX, > - SourceY, > - DestinationX, > - DestinationY, > - Width, > - Height, > - Delta > - ); > + return Gop->Blt ( > + Gop, > + BltBuffer, > + BltOperation, > + SourceX, > + SourceY, > + DestinationX, > + DestinationY, > + Width, > + Height, > + Delta > + ); > } > > /** > Performs a UEFI Graphics Output Protocol Blt Video Fill. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoFill ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color, > IN UINTN DestinationX, > IN UINTN DestinationY, > @@ -155,7 +165,9 @@ BltVideoFill ( > IN UINTN Height > ) > { > - return InternalGopBltCommon ( > + return BltLibGopBltCommon ( > + FrameBuffer, > + FrameBufferInfo, > Color, > EfiBltVideoFill, > 0, > @@ -168,38 +180,43 @@ BltVideoFill ( > ); > } > > - > /** > Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToBuffer ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ) > { > - return InternalGopBltCommon ( > + return BltLibGopBltCommon ( > + FrameBuffer, > + FrameBufferInfo, > BltBuffer, > EfiBltVideoToBltBuffer, > SourceX, > @@ -212,38 +229,43 @@ BltVideoToBuffer ( > ); > } > > - > /** > Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation. > > - @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltBufferToVideo ( > - 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 > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > + 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 > ) > { > - return InternalGopBltCommon ( > + return BltLibGopBltCommon ( > + FrameBuffer, > + FrameBufferInfo, > BltBuffer, > EfiBltBufferToVideo, > SourceX, > @@ -256,25 +278,28 @@ BltBufferToVideo ( > ); > } > > - > /** > - Performs a UEFI Graphics Output Protocol Blt Video to Video operation > + Performs a UEFI Graphics Output Protocol Blt Video to Video operation. > > - @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 > + @param[in] FrameBuffer Pointer to the start of the frame buffer > + @param[in] FrameBufferInfo Describes the frame buffer characteristics > + @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 EFI_DEVICE_ERROR - A hardware error occured > - @retval EFI_INVALID_PARAMETER - Invalid parameter passed in > - @retval EFI_SUCCESS - The sizes were returned > + @retval EFI_DEVICE_ERROR A hardware error occured > + @retval EFI_INVALID_PARAMETER Invalid parameter passed in > + @retval EFI_SUCCESS Blt operation success > > **/ > EFI_STATUS > EFIAPI > BltVideoToVideo ( > + IN VOID *FrameBuffer, > + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo, > IN UINTN SourceX, > IN UINTN SourceY, > IN UINTN DestinationX, > @@ -283,7 +308,9 @@ BltVideoToVideo ( > IN UINTN Height > ) > { > - return InternalGopBltCommon ( > + return BltLibGopBltCommon ( > + FrameBuffer, > + FrameBufferInfo, > NULL, > EfiBltVideoToVideo, > SourceX, > diff --git a/OvmfPkg/QemuVideoDxe/Gop.c b/OvmfPkg/QemuVideoDxe/Gop.c > index 131e5c1..65fecf9 100644 > --- a/OvmfPkg/QemuVideoDxe/Gop.c > +++ b/OvmfPkg/QemuVideoDxe/Gop.c > @@ -201,11 +201,6 @@ Routine Description: > > QemuVideoCompleteModeData (Private, This->Mode); > > - BltConfigure ( > - (VOID*)(UINTN) This->Mode->FrameBufferBase, > - This->Mode->Info > - ); > - > return EFI_SUCCESS; > } > > @@ -264,6 +259,8 @@ Returns: > switch (BltOperation) { > case EfiBltVideoToBltBuffer: > Status = BltVideoToBuffer ( > + (VOID *) (UINTN) This->Mode->FrameBufferBase, > + This->Mode->Info, > BltBuffer, > SourceX, > SourceY, > @@ -277,6 +274,8 @@ Returns: > > case EfiBltVideoToVideo: > Status = BltVideoToVideo ( > + (VOID *) (UINTN) This->Mode->FrameBufferBase, > + This->Mode->Info, > SourceX, > SourceY, > DestinationX, > @@ -288,6 +287,8 @@ Returns: > > case EfiBltVideoFill: > Status = BltVideoFill ( > + (VOID *) (UINTN) This->Mode->FrameBufferBase, > + This->Mode->Info, > BltBuffer, > DestinationX, > DestinationY, > @@ -298,6 +299,8 @@ Returns: > > case EfiBltBufferToVideo: > Status = BltBufferToVideo ( > + (VOID *) (UINTN) This->Mode->FrameBufferBase, > + This->Mode->Info, > BltBuffer, > SourceX, > SourceY, > -- > 1.9.5.msysgit.1 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel