From: jljusten Date: Tue, 12 Apr 2011 15:08:08 +0000 (+0000) Subject: OptionRomPkg: Add GOP based BltLib X-Git-Tag: edk2-stable201903~14957 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=4d19deac2aa6f40afe5c02f21bfa253a6647c54d OptionRomPkg: Add GOP based BltLib This BltLib provides a wrapper for calling the UEFI Graphics Output Protocol (GOP) functions for a single GOP instance. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11522 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/OptionRomPkg/Library/GopBltLib/GopBltLib.c b/OptionRomPkg/Library/GopBltLib/GopBltLib.c new file mode 100644 index 0000000000..5c353bc483 --- /dev/null +++ b/OptionRomPkg/Library/GopBltLib/GopBltLib.c @@ -0,0 +1,457 @@ +/** @file + GopBltLib - Library to perform blt using the UEFI Graphics Output Protocol. + + Copyright (c) 2007 - 2011, Intel Corporation + All rights reserved. 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 "PiDxe.h" + +#include + +#include +#include +#include +#include +#include +#include + +EFI_GRAPHICS_OUTPUT_PROTOCOL *mGop = NULL; + + +/** + Configure the FrameBufferLib instance + + @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 + +**/ +EFI_STATUS +EFIAPI +BltLibConfigure ( + IN VOID *FrameBuffer, + IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo + ) +{ + EFI_STATUS Status; + EFI_HANDLE *HandleBuffer; + UINTN HandleCount; + UINTN Index; + EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiGraphicsOutputProtocolGuid, + NULL, + &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; + } + } + + FreePool (HandleBuffer); + } + + return EFI_UNSUPPORTED; +} + + +/** + 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. + 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 + +**/ +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 + ) +{ + EFI_STATUS Status; + + if (mGop == NULL) { + return EFI_DEVICE_ERROR; + } + + return mGop->Blt ( + mGop, + BltBuffer, + BltOperation, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); +} + + +/** + 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. + 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 + +**/ +EFI_STATUS +EFIAPI +BltLibGopBlt ( + 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 + ) +{ + return InternalGopBltCommon ( + 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 + + @retval EFI_DEVICE_ERROR - A hardware error occured + @retval EFI_INVALID_PARAMETER - Invalid parameter passed in + @retval EFI_SUCCESS - The sizes were returned + +**/ +EFI_STATUS +EFIAPI +BltLibVideoFill ( + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color, + IN UINTN DestinationX, + IN UINTN DestinationY, + IN UINTN Width, + IN UINTN Height + ) +{ + return InternalGopBltCommon ( + Color, + EfiBltVideoFill, + 0, + 0, + DestinationX, + DestinationY, + Width, + Height, + 0 + ); +} + + +/** + 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] 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 + +**/ +EFI_STATUS +EFIAPI +BltLibVideoToBltBuffer ( + OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, + IN UINTN SourceX, + IN UINTN SourceY, + IN UINTN Width, + IN UINTN Height + ) +{ + return InternalGopBltCommon ( + BltBuffer, + EfiBltVideoToBltBuffer, + SourceX, + SourceY, + 0, + 0, + Width, + Height, + 0 + ); +} + + +/** + Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation + with extended parameters. + + @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 + +**/ +EFI_STATUS +EFIAPI +BltLibVideoToBltBufferEx ( + 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 ( + BltBuffer, + EfiBltVideoToBltBuffer, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); +} + + +/** + Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation. + + @param[in] BltBuffer Output buffer for pixel color data + @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 + +**/ +EFI_STATUS +EFIAPI +BltLibBufferToVideo ( + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, + IN UINTN DestinationX, + IN UINTN DestinationY, + IN UINTN Width, + IN UINTN Height + ) +{ + return InternalGopBltCommon ( + BltBuffer, + EfiBltBufferToVideo, + 0, + 0, + DestinationX, + DestinationY, + Width, + Height, + 0 + ); +} + + +/** + Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation + with extended parameters. + + @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 + +**/ +EFI_STATUS +EFIAPI +BltLibBufferToVideoEx ( + 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 ( + BltBuffer, + EfiBltBufferToVideo, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); +} + + +/** + 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 + + @retval EFI_DEVICE_ERROR - A hardware error occured + @retval EFI_INVALID_PARAMETER - Invalid parameter passed in + @retval EFI_SUCCESS - The sizes were returned + +**/ +EFI_STATUS +EFIAPI +BltLibVideoToVideo ( + IN UINTN SourceX, + IN UINTN SourceY, + IN UINTN DestinationX, + IN UINTN DestinationY, + IN UINTN Width, + IN UINTN Height + ) +{ + return InternalGopBltCommon ( + NULL, + EfiBltVideoToVideo, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + 0 + ); +} + +/** + Returns the sizes related to the video device + + @param[out] Width Width (in pixels) + @param[out] Height Height (in pixels) + + @retval EFI_INVALID_PARAMETER - Invalid parameter passed in + @retval EFI_SUCCESS - The sizes were returned + +**/ +EFI_STATUS +EFIAPI +BltLibGetSizes ( + OUT UINTN *Width, OPTIONAL + OUT UINTN *Height OPTIONAL + ) +{ + ASSERT (mGop != NULL); + + if (Width != NULL) { + *Width = mGop->Mode->Info->HorizontalResolution; + } + if (Height != NULL) { + *Height = mGop->Mode->Info->VerticalResolution; + } + + return EFI_SUCCESS; +} + diff --git a/OptionRomPkg/Library/GopBltLib/GopBltLib.inf b/OptionRomPkg/Library/GopBltLib/GopBltLib.inf new file mode 100644 index 0000000000..138783bb10 --- /dev/null +++ b/OptionRomPkg/Library/GopBltLib/GopBltLib.inf @@ -0,0 +1,37 @@ +#/** @file +# GopBltLib - Library to perform blt using the UEFI Graphics Output Protocol. +# +# Copyright (c) 2006 - 2011, Intel Corporation +# +# All rights reserved. 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 = GopBltLib + FILE_GUID = b75b91f0-a0b4-42fe-ba62-849027999b39 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BltLib + +[Sources.common] + GopBltLib.c + +[Libraries] + BaseLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + UefiBootServicesTableLib + +[Packages] + MdePkg/MdePkg.dec + OptionRomPkg/OptionRomPkg.dec + diff --git a/OptionRomPkg/OptionRomPkg.dsc b/OptionRomPkg/OptionRomPkg.dsc index 0570933afd..a6a4047ca0 100644 --- a/OptionRomPkg/OptionRomPkg.dsc +++ b/OptionRomPkg/OptionRomPkg.dsc @@ -97,6 +97,7 @@ [Components] OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf + OptionRomPkg/Library/GopBltLib/GopBltLib.inf OptionRomPkg/AtapiPassThruDxe/AtapiPassThruDxe.inf OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430Dxe.inf