ReactOS 0.4.16-dev-2284-g3529151
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
23
24#define LOWEST_SUPPORTED_RES 1
25
26/* FUNCTIONS ******************************************************************/
27
28/* EFI 1.x */
29#ifdef EFI_UGA_DRAW_PROTOCOL_GUID
30
31/* NOTE: EFI UGA does not support any other format than 32-bit xRGB, and
32 * no direct access to the underlying hardware framebuffer is offered */
33C_ASSERT(sizeof(EFI_UGA_PIXEL) == sizeof(ULONG));
34
35#endif /* EFI */
36
37/* UEFI support, see efi/GraphicsOutput.h */
38#ifdef EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID // __GRAPHICS_OUTPUT_H__
39
41
46static EFI_PIXEL_BITMASK EfiPixelMasks[] =
47{ /* Red, Green, Blue, Reserved */
48 {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000}, // PixelRedGreenBlueReserved8BitPerColor
49 {0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000}, // PixelBlueGreenRedReserved8BitPerColor
50 {0, 0, 0, 0} // PixelBitMask, PixelBltOnly, ...
51};
52
53#endif /* UEFI */
54
57{
60
62 EFI_PIXEL_BITMASK* pPixelBitmask;
63 ULONG BitsPerPixel;
64
66 if (Status != EFI_SUCCESS)
67 {
68 TRACE("Failed to find GOP with status %d\n", Status);
69 return Status;
70 }
71
72 /* We don't need high resolutions for freeldr */
74
75 /* Physical format of the pixel */
77 switch (PixelFormat)
78 {
81 {
82 pPixelBitmask = &EfiPixelMasks[PixelFormat];
84 break;
85 }
86
87 case PixelBitMask:
88 {
89 /*
90 * When the GOP pixel format is given by PixelBitMask, the pixel
91 * element size _may be_ different from 4 bytes.
92 * See UEFI Spec Rev.2.10 Section 12.9 "Graphics Output Protocol":
93 * example code "GetPixelElementSize()" function.
94 */
95 pPixelBitmask = &gop->Mode->Info->PixelInformation;
96 BitsPerPixel =
97 PixelBitmasksToBpp(pPixelBitmask->RedMask,
98 pPixelBitmask->GreenMask,
99 pPixelBitmask->BlueMask,
100 pPixelBitmask->ReservedMask);
101 break;
102 }
103
104 case PixelBltOnly:
105 default:
106 {
107 ERR("Unsupported UEFI GOP format %lu\n", PixelFormat);
108 pPixelBitmask = NULL;
109 BitsPerPixel = 0;
110 break;
111 }
112 }
113
118 VramSize,
122 BitsPerPixel,
123 (PPIXEL_BITMASK)pPixelBitmask))
124 {
125 ERR("Couldn't initialize video framebuffer\n");
127 }
128 return Status;
129}
130
131VOID
133{
134 FbConsClearScreen(Attr);
135}
136
137VOID
138UefiVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
139{
140 FbConsPutChar(Ch, Attr, X, Y);
141}
142
143VOID
145{
147}
148
151{
152 /* We only have one mode, semi-text */
153 return VideoTextMode;
154}
155
156ULONG
158{
159 return FbConsGetBufferSize();
160}
161
162VOID
164{
166}
167
168VOID
170{
171 /* We don't have a cursor yet */
172}
173
174VOID
176{
177 /* We don't have a cursor yet */
178}
179
182{
183 return 0;
184}
185
186VOID
188 UCHAR Green, UCHAR Blue)
189{
190 /* Not supported */
191}
192
193VOID
195 UCHAR* Green, UCHAR* Blue)
196{
197 /* Not supported */
198}
EFI_GRAPHICS_PIXEL_FORMAT
@ PixelBitMask
@ PixelRedGreenBlueReserved8BitPerColor
@ PixelBlueGreenRedReserved8BitPerColor
@ PixelBltOnly
#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID
#define EFI_UNSUPPORTED
Definition: UefiBaseType.h:123
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:31
#define EFI_SUCCESS
Definition: UefiBaseType.h:120
unsigned char BOOLEAN
Definition: actypes.h:127
#define ERR(fmt,...)
Definition: precomp.h:57
#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)
#define ULONG_PTR
Definition: config.h:101
INT PixelFormat
Status
Definition: gdiplustypes.h:25
#define C_ASSERT(e)
Definition: intsafe.h:73
if(dx< 0)
Definition: linetemp.h:194
#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
ReactOS Framebuffer-specific video device configuration data.
Definition: framebuf.h:35
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:194
EFI_GUID EfiGraphicsOutputProtocol
Definition: uefivid.c:18
VIDEODISPLAYMODE UefiVideoSetDisplayMode(PCSTR DisplayMode, BOOLEAN Init)
Definition: uefivid.c:150
VOID UefiVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue)
Definition: uefivid.c:187
ULONG_PTR VramAddress
Definition: uefivid.c:20
VOID UefiVideoClearScreen(UCHAR Attr)
Definition: uefivid.c:132
VOID UefiVideoHideShowTextCursor(BOOLEAN Show)
Definition: uefivid.c:175
ULONG UefiVideoGetBufferSize(VOID)
Definition: uefivid.c:157
EFI_STATUS UefiInitializeVideo(VOID)
Definition: uefivid.c:56
VOID UefiVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth)
Definition: uefivid.c:144
VOID UefiVideoSetTextCursorPosition(UCHAR X, UCHAR Y)
Definition: uefivid.c:169
EFI_SYSTEM_TABLE * GlobalSystemTable
Definition: uefildr.c:16
#define LOWEST_SUPPORTED_RES
Definition: uefivid.c:24
PCM_FRAMEBUF_DEVICE_DATA FrameBufferData
Definition: uefivid.c:22
VOID UefiVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y)
Definition: uefivid.c:138
ULONG VramSize
Definition: uefivid.c:21
VOID UefiVideoCopyOffScreenBufferToVRAM(PVOID Buffer)
Definition: uefivid.c:163
EFI_HANDLE GlobalImageHandle
Definition: uefildr.c:15
BOOLEAN UefiVideoIsPaletteFixed(VOID)
Definition: uefivid.c:181
_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:413
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:462
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:481
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:445
VOID FbConsCopyOffScreenBufferToVRAM(_In_ PVOID Buffer)
Copies a full text-mode CGA-style character buffer rectangle to the console.
Definition: vidfb.c:492
BOOLEAN VidFbInitializeVideo(_Out_opt_ PCM_FRAMEBUF_DEVICE_DATA *pFbData, _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:99
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