ReactOS 0.4.16-dev-2104-gb84fa49
uefivid.c
Go to the documentation of this file.
1/*
2 * PROJECT: FreeLoader UEFI Support
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Video output
5 * COPYRIGHT: Copyright 2022 Justin Miller <justinmiller100@gmail.com>
6 */
7
8#include <uefildr.h>
9#include "../vidfb.h"
10
11#include <debug.h>
13
14/* GLOBALS ********************************************************************/
15
19
20#define LOWEST_SUPPORTED_RES 1
21
22/* FUNCTIONS ******************************************************************/
23
24/* EFI 1.x */
25#ifdef EFI_UGA_DRAW_PROTOCOL_GUID
26
27/* NOTE: EFI UGA does not support any other format than 32-bit xRGB, and
28 * no direct access to the underlying hardware framebuffer is offered */
29C_ASSERT(sizeof(EFI_UGA_PIXEL) == sizeof(ULONG));
30
31#endif /* EFI */
32
33/* UEFI support, see efi/GraphicsOutput.h */
34#ifdef EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID // __GRAPHICS_OUTPUT_H__
35
37
42static EFI_PIXEL_BITMASK EfiPixelMasks[] =
43{ /* Red, Green, Blue, Reserved */
44 {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000}, // PixelRedGreenBlueReserved8BitPerColor
45 {0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000}, // PixelBlueGreenRedReserved8BitPerColor
46 {0, 0, 0, 0} // PixelBitMask, PixelBltOnly, ...
47};
48
49#endif /* UEFI */
50
53{
55 EFI_PIXEL_BITMASK* pPixelBitmask;
56 ULONG BitsPerPixel;
57
60
62 if (Status != EFI_SUCCESS)
63 {
64 TRACE("Failed to find GOP with status %d\n", Status);
65 return Status;
66 }
67
68 /* We don't need high resolutions for freeldr */
70
71 /* Physical format of the pixel */
73 switch (PixelFormat)
74 {
77 {
78 pPixelBitmask = &EfiPixelMasks[PixelFormat];
80 break;
81 }
82
83 case PixelBitMask:
84 {
85 /*
86 * When the GOP pixel format is given by PixelBitMask, the pixel
87 * element size _may be_ different from 4 bytes.
88 * See UEFI Spec Rev.2.10 Section 12.9 "Graphics Output Protocol":
89 * example code "GetPixelElementSize()" function.
90 */
91 pPixelBitmask = &gop->Mode->Info->PixelInformation;
92 BitsPerPixel =
93 PixelBitmasksToBpp(pPixelBitmask->RedMask,
94 pPixelBitmask->GreenMask,
95 pPixelBitmask->BlueMask,
96 pPixelBitmask->ReservedMask);
97 break;
98 }
99
100 case PixelBltOnly:
101 default:
102 {
103 ERR("Unsupported UFEI GOP format %lu\n", PixelFormat);
104 pPixelBitmask = NULL;
105 BitsPerPixel = 0;
106 break;
107 }
108 }
109
111 gop->Mode->FrameBufferSize,
115 BitsPerPixel,
116 (PPIXEL_BITMASK)pPixelBitmask);
117 return Status;
118}
119
120VOID
122{
123 FbConsClearScreen(Attr);
124}
125
126VOID
127UefiVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
128{
129 FbConsPutChar(Ch, Attr, X, Y);
130}
131
132VOID
134{
136}
137
140{
141 /* We only have one mode, semi-text */
142 return VideoTextMode;
143}
144
145ULONG
147{
148 return FbConsGetBufferSize();
149}
150
151VOID
153{
155}
156
157VOID
159{
160 /* We don't have a cursor yet */
161}
162
163VOID
165{
166 /* We don't have a cursor yet */
167}
168
171{
172 return 0;
173}
174
175VOID
178{
179 /* Not supported */
180}
181
182VOID
185{
186 /* Not supported */
187}
EFI_GRAPHICS_PIXEL_FORMAT
@ PixelBitMask
@ PixelRedGreenBlueReserved8BitPerColor
@ PixelBlueGreenRedReserved8BitPerColor
@ PixelBltOnly
#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID
unsigned char BOOLEAN
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:31
#define EFI_SUCCESS
Definition: UefiBaseType.h:120
#define ERR(fmt,...)
Definition: precomp.h:57
@ Green
Definition: bl.h:199
@ Red
Definition: bl.h:201
@ Blue
Definition: bl.h:198
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
@ VideoTextMode
Definition: machine.h:35
enum tagVIDEODISPLAYMODE VIDEODISPLAYMODE
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
#define Y(I)
INT PixelFormat
Status
Definition: gdiplustypes.h:25
#define C_ASSERT(e)
Definition: intsafe.h:73
#define RTL_BITS_OF(sizeOfArg)
Definition: ntbasedef.h:680
static VIDEODISPLAYMODE DisplayMode
Definition: pcvideo.c:119
#define Ch(x, y, z)
Definition: sha2.c:141
#define TRACE(s)
Definition: solgame.cpp:4
EFI_LOCATE_PROTOCOL LocateProtocol
Definition: UefiSpec.h:1873
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat
EFI_PHYSICAL_ADDRESS FrameBufferBase
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * Info
EFI_BOOT_SERVICES * BootServices
Definition: UefiSpec.h:1959
Definition: ui.h:200
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE * Mode
EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode
Physical format of an RGB pixel, specified with per-component bit-masks. A bit being set defines thos...
Definition: vidfb.h:22
uint32_t * PULONG
Definition: typedefs.h:59
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
VOID UefiVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue)
Definition: uefivid.c:183
EFI_GUID EfiGraphicsOutputProtocol
Definition: uefivid.c:18
VIDEODISPLAYMODE UefiVideoSetDisplayMode(PCSTR DisplayMode, BOOLEAN Init)
Definition: uefivid.c:139
VOID UefiVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: uefivid.c:176
VOID UefiVideoClearScreen(UCHAR Attr)
Definition: uefivid.c:121
VOID UefiVideoHideShowTextCursor(BOOLEAN Show)
Definition: uefivid.c:164
ULONG UefiVideoGetBufferSize(VOID)
Definition: uefivid.c:146
EFI_STATUS UefiInitializeVideo(VOID)
Definition: uefivid.c:52
VOID UefiVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: uefivid.c:133
VOID UefiVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
Definition: uefivid.c:158
EFI_SYSTEM_TABLE * GlobalSystemTable
Definition: uefildr.c:16
#define LOWEST_SUPPORTED_RES
Definition: uefivid.c:20
VOID UefiVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: uefivid.c:127
VOID UefiVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: uefivid.c:152
EFI_HANDLE GlobalImageHandle
Definition: uefildr.c:15
BOOLEAN UefiVideoIsPaletteFixed(VOID)
Definition: uefivid.c:170
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
VOID FbConsClearScreen(_In_ UCHAR Attr)
Definition: vidfb.c:377
VOID FbConsGetDisplaySize(_Out_ PULONG Width, _Out_ PULONG Height, _Out_ PULONG Depth)
Returns the width and height in number of CGA characters/attributes, of a full text-mode CGA-style ch...
Definition: vidfb.c:426
ULONG FbConsGetBufferSize(VOID)
Returns the size in bytes, of a full text-mode CGA-style character buffer rectangle that can fill the...
Definition: vidfb.c:445
BOOLEAN VidFbInitializeVideo(_In_ ULONG_PTR BaseAddress, _In_ ULONG BufferSize, _In_ UINT32 ScreenWidth, _In_ UINT32 ScreenHeight, _In_ UINT32 PixelsPerScanLine, _In_ UINT32 BitsPerPixel, _In_opt_ PPIXEL_BITMASK PixelMasks)
Initializes internal framebuffer information based on the given parameters.
Definition: vidfb.c:97
VOID FbConsPutChar(_In_ UCHAR Char, _In_ UCHAR Attr, _In_ ULONG Column, _In_ ULONG Row)
Displays a character with specific text attributes at a given position.
Definition: vidfb.c:409
VOID FbConsCopyOffScreenBufferToVRAM(_In_ PVOID Buffer)
Copies a full text-mode CGA-style character buffer rectangle to the console.
Definition: vidfb.c:456
FORCEINLINE ULONG PixelBitmasksToBpp(_In_ ULONG RedMask, _In_ ULONG GreenMask, _In_ ULONG BlueMask, _In_ ULONG ReservedMask)
Calculates the number of bits per pixel ("PixelDepth") for the given pixel format,...
Definition: vidfb.h:41
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION _In_ ULONG _In_ SIZE_T _In_ ULONG _In_ USHORT Depth
Definition: exfuncs.h:819
unsigned char UCHAR
Definition: xmlstorage.h:181