GOP: Difference between revisions

Jump to navigation Jump to search
90 bytes added ,  29 days ago
m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
m (link to EDK2 driver's writer guide has moved from gitbooks to github pages)
m (Bot: Replace deprecated source tag with syntaxhighlight)
Line 8:
=== Detecting GOP ===
As with other UEFI protocols, you have to locate a structure with the function pointers first using the protocol's GUID.
<sourcesyntaxhighlight lang="c">
EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
Line 15:
if(EFI_ERROR(status))
PrintLn(L"Unable to locate GOP");
</syntaxhighlight>
</source>
GOP is the default protocol, so you should be able to locate it on all UEFI firmware. It can probably only fail if you're on an old EFI (pre-UEFI) machine, like an Itanium-based computer or a Mac released before 2009.
 
=== Get the Current Mode ===
In order to get the mode code for the current video mode, you must set the mode as well to circumvent some buggy UEFI firmware. Otherwise this is done using the QueryMode function, and then gop->Mode->Mode will contain the code.
<sourcesyntaxhighlight lang="c">
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
UINTN SizeOfInfo, numModes, nativeMode;
Line 34:
numModes = gop->Mode->MaxMode;
}
</syntaxhighlight>
</source>
 
=== Query Available Video Modes ===
Line 53:
=== Set Video Mode and Get the Framebuffer ===
This is pretty easy. The mode argument is between 0 and numModes.
<sourcesyntaxhighlight lang="c">
status = uefi_call_wrapper(gop->SetMode, 2, gop, mode);
if(EFI_ERROR(status)) {
Line 67:
);
}
</syntaxhighlight>
</source>
To get the same value as scanline in VESA (also commonly called pitch in many graphics libraries), you have to multiply PixelsPerScanLine by the number of bytes per pixel. That can be detected by examining the gop->Mode->Info->PixelFormat field. For example with 32 bit packed pixel formats,
<sourcesyntaxhighlight lang="c">
pitch = 4 * gop->Mode->Info->PixelsPerScanLine;
</syntaxhighlight>
</source>
 
=== Plotting Pixels ===
Line 77:
Now you can use the returned framebuffer exactly the same way as you would with VESA, there's absolutely no difference.
To calculate the offset for an (X,Y) coordinate on screen, do pitch*Y+pixelbytes*X. For example for 32 bit true-color (where pixelbytes is 4):
<sourcesyntaxhighlight lang="c">
static inline void PlotPixel_32bpp(int x, int y, uint32_t pixel)
{
*((uint32_t*)(gop->Mode->FrameBufferBase + 4 * gop->Mode->Info->PixelsPerScanLine * y + 4 * x)) = pixel;
}
</syntaxhighlight>
</source>
For drawing characters, you can use the same method described in [[VGA Fonts]].
 
Cookies help us deliver our services. By using our services, you agree to our use of cookies.

Navigation menu