mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/FrameBufferBltLib: Use dynamic allocated line buffer
https://bugzilla.tianocore.org/show_bug.cgi?id=339 The patch uses dynamic allocated line buffer to reduce memory usage of frame buffer configure. (Original implementation uses 0x4000 bytes for line buffer.) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
parent
5af29d0d86
commit
1d71d0c777
|
@ -26,12 +26,12 @@ struct FRAME_BUFFER_CONFIGURE {
|
||||||
UINTN BytesPerPixel;
|
UINTN BytesPerPixel;
|
||||||
UINTN WidthInPixels;
|
UINTN WidthInPixels;
|
||||||
UINTN Height;
|
UINTN Height;
|
||||||
UINT8 LineBuffer[SIZE_4KB * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)];
|
|
||||||
UINT8 *FrameBuffer;
|
UINT8 *FrameBuffer;
|
||||||
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
|
||||||
EFI_PIXEL_BITMASK PixelMasks;
|
EFI_PIXEL_BITMASK PixelMasks;
|
||||||
INT8 PixelShl[4]; // R-G-B-Rsvd
|
INT8 PixelShl[4]; // R-G-B-Rsvd
|
||||||
INT8 PixelShr[4]; // R-G-B-Rsvd
|
INT8 PixelShr[4]; // R-G-B-Rsvd
|
||||||
|
UINT8 LineBuffer[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
CONST EFI_PIXEL_BITMASK mRgbPixelMasks = {
|
CONST EFI_PIXEL_BITMASK mRgbPixelMasks = {
|
||||||
|
@ -123,15 +123,6 @@ FrameBufferBltConfigure (
|
||||||
return RETURN_INVALID_PARAMETER;
|
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) {
|
switch (FrameBufferInfo->PixelFormat) {
|
||||||
case PixelRedGreenBlueReserved8BitPerColor:
|
case PixelRedGreenBlueReserved8BitPerColor:
|
||||||
BitMask = &mRgbPixelMasks;
|
BitMask = &mRgbPixelMasks;
|
||||||
|
@ -156,6 +147,17 @@ FrameBufferBltConfigure (
|
||||||
|
|
||||||
FrameBufferBltLibConfigurePixelFormat (BitMask, &BytesPerPixel, PixelShl, PixelShr);
|
FrameBufferBltLibConfigurePixelFormat (BitMask, &BytesPerPixel, PixelShl, PixelShr);
|
||||||
|
|
||||||
|
if (*ConfigureSize < sizeof (FRAME_BUFFER_CONFIGURE)
|
||||||
|
+ FrameBufferInfo->HorizontalResolution * BytesPerPixel) {
|
||||||
|
*ConfigureSize = sizeof (FRAME_BUFFER_CONFIGURE)
|
||||||
|
+ FrameBufferInfo->HorizontalResolution * BytesPerPixel;
|
||||||
|
return RETURN_BUFFER_TOO_SMALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Configure == NULL) {
|
||||||
|
return RETURN_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
CopyMem (&Configure->PixelMasks, BitMask, sizeof (*BitMask));
|
CopyMem (&Configure->PixelMasks, BitMask, sizeof (*BitMask));
|
||||||
CopyMem (Configure->PixelShl, PixelShl, sizeof (PixelShl));
|
CopyMem (Configure->PixelShl, PixelShl, sizeof (PixelShl));
|
||||||
CopyMem (Configure->PixelShr, PixelShr, sizeof (PixelShr));
|
CopyMem (Configure->PixelShr, PixelShr, sizeof (PixelShr));
|
||||||
|
@ -166,8 +168,6 @@ FrameBufferBltConfigure (
|
||||||
Configure->Height = (UINTN) FrameBufferInfo->VerticalResolution;
|
Configure->Height = (UINTN) FrameBufferInfo->VerticalResolution;
|
||||||
Configure->WidthInBytes = Configure->WidthInPixels * Configure->BytesPerPixel;
|
Configure->WidthInBytes = Configure->WidthInPixels * Configure->BytesPerPixel;
|
||||||
|
|
||||||
ASSERT (Configure->WidthInBytes < sizeof (Configure->LineBuffer));
|
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue