]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c
IntelSiliconPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitterGraphics.c
CommitLineData
fb0b259e 1/** @file\r
9937b365 2 Support for Graphics output spliter.\r
d1102dba
LG
3\r
4Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
95276127 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
a4d608d1 13\r
fb0b259e 14**/\r
95276127 15\r
95276127 16#include "ConSplitter.h"\r
17\r
95276127 18\r
fe1e36e5 19CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
a4d608d1 20\r
a4d608d1 21/**\r
2da292f6 22 Returns information for an available graphics mode that the graphics device\r
23 and the set of active video output devices supports.\r
a4d608d1 24\r
2da292f6 25 @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
26 @param ModeNumber The mode number to return information on.\r
27 @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.\r
28 @param Info A pointer to callee allocated buffer that returns information about ModeNumber.\r
a4d608d1 29\r
2da292f6 30 @retval EFI_SUCCESS Mode information returned.\r
31 @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.\r
32 @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.\r
2da292f6 33 @retval EFI_INVALID_PARAMETER One of the input args was NULL.\r
34 @retval EFI_OUT_OF_RESOURCES No resource available.\r
a4d608d1 35\r
36**/\r
95276127 37EFI_STATUS\r
38EFIAPI\r
d6e11f22 39ConSplitterGraphicsOutputQueryMode (\r
95276127 40 IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
41 IN UINT32 ModeNumber,\r
42 OUT UINTN *SizeOfInfo,\r
43 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info\r
44 )\r
95276127 45{\r
46 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
2fa996f9 47 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
48 EFI_STATUS Status;\r
49 UINTN Index;\r
95276127 50\r
51 if (This == NULL || Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
52 return EFI_INVALID_PARAMETER;\r
53 }\r
54\r
55 //\r
56 // retrieve private data\r
57 //\r
58 Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
59\r
2fa996f9 60 GraphicsOutput = NULL;\r
d1102dba 61\r
2fa996f9 62 if (Private->CurrentNumberOfGraphicsOutput == 1) {\r
63 //\r
64 // Find the only one GraphicsOutput.\r
65 //\r
66 for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
67 GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
68 if (GraphicsOutput != NULL) {\r
69 break;\r
70 }\r
71 }\r
72 }\r
d1102dba 73\r
2fa996f9 74 if (GraphicsOutput != NULL) {\r
75 //\r
76 // If only one physical GOP device exist, return its information.\r
77 //\r
78 Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) ModeNumber, SizeOfInfo, Info);\r
79 return Status;\r
80 } else {\r
81 //\r
d1102dba 82 // If 2 more phyiscal GOP device exist or GOP protocol does not exist,\r
2fa996f9 83 // return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().\r
84 //\r
85 *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
86 if (*Info == NULL) {\r
87 return EFI_OUT_OF_RESOURCES;\r
88 }\r
89 *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
90 CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);\r
95276127 91 }\r
95276127 92\r
93 return EFI_SUCCESS;\r
94}\r
95\r
a4d608d1 96\r
97/**\r
ed055f1b 98 Set the video device into the specified mode and clears the visible portions of\r
2da292f6 99 the output display to black.\r
a4d608d1 100\r
2da292f6 101 @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
102 @param ModeNumber Abstraction that defines the current video mode.\r
a4d608d1 103\r
2da292f6 104 @retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.\r
105 @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.\r
106 @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.\r
107 @retval EFI_OUT_OF_RESOURCES No resource available.\r
a4d608d1 108\r
109**/\r
95276127 110EFI_STATUS\r
111EFIAPI\r
d6e11f22 112ConSplitterGraphicsOutputSetMode (\r
95276127 113 IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This,\r
114 IN UINT32 ModeNumber\r
115 )\r
95276127 116{\r
117 EFI_STATUS Status;\r
118 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
119 UINTN Index;\r
120 EFI_STATUS ReturnStatus;\r
aec072ad 121 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode;\r
95276127 122 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
8d4e1bd9 123 EFI_GRAPHICS_OUTPUT_PROTOCOL *PhysicalGraphicsOutput;\r
95276127 124 UINTN NumberIndex;\r
125 UINTN SizeOfInfo;\r
126 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
127 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
128\r
129 if (ModeNumber >= This->Mode->MaxMode) {\r
130 return EFI_UNSUPPORTED;\r
131 }\r
132\r
95276127 133 Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
95276127 134 Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];\r
95276127 135\r
9937b365 136 ReturnStatus = EFI_SUCCESS;\r
2fa996f9 137 GraphicsOutput = NULL;\r
8d4e1bd9 138 PhysicalGraphicsOutput = NULL;\r
95276127 139 //\r
140 // return the worst status met\r
141 //\r
142 for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
143 GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
144 if (GraphicsOutput != NULL) {\r
8d4e1bd9 145 PhysicalGraphicsOutput = GraphicsOutput;\r
95276127 146 //\r
147 // Find corresponding ModeNumber of this GraphicsOutput instance\r
148 //\r
149 for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) {\r
150 Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);\r
151 if (EFI_ERROR (Status)) {\r
152 return Status;\r
153 }\r
154 if ((Info->HorizontalResolution == Mode->HorizontalResolution) && (Info->VerticalResolution == Mode->VerticalResolution)) {\r
155 FreePool (Info);\r
156 break;\r
157 }\r
158 FreePool (Info);\r
159 }\r
160\r
161 Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex);\r
162 if (EFI_ERROR (Status)) {\r
163 ReturnStatus = Status;\r
164 }\r
2da292f6 165 } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
d0c64728 166 UgaDraw = Private->TextOutList[Index].UgaDraw;\r
167 if (UgaDraw != NULL) {\r
168 Status = UgaDraw->SetMode (\r
169 UgaDraw,\r
170 Mode->HorizontalResolution,\r
171 Mode->VerticalResolution,\r
172 32,\r
173 60\r
174 );\r
175 if (EFI_ERROR (Status)) {\r
176 ReturnStatus = Status;\r
177 }\r
95276127 178 }\r
179 }\r
180 }\r
181\r
182 This->Mode->Mode = ModeNumber;\r
183\r
8d4e1bd9 184 if ((Private->CurrentNumberOfGraphicsOutput == 1) && (PhysicalGraphicsOutput != NULL)) {\r
2fa996f9 185 //\r
186 // If only one physical GOP device exist, copy physical information to consplitter.\r
187 //\r
8d4e1bd9 188 CopyMem (This->Mode->Info, PhysicalGraphicsOutput->Mode->Info, PhysicalGraphicsOutput->Mode->SizeOfInfo);\r
189 This->Mode->SizeOfInfo = PhysicalGraphicsOutput->Mode->SizeOfInfo;\r
190 This->Mode->FrameBufferBase = PhysicalGraphicsOutput->Mode->FrameBufferBase;\r
191 This->Mode->FrameBufferSize = PhysicalGraphicsOutput->Mode->FrameBufferSize;\r
2fa996f9 192 } else {\r
193 //\r
d1102dba 194 // If 2 more phyiscal GOP device exist or GOP protocol does not exist,\r
2fa996f9 195 // return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().\r
196 //\r
197 CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo);\r
198 }\r
95276127 199\r
95276127 200 return ReturnStatus;\r
201}\r
202\r
95276127 203\r
a4d608d1 204\r
205/**\r
206 The following table defines actions for BltOperations.\r
207\r
208 EfiBltVideoFill - Write data from the BltBuffer pixel (SourceX, SourceY)\r
209 directly to every pixel of the video display rectangle\r
210 (DestinationX, DestinationY)\r
211 (DestinationX + Width, DestinationY + Height).\r
212 Only one pixel will be used from the BltBuffer. Delta is NOT used.\r
213 EfiBltVideoToBltBuffer - Read data from the video display rectangle\r
214 (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in\r
215 the BltBuffer rectangle (DestinationX, DestinationY )\r
216 (DestinationX + Width, DestinationY + Height). If DestinationX or\r
217 DestinationY is not zero then Delta must be set to the length in bytes\r
218 of a row in the BltBuffer.\r
219 EfiBltBufferToVideo - Write data from the BltBuffer rectangle\r
220 (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the\r
221 video display rectangle (DestinationX, DestinationY)\r
222 (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is\r
223 not zero then Delta must be set to the length in bytes of a row in the\r
224 BltBuffer.\r
225 EfiBltVideoToVideo - Copy from the video display rectangle\r
226 (SourceX, SourceY) (SourceX + Width, SourceY + Height) .\r
227 to the video display rectangle (DestinationX, DestinationY)\r
228 (DestinationX + Width, DestinationY + Height).\r
229 The BltBuffer and Delta are not used in this mode.\r
230\r
231 @param This Protocol instance pointer.\r
232 @param BltBuffer Buffer containing data to blit into video buffer.\r
233 This buffer has a size of\r
234 Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
235 @param BltOperation Operation to perform on BlitBuffer and video\r
236 memory\r
237 @param SourceX X coordinate of source for the BltBuffer.\r
238 @param SourceY Y coordinate of source for the BltBuffer.\r
239 @param DestinationX X coordinate of destination for the BltBuffer.\r
240 @param DestinationY Y coordinate of destination for the BltBuffer.\r
241 @param Width Width of rectangle in BltBuffer in pixels.\r
ed055f1b 242 @param Height Hight of rectangle in BltBuffer in pixels.\r
33019a71 243 @param Delta OPTIONAL.\r
a4d608d1 244\r
245 @retval EFI_SUCCESS The Blt operation completed.\r
246 @retval EFI_INVALID_PARAMETER BltOperation is not valid.\r
247 @retval EFI_DEVICE_ERROR A hardware error occured writting to the video\r
248 buffer.\r
249\r
250**/\r
95276127 251EFI_STATUS\r
252EFIAPI\r
d6e11f22 253ConSplitterGraphicsOutputBlt (\r
95276127 254 IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
255 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL\r
256 IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,\r
257 IN UINTN SourceX,\r
258 IN UINTN SourceY,\r
259 IN UINTN DestinationX,\r
260 IN UINTN DestinationY,\r
261 IN UINTN Width,\r
262 IN UINTN Height,\r
263 IN UINTN Delta OPTIONAL\r
264 )\r
95276127 265{\r
266 EFI_STATUS Status;\r
7389f649 267 EFI_STATUS ReturnStatus;\r
95276127 268 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
269 UINTN Index;\r
95276127 270 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
271 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
272\r
97c74782 273 if (This == NULL || ((UINTN) BltOperation) >= EfiGraphicsOutputBltOperationMax) {\r
274 return EFI_INVALID_PARAMETER;\r
275 }\r
d1102dba 276\r
95276127 277 Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
278\r
7389f649 279 ReturnStatus = EFI_SUCCESS;\r
280\r
95276127 281 //\r
282 // return the worst status met\r
283 //\r
284 for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
285 GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
286 if (GraphicsOutput != NULL) {\r
287 Status = GraphicsOutput->Blt (\r
288 GraphicsOutput,\r
289 BltBuffer,\r
290 BltOperation,\r
291 SourceX,\r
292 SourceY,\r
293 DestinationX,\r
294 DestinationY,\r
295 Width,\r
296 Height,\r
297 Delta\r
298 );\r
299 if (EFI_ERROR (Status)) {\r
300 ReturnStatus = Status;\r
301 } else if (BltOperation == EfiBltVideoToBltBuffer) {\r
302 //\r
303 // Only need to read the data into buffer one time\r
304 //\r
305 return EFI_SUCCESS;\r
306 }\r
307 }\r
308\r
309 UgaDraw = Private->TextOutList[Index].UgaDraw;\r
8541adab 310 if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
95276127 311 Status = UgaDraw->Blt (\r
312 UgaDraw,\r
313 (EFI_UGA_PIXEL *) BltBuffer,\r
314 (EFI_UGA_BLT_OPERATION) BltOperation,\r
315 SourceX,\r
316 SourceY,\r
317 DestinationX,\r
318 DestinationY,\r
319 Width,\r
320 Height,\r
321 Delta\r
322 );\r
323 if (EFI_ERROR (Status)) {\r
324 ReturnStatus = Status;\r
325 } else if (BltOperation == EfiBltVideoToBltBuffer) {\r
326 //\r
327 // Only need to read the data into buffer one time\r
328 //\r
329 return EFI_SUCCESS;\r
330 }\r
331 }\r
332 }\r
333\r
334 return ReturnStatus;\r
335}\r
336\r
a4d608d1 337/**\r
338 Return the current video mode information.\r
339\r
2da292f6 340 @param This The EFI_UGA_DRAW_PROTOCOL instance.\r
341 @param HorizontalResolution The size of video screen in pixels in the X dimension.\r
342 @param VerticalResolution The size of video screen in pixels in the Y dimension.\r
343 @param ColorDepth Number of bits per pixel, currently defined to be 32.\r
344 @param RefreshRate The refresh rate of the monitor in Hertz.\r
a4d608d1 345\r
2da292f6 346 @retval EFI_SUCCESS Mode information returned.\r
347 @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()\r
348 @retval EFI_INVALID_PARAMETER One of the input args was NULL.\r
a4d608d1 349\r
350**/\r
d0c64728 351EFI_STATUS\r
352EFIAPI\r
d6e11f22 353ConSplitterUgaDrawGetMode (\r
d0c64728 354 IN EFI_UGA_DRAW_PROTOCOL *This,\r
355 OUT UINT32 *HorizontalResolution,\r
356 OUT UINT32 *VerticalResolution,\r
357 OUT UINT32 *ColorDepth,\r
358 OUT UINT32 *RefreshRate\r
359 )\r
d0c64728 360{\r
361 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
362\r
a4d608d1 363 if ((HorizontalResolution == NULL) ||\r
2da292f6 364 (VerticalResolution == NULL) ||\r
365 (RefreshRate == NULL) ||\r
366 (ColorDepth == NULL)) {\r
d0c64728 367 return EFI_INVALID_PARAMETER;\r
368 }\r
369 //\r
370 // retrieve private data\r
371 //\r
372 Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
373\r
374 *HorizontalResolution = Private->UgaHorizontalResolution;\r
375 *VerticalResolution = Private->UgaVerticalResolution;\r
376 *ColorDepth = Private->UgaColorDepth;\r
377 *RefreshRate = Private->UgaRefreshRate;\r
378\r
379 return EFI_SUCCESS;\r
380}\r
381\r
a4d608d1 382\r
383/**\r
2da292f6 384 Set the current video mode information.\r
a4d608d1 385\r
2da292f6 386 @param This The EFI_UGA_DRAW_PROTOCOL instance.\r
387 @param HorizontalResolution The size of video screen in pixels in the X dimension.\r
388 @param VerticalResolution The size of video screen in pixels in the Y dimension.\r
389 @param ColorDepth Number of bits per pixel, currently defined to be 32.\r
390 @param RefreshRate The refresh rate of the monitor in Hertz.\r
a4d608d1 391\r
2da292f6 392 @retval EFI_SUCCESS Mode information returned.\r
393 @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()\r
394 @retval EFI_OUT_OF_RESOURCES Out of resources.\r
a4d608d1 395\r
396**/\r
d0c64728 397EFI_STATUS\r
398EFIAPI\r
d6e11f22 399ConSplitterUgaDrawSetMode (\r
d0c64728 400 IN EFI_UGA_DRAW_PROTOCOL *This,\r
401 IN UINT32 HorizontalResolution,\r
402 IN UINT32 VerticalResolution,\r
403 IN UINT32 ColorDepth,\r
404 IN UINT32 RefreshRate\r
405 )\r
d0c64728 406{\r
407 EFI_STATUS Status;\r
408 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
409 UINTN Index;\r
410 EFI_STATUS ReturnStatus;\r
d0c64728 411 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
412 UINTN NumberIndex;\r
413 UINTN SizeOfInfo;\r
414 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
415 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
416\r
417 Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
418\r
d0c64728 419 ReturnStatus = EFI_SUCCESS;\r
420\r
d0c64728 421 //\r
422 // Update the Mode data\r
423 //\r
424 Private->UgaHorizontalResolution = HorizontalResolution;\r
425 Private->UgaVerticalResolution = VerticalResolution;\r
426 Private->UgaColorDepth = ColorDepth;\r
427 Private->UgaRefreshRate = RefreshRate;\r
428\r
d0c64728 429 //\r
430 // return the worst status met\r
431 //\r
432 for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
8541adab 433\r
2da292f6 434 GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
435 if (GraphicsOutput != NULL) {\r
436 //\r
437 // Find corresponding ModeNumber of this GraphicsOutput instance\r
438 //\r
439 for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) {\r
440 Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);\r
8541adab 441 if (EFI_ERROR (Status)) {\r
2da292f6 442 return Status;\r
8541adab 443 }\r
2da292f6 444 if ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution == VerticalResolution)) {\r
d0c64728 445 FreePool (Info);\r
2da292f6 446 break;\r
d0c64728 447 }\r
2da292f6 448 FreePool (Info);\r
449 }\r
d0c64728 450\r
2da292f6 451 Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex);\r
452 if (EFI_ERROR (Status)) {\r
453 ReturnStatus = Status;\r
454 }\r
455 } else if (FeaturePcdGet (PcdUgaConsumeSupport)){\r
456 UgaDraw = Private->TextOutList[Index].UgaDraw;\r
457 if (UgaDraw != NULL) {\r
458 Status = UgaDraw->SetMode (\r
459 UgaDraw,\r
460 HorizontalResolution,\r
461 VerticalResolution,\r
462 ColorDepth,\r
463 RefreshRate\r
464 );\r
d0c64728 465 if (EFI_ERROR (Status)) {\r
466 ReturnStatus = Status;\r
467 }\r
468 }\r
ed055f1b 469 }\r
d0c64728 470 }\r
471\r
472 return ReturnStatus;\r
473}\r
474\r
d0c64728 475\r
a4d608d1 476/**\r
2da292f6 477 Blt a rectangle of pixels on the graphics screen.\r
a4d608d1 478\r
2da292f6 479 The following table defines actions for BltOperations.\r
a4d608d1 480\r
2da292f6 481 EfiUgaVideoFill:\r
482 Write data from the BltBuffer pixel (SourceX, SourceY)\r
483 directly to every pixel of the video display rectangle\r
484 (DestinationX, DestinationY)\r
485 (DestinationX + Width, DestinationY + Height).\r
486 Only one pixel will be used from the BltBuffer. Delta is NOT used.\r
ed055f1b 487 EfiUgaVideoToBltBuffer:\r
2da292f6 488 Read data from the video display rectangle\r
489 (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in\r
490 the BltBuffer rectangle (DestinationX, DestinationY )\r
491 (DestinationX + Width, DestinationY + Height). If DestinationX or\r
492 DestinationY is not zero then Delta must be set to the length in bytes\r
493 of a row in the BltBuffer.\r
494 EfiUgaBltBufferToVideo:\r
495 Write data from the BltBuffer rectangle\r
496 (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the\r
497 video display rectangle (DestinationX, DestinationY)\r
498 (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is\r
499 not zero then Delta must be set to the length in bytes of a row in the\r
500 BltBuffer.\r
501 EfiUgaVideoToVideo:\r
502 Copy from the video display rectangle\r
503 (SourceX, SourceY) (SourceX + Width, SourceY + Height) .\r
504 to the video display rectangle (DestinationX, DestinationY)\r
505 (DestinationX + Width, DestinationY + Height).\r
506 The BltBuffer and Delta are not used in this mode.\r
507\r
508 @param This Protocol instance pointer.\r
509 @param BltBuffer Buffer containing data to blit into video buffer. This\r
510 buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL)\r
511 @param BltOperation Operation to perform on BlitBuffer and video memory\r
512 @param SourceX X coordinate of source for the BltBuffer.\r
513 @param SourceY Y coordinate of source for the BltBuffer.\r
514 @param DestinationX X coordinate of destination for the BltBuffer.\r
515 @param DestinationY Y coordinate of destination for the BltBuffer.\r
516 @param Width Width of rectangle in BltBuffer in pixels.\r
517 @param Height Hight of rectangle in BltBuffer in pixels.\r
518 @param Delta OPTIONAL\r
519\r
520 @retval EFI_SUCCESS The Blt operation completed.\r
521 @retval EFI_INVALID_PARAMETER BltOperation is not valid.\r
522 @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.\r
a4d608d1 523\r
524**/\r
d0c64728 525EFI_STATUS\r
526EFIAPI\r
d6e11f22 527ConSplitterUgaDrawBlt (\r
d0c64728 528 IN EFI_UGA_DRAW_PROTOCOL *This,\r
529 IN EFI_UGA_PIXEL *BltBuffer, OPTIONAL\r
530 IN EFI_UGA_BLT_OPERATION BltOperation,\r
531 IN UINTN SourceX,\r
532 IN UINTN SourceY,\r
533 IN UINTN DestinationX,\r
534 IN UINTN DestinationY,\r
535 IN UINTN Width,\r
536 IN UINTN Height,\r
537 IN UINTN Delta OPTIONAL\r
538 )\r
d0c64728 539{\r
540 EFI_STATUS Status;\r
541 TEXT_OUT_SPLITTER_PRIVATE_DATA *Private;\r
542 UINTN Index;\r
543 EFI_STATUS ReturnStatus;\r
544 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
545\r
546 Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
547\r
9937b365 548 ReturnStatus = EFI_SUCCESS;\r
d0c64728 549 //\r
550 // return the worst status met\r
551 //\r
552 for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
553 GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
554 if (GraphicsOutput != NULL) {\r
555 Status = GraphicsOutput->Blt (\r
556 GraphicsOutput,\r
557 (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltBuffer,\r
558 (EFI_GRAPHICS_OUTPUT_BLT_OPERATION) BltOperation,\r
559 SourceX,\r
560 SourceY,\r
561 DestinationX,\r
562 DestinationY,\r
563 Width,\r
564 Height,\r
565 Delta\r
566 );\r
567 if (EFI_ERROR (Status)) {\r
568 ReturnStatus = Status;\r
815119f3 569 } else if (BltOperation == EfiUgaVideoToBltBuffer) {\r
d0c64728 570 //\r
571 // Only need to read the data into buffer one time\r
572 //\r
573 return EFI_SUCCESS;\r
574 }\r
575 }\r
576\r
8541adab 577 if (Private->TextOutList[Index].UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
d0c64728 578 Status = Private->TextOutList[Index].UgaDraw->Blt (\r
579 Private->TextOutList[Index].UgaDraw,\r
580 BltBuffer,\r
581 BltOperation,\r
582 SourceX,\r
583 SourceY,\r
584 DestinationX,\r
585 DestinationY,\r
586 Width,\r
587 Height,\r
588 Delta\r
589 );\r
590 if (EFI_ERROR (Status)) {\r
591 ReturnStatus = Status;\r
592 } else if (BltOperation == EfiUgaVideoToBltBuffer) {\r
593 //\r
594 // Only need to read the data into buffer one time\r
595 //\r
596 return EFI_SUCCESS;\r
597 }\r
598 }\r
599 }\r
600\r
601 return ReturnStatus;\r
602}\r
603\r
a4d608d1 604/**\r
605 Sets the output device(s) to a specified mode.\r
606\r
2da292f6 607 @param Private Text Out Splitter pointer.\r
a4d608d1 608 @param ModeNumber The mode number to set.\r
609\r
a4d608d1 610**/\r
9937b365 611VOID\r
612TextOutSetMode (\r
95276127 613 IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private,\r
614 IN UINTN ModeNumber\r
615 )\r
95276127 616{\r
617 //\r
618 // No need to do extra check here as whether (Column, Row) is valid has\r
619 // been checked in ConSplitterTextOutSetCursorPosition. And (0, 0) should\r
620 // always be supported.\r
621 //\r
9937b365 622 Private->TextOutMode.Mode = (INT32) ModeNumber;\r
623 Private->TextOutMode.CursorColumn = 0;\r
624 Private->TextOutMode.CursorRow = 0;\r
625 Private->TextOutMode.CursorVisible = TRUE;\r
a4d608d1 626\r
9937b365 627 return;\r
95276127 628}\r