X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FConsole%2FConSplitterDxe%2FConSplitterGraphics.c;h=ab1d2ddc4dc4a6e935a91059132516e57ab2b532;hb=HEAD;hp=89cef729e9b455d6630e2f4c1107e1bd7a88da42;hpb=9de33db48b8e24aa8fa446a6e6983b4e40126fe5;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c index 89cef729e9..64ad567a6d 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c @@ -1,22 +1,15 @@ /** @file Support for Graphics output spliter. - -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. +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "ConSplitter.h" - -CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL }; +CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL }; /** Returns information for an available graphics mode that the graphics device @@ -44,8 +37,11 @@ ConSplitterGraphicsOutputQueryMode ( ) { 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; } @@ -54,19 +50,43 @@ ConSplitterGraphicsOutputQueryMode ( // Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This); - *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); - if (*Info == NULL) { - return EFI_OUT_OF_RESOURCES; + GraphicsOutput = NULL; + + 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; + } + } } - *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + 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; + } - CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo); + *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo); + } return EFI_SUCCESS; } - /** Set the video device into the specified mode and clears the visible portions of the output display to black. @@ -83,51 +103,57 @@ ConSplitterGraphicsOutputQueryMode ( EFI_STATUS EFIAPI ConSplitterGraphicsOutputSetMode ( - IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This, - IN UINT32 ModeNumber + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, + IN UINT32 ModeNumber ) { - EFI_STATUS Status; - TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS ReturnStatus; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - UINTN NumberIndex; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_STATUS Status; + TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; + UINTN Index; + EFI_STATUS ReturnStatus; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_GRAPHICS_OUTPUT_PROTOCOL *PhysicalGraphicsOutput; + UINTN NumberIndex; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; if (ModeNumber >= This->Mode->MaxMode) { return EFI_UNSUPPORTED; } Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This); - Mode = &Private->GraphicsOutputModeBuffer[ModeNumber]; + Mode = &Private->GraphicsOutputModeBuffer[ModeNumber]; - ReturnStatus = EFI_SUCCESS; + ReturnStatus = EFI_SUCCESS; + GraphicsOutput = NULL; + PhysicalGraphicsOutput = NULL; // // return the worst status met // for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) { GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; if (GraphicsOutput != NULL) { + PhysicalGraphicsOutput = GraphicsOutput; // // Find corresponding ModeNumber of this GraphicsOutput instance // - for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) { - Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info); + for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32)NumberIndex, &SizeOfInfo, &Info); if (EFI_ERROR (Status)) { return Status; } + if ((Info->HorizontalResolution == Mode->HorizontalResolution) && (Info->VerticalResolution == Mode->VerticalResolution)) { FreePool (Info); break; } + FreePool (Info); } - Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex); + Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32)NumberIndex); if (EFI_ERROR (Status)) { ReturnStatus = Status; } @@ -150,20 +176,25 @@ ConSplitterGraphicsOutputSetMode ( This->Mode->Mode = ModeNumber; - CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo); - - // - // Information is not enough here, so the following items remain unchanged: - // GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat - // GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize - // These items will be initialized/updated when a new GOP device is added into ConsoleSplitter. - // + if ((Private->CurrentNumberOfGraphicsOutput == 1) && (PhysicalGraphicsOutput != NULL)) { + // + // If only one physical GOP device exist, copy physical information to consplitter. + // + CopyMem (This->Mode->Info, PhysicalGraphicsOutput->Mode->Info, PhysicalGraphicsOutput->Mode->SizeOfInfo); + This->Mode->SizeOfInfo = PhysicalGraphicsOutput->Mode->SizeOfInfo; + This->Mode->FrameBufferBase = PhysicalGraphicsOutput->Mode->FrameBufferBase; + This->Mode->FrameBufferSize = PhysicalGraphicsOutput->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; } - - /** The following table defines actions for BltOperations. @@ -206,23 +237,23 @@ ConSplitterGraphicsOutputSetMode ( @retval EFI_SUCCESS The Blt operation completed. @retval EFI_INVALID_PARAMETER BltOperation is not valid. - @retval EFI_DEVICE_ERROR A hardware error occured writting to the video + @retval EFI_DEVICE_ERROR A hardware error occurred writting to the video buffer. **/ EFI_STATUS EFIAPI ConSplitterGraphicsOutputBlt ( - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, - 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 OPTIONAL + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, + 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 OPTIONAL ) { EFI_STATUS Status; @@ -232,10 +263,10 @@ ConSplitterGraphicsOutputBlt ( EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_UGA_DRAW_PROTOCOL *UgaDraw; - if (This == NULL || ((UINTN) BltOperation) >= EfiGraphicsOutputBltOperationMax) { + if ((This == NULL) || (((UINTN)BltOperation) >= EfiGraphicsOutputBltOperationMax)) { return EFI_INVALID_PARAMETER; } - + Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This); ReturnStatus = EFI_SUCCESS; @@ -247,17 +278,17 @@ ConSplitterGraphicsOutputBlt ( GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; if (GraphicsOutput != NULL) { Status = GraphicsOutput->Blt ( - GraphicsOutput, - BltBuffer, - BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); + GraphicsOutput, + BltBuffer, + BltOperation, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); if (EFI_ERROR (Status)) { ReturnStatus = Status; } else if (BltOperation == EfiBltVideoToBltBuffer) { @@ -269,19 +300,19 @@ ConSplitterGraphicsOutputBlt ( } UgaDraw = Private->TextOutList[Index].UgaDraw; - if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) { + if ((UgaDraw != NULL) && FeaturePcdGet (PcdUgaConsumeSupport)) { Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *) BltBuffer, - (EFI_UGA_BLT_OPERATION) BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); + UgaDraw, + (EFI_UGA_PIXEL *)BltBuffer, + (EFI_UGA_BLT_OPERATION)BltOperation, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); if (EFI_ERROR (Status)) { ReturnStatus = Status; } else if (BltOperation == EfiBltVideoToBltBuffer) { @@ -313,11 +344,11 @@ ConSplitterGraphicsOutputBlt ( EFI_STATUS EFIAPI ConSplitterUgaDrawGetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - OUT UINT32 *HorizontalResolution, - OUT UINT32 *VerticalResolution, - OUT UINT32 *ColorDepth, - OUT UINT32 *RefreshRate + IN EFI_UGA_DRAW_PROTOCOL *This, + OUT UINT32 *HorizontalResolution, + OUT UINT32 *VerticalResolution, + OUT UINT32 *ColorDepth, + OUT UINT32 *RefreshRate ) { TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; @@ -325,13 +356,15 @@ ConSplitterUgaDrawGetMode ( if ((HorizontalResolution == NULL) || (VerticalResolution == NULL) || (RefreshRate == NULL) || - (ColorDepth == NULL)) { + (ColorDepth == NULL)) + { return EFI_INVALID_PARAMETER; } + // // retrieve private data // - Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); + Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); *HorizontalResolution = Private->UgaHorizontalResolution; *VerticalResolution = Private->UgaVerticalResolution; @@ -341,7 +374,6 @@ ConSplitterUgaDrawGetMode ( return EFI_SUCCESS; } - /** Set the current video mode information. @@ -359,22 +391,22 @@ ConSplitterUgaDrawGetMode ( EFI_STATUS EFIAPI ConSplitterUgaDrawSetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 ColorDepth, - IN UINT32 RefreshRate + IN EFI_UGA_DRAW_PROTOCOL *This, + IN UINT32 HorizontalResolution, + IN UINT32 VerticalResolution, + IN UINT32 ColorDepth, + IN UINT32 RefreshRate ) { - EFI_STATUS Status; - TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS ReturnStatus; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - UINTN NumberIndex; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_STATUS Status; + TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; + UINTN Index; + EFI_STATUS ReturnStatus; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + UINTN NumberIndex; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); @@ -383,47 +415,48 @@ ConSplitterUgaDrawSetMode ( // // Update the Mode data // - Private->UgaHorizontalResolution = HorizontalResolution; - Private->UgaVerticalResolution = VerticalResolution; - Private->UgaColorDepth = ColorDepth; - Private->UgaRefreshRate = RefreshRate; + Private->UgaHorizontalResolution = HorizontalResolution; + Private->UgaVerticalResolution = VerticalResolution; + Private->UgaColorDepth = ColorDepth; + Private->UgaRefreshRate = RefreshRate; // // return the worst status met // for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) { - GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; if (GraphicsOutput != NULL) { // // Find corresponding ModeNumber of this GraphicsOutput instance // - for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) { - Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info); + for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32)NumberIndex, &SizeOfInfo, &Info); if (EFI_ERROR (Status)) { return Status; } + if ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution == VerticalResolution)) { FreePool (Info); break; } + FreePool (Info); } - Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex); + Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32)NumberIndex); if (EFI_ERROR (Status)) { ReturnStatus = Status; } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)){ + } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { UgaDraw = Private->TextOutList[Index].UgaDraw; if (UgaDraw != NULL) { Status = UgaDraw->SetMode ( - UgaDraw, - HorizontalResolution, - VerticalResolution, - ColorDepth, - RefreshRate - ); + UgaDraw, + HorizontalResolution, + VerticalResolution, + ColorDepth, + RefreshRate + ); if (EFI_ERROR (Status)) { ReturnStatus = Status; } @@ -434,7 +467,6 @@ ConSplitterUgaDrawSetMode ( return ReturnStatus; } - /** Blt a rectangle of pixels on the graphics screen. @@ -481,22 +513,22 @@ ConSplitterUgaDrawSetMode ( @retval EFI_SUCCESS The Blt operation completed. @retval EFI_INVALID_PARAMETER BltOperation is not valid. - @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer. + @retval EFI_DEVICE_ERROR A hardware error occurred writting to the video buffer. **/ EFI_STATUS EFIAPI ConSplitterUgaDrawBlt ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN EFI_UGA_PIXEL *BltBuffer, OPTIONAL - IN EFI_UGA_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta OPTIONAL + IN EFI_UGA_DRAW_PROTOCOL *This, + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, + IN EFI_UGA_BLT_OPERATION BltOperation, + IN UINTN SourceX, + IN UINTN SourceY, + IN UINTN DestinationX, + IN UINTN DestinationY, + IN UINTN Width, + IN UINTN Height, + IN UINTN Delta OPTIONAL ) { EFI_STATUS Status; @@ -515,17 +547,17 @@ ConSplitterUgaDrawBlt ( GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; if (GraphicsOutput != NULL) { Status = GraphicsOutput->Blt ( - GraphicsOutput, - (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltBuffer, - (EFI_GRAPHICS_OUTPUT_BLT_OPERATION) BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); + GraphicsOutput, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)BltBuffer, + (EFI_GRAPHICS_OUTPUT_BLT_OPERATION)BltOperation, + SourceX, + SourceY, + DestinationX, + DestinationY, + Width, + Height, + Delta + ); if (EFI_ERROR (Status)) { ReturnStatus = Status; } else if (BltOperation == EfiUgaVideoToBltBuffer) { @@ -536,7 +568,7 @@ ConSplitterUgaDrawBlt ( } } - if (Private->TextOutList[Index].UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) { + if ((Private->TextOutList[Index].UgaDraw != NULL) && FeaturePcdGet (PcdUgaConsumeSupport)) { Status = Private->TextOutList[Index].UgaDraw->Blt ( Private->TextOutList[Index].UgaDraw, BltBuffer, @@ -581,7 +613,7 @@ TextOutSetMode ( // been checked in ConSplitterTextOutSetCursorPosition. And (0, 0) should // always be supported. // - Private->TextOutMode.Mode = (INT32) ModeNumber; + Private->TextOutMode.Mode = (INT32)ModeNumber; Private->TextOutMode.CursorColumn = 0; Private->TextOutMode.CursorRow = 0; Private->TextOutMode.CursorVisible = TRUE;