OptionRomPkg BltLibSample: Add sample application for BltLib

This application uses BltLib to draw various items on the
screen.  It can be used as a test for a BltLib library
implementation, and it can be used to compare the results of
two BltLib implementations (such as the performance).

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11523 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jljusten 2011-04-12 15:08:26 +00:00
parent 4d19deac2a
commit a12199e66f
3 changed files with 305 additions and 0 deletions

View File

@ -0,0 +1,266 @@
/** @file
Example program using BltLib
Copyright (c) 2006 - 2011, 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.h>
#include <Library/BltLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
UINT32
Rand32 (
VOID
)
{
UINTN Found;
UINTN Bits;
UINT64 Tsc1;
UINT64 Tsc2;
UINT64 TscBits;
UINT32 R32;
R32 = 0;
Found = 0;
Tsc1 = AsmReadTsc ();
Tsc2 = AsmReadTsc ();
do {
Tsc2 = AsmReadTsc ();
TscBits = Tsc2 ^ Tsc1;
Bits = HighBitSet64 (TscBits);
if (Bits > 0) {
Bits = Bits - 1;
}
R32 = (R32 << Bits) | RShiftU64 (LShiftU64 (TscBits, 64 - Bits), 64 - Bits);
Found = Found + Bits;
} while (Found < 32);
return R32;
}
VOID
TestFills (
VOID
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
UINTN Loop;
UINTN X;
UINTN Y;
UINTN W;
UINTN H;
UINTN Width;
UINTN Height;
BltLibGetSizes (&Width, &Height);
for (Loop = 0; Loop < 10000; Loop++) {
W = Width - (Rand32 () % Width);
H = Height - (Rand32 () % Height);
if (W != Width) {
X = Rand32 () % (Width - W);
} else {
X = 0;
}
if (H != Height) {
Y = Rand32 () % (Height - H);
} else {
Y = 0;
}
*(UINT32*) (&Color) = Rand32 () & 0xffffff;
BltLibVideoFill (&Color, X, Y, W, H);
}
}
VOID
TestColor1 (
VOID
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
UINTN X;
UINTN Y;
UINTN Width;
UINTN Height;
BltLibGetSizes (&Width, &Height);
*(UINT32*) (&Color) = 0;
for (Y = 0; Y < Height; Y++) {
for (X = 0; X < Width; X++) {
Color.Red = ((X * 0x100) / Width);
Color.Green = ((Y * 0x100) / Height);
Color.Blue = ((Y * 0x100) / Height);
BltLibVideoFill (&Color, X, Y, 1, 1);
}
}
}
UINT32
Uint32SqRt (
IN UINT32 Uint32
)
{
UINTN Mask;
UINT32 SqRt;
UINT32 SqRtMask;
UINT32 Squared;
if (Uint32 == 0) {
return 0;
}
for (SqRt = 0, Mask = 1 << (HighBitSet32 (Uint32) / 2);
Mask != 0;
Mask = Mask >> 1
) {
SqRtMask = SqRt | Mask;
//DEBUG ((EFI_D_INFO, "Uint32=0x%x SqRtMask=0x%x\n", Uint32, SqRtMask));
Squared = (UINT32) (SqRtMask * SqRtMask);
if (Squared > Uint32) {
continue;
} else if (Squared < Uint32) {
SqRt = SqRtMask;
} else {
return SqRtMask;
}
}
return SqRt;
}
UINT32
Uint32Dist (
IN UINT32 X,
IN UINT32 Y
)
{
return Uint32SqRt ((X * X) + (Y * Y));
}
UINT32
GetTriColor (
IN UINT32 ColorDist,
IN UINT32 TriWidth
)
{
return (((TriWidth - ColorDist) * 0x100) / TriWidth);
//return (((TriWidth * TriWidth - ColorDist * ColorDist) * 0x100) / (TriWidth * TriWidth));
}
VOID
TestColor (
VOID
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;
UINTN X, Y;
UINTN X1, X2, X3;
UINTN Y1, Y2;
UINTN LineWidth, TriWidth, ScreenWidth;
UINTN TriHeight, ScreenHeight;
UINTN ColorDist;
BltLibGetSizes (&ScreenWidth, &ScreenHeight);
*(UINT32*) (&Color) = 0;
BltLibVideoFill (&Color, 0, 0, ScreenWidth, ScreenHeight);
TriWidth = DivU64x32 (MultU64x32 (11547005, ScreenHeight), 10000000);
TriHeight = DivU64x32 (MultU64x32 (8660254, ScreenWidth), 10000000);
if (TriWidth > ScreenWidth) {
DEBUG ((EFI_D_INFO, "TriWidth at %d was too big\n", TriWidth));
TriWidth = ScreenWidth;
} else if (TriHeight > ScreenHeight) {
DEBUG ((EFI_D_INFO, "TriHeight at %d was too big\n", TriHeight));
TriHeight = ScreenHeight;
}
DEBUG ((EFI_D_INFO, "Triangle Width: %d; Height: %d\n", TriWidth, TriHeight));
X1 = (ScreenWidth - TriWidth) / 2;
X3 = X1 + TriWidth - 1;
X2 = (X1 + X3) / 2;
Y2 = (ScreenHeight - TriHeight) / 2;
Y1 = Y2 + TriHeight - 1;
for (Y = Y2; Y <= Y1; Y++) {
LineWidth =
DivU64x32 (
MultU64x32 (11547005, (Y - Y2)),
20000000
);
for (X = X2 - LineWidth; X < (X2 + LineWidth); X++) {
ColorDist = Uint32Dist(X - X1, Y1 - Y);
Color.Red = GetTriColor (ColorDist, TriWidth);
ColorDist = Uint32Dist((X < X2) ? X2 - X : X - X2, Y - Y2);
Color.Green = GetTriColor (ColorDist, TriWidth);
ColorDist = Uint32Dist(X3 - X, Y1 - Y);
Color.Blue = GetTriColor (ColorDist, TriWidth);
BltLibVideoFill (&Color, X, Y, 1, 1);
}
}
}
/**
The user Entry Point for Application. The user code starts with this function
as the real entry point for the application.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
Status = gBS->HandleProtocol (
gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid,
(VOID **) &Gop
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = BltLibConfigure (
(VOID*)(UINTN) Gop->Mode->FrameBufferBase,
Gop->Mode->Info
);
if (EFI_ERROR (Status)) {
return Status;
}
TestFills ();
TestColor ();
return EFI_SUCCESS;
}

View File

@ -0,0 +1,35 @@
## @file
# Test the BltLib interface
#
# Copyright (c) 2008 - 2011, 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 = BltLibSample
FILE_GUID = f7763316-8c04-41d8-a87d-45b73c13c43c
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
BltLibSample.c
[Packages]
MdePkg/MdePkg.dec
OptionRomPkg/OptionRomPkg.dec
[LibraryClasses]
BltLib
UefiApplicationEntryPoint
UefiLib

View File

@ -47,6 +47,7 @@
DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
BltLib|OptionRomPkg/Library/GopBltLib/GopBltLib.inf
PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
@ -56,6 +57,7 @@
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
################################################################################
@ -99,6 +101,8 @@
OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
OptionRomPkg/Library/GopBltLib/GopBltLib.inf
OptionRomPkg/Application/BltLibSample/BltLibSample.inf
OptionRomPkg/AtapiPassThruDxe/AtapiPassThruDxe.inf
OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430Dxe.inf
OptionRomPkg/UndiRuntimeDxe/UndiRuntimeDxe.inf