mirror of https://github.com/acidanthera/audk.git
Fix Consplitter GOP UEFI SCT issue.
Signed-off-by: Li Elvin <elvin.li@intel.com> Reviewed-by: Ni Ruiyu <ruiyu.ni@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13651 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d6bee311ce
commit
2fa996f9b7
|
@ -44,6 +44,9 @@ ConSplitterGraphicsOutputQueryMode (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;
|
TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;
|
||||||
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
if (This == NULL || Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
|
if (This == NULL || Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -54,14 +57,38 @@ ConSplitterGraphicsOutputQueryMode (
|
||||||
//
|
//
|
||||||
Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
|
Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
*Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
GraphicsOutput = NULL;
|
||||||
if (*Info == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
if (Private->CurrentNumberOfGraphicsOutput == 1) {
|
||||||
|
//
|
||||||
|
// Find the only one GraphicsOutput.
|
||||||
|
//
|
||||||
|
for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {
|
||||||
|
GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;
|
||||||
|
if (GraphicsOutput != NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GraphicsOutput != NULL) {
|
||||||
|
//
|
||||||
|
// If only one physical GOP device exist, return its information.
|
||||||
|
//
|
||||||
|
Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) ModeNumber, SizeOfInfo, Info);
|
||||||
|
return Status;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// If 2 more phyiscal GOP device exist or GOP protocol does not exist,
|
||||||
|
// return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().
|
||||||
|
//
|
||||||
|
*Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
|
||||||
|
if (*Info == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
||||||
|
CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
*SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
|
|
||||||
|
|
||||||
CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -106,6 +133,7 @@ ConSplitterGraphicsOutputSetMode (
|
||||||
Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];
|
Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];
|
||||||
|
|
||||||
ReturnStatus = EFI_SUCCESS;
|
ReturnStatus = EFI_SUCCESS;
|
||||||
|
GraphicsOutput = NULL;
|
||||||
//
|
//
|
||||||
// return the worst status met
|
// return the worst status met
|
||||||
//
|
//
|
||||||
|
@ -150,14 +178,21 @@ ConSplitterGraphicsOutputSetMode (
|
||||||
|
|
||||||
This->Mode->Mode = ModeNumber;
|
This->Mode->Mode = ModeNumber;
|
||||||
|
|
||||||
CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo);
|
if ((Private->CurrentNumberOfGraphicsOutput == 1) && (GraphicsOutput != NULL)) {
|
||||||
|
//
|
||||||
//
|
// If only one physical GOP device exist, copy physical information to consplitter.
|
||||||
// Information is not enough here, so the following items remain unchanged:
|
//
|
||||||
// GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat
|
CopyMem (This->Mode->Info, GraphicsOutput->Mode->Info, GraphicsOutput->Mode->SizeOfInfo);
|
||||||
// GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize
|
This->Mode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo;
|
||||||
// These items will be initialized/updated when a new GOP device is added into ConsoleSplitter.
|
This->Mode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase;
|
||||||
//
|
This->Mode->FrameBufferSize = GraphicsOutput->Mode->FrameBufferSize;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// If 2 more phyiscal GOP device exist or GOP protocol does not exist,
|
||||||
|
// return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().
|
||||||
|
//
|
||||||
|
CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo);
|
||||||
|
}
|
||||||
|
|
||||||
return ReturnStatus;
|
return ReturnStatus;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue