# VESA BIOS Extension

VESA BIOS Extension (VBE) ist ein in den 1990er Jahren entwickelter Standard der Video Electronics Standards Association (VESA) für Grafikkarten in IBM-PC-kompatiblen Computern (PCs).
Er ist eine üblicherweise im Grafikkarten-BIOS implementierte Programmierschnittstelle (API), die den Programmen Interrupts zur Verfügung stellt, um damit Aktionen wie das Setzen oder Abfragen von Videomodi durchzuführen sowie weitere, von der Hardware unterstützte Funktionen (z. B. Synchronisation von 3D-Shutterbrillen), anzusprechen. So waren Programme und Spiele für DOS oft auf ein VBE angewiesen und funktionierten somit auf allen Systemen, die ein „VESA BIOS“ bereitstellten. Auf Grafikkarten ohne VBE im Grafik-BIOS kann unter DOS ein speicherresidenter Treiber geladen werden, der die Funktionen der Extension bereitstellt. Software die später erschien, setzt auf die schnelleren APIs von DirectX, OpenGL und deren Nachfolgern auf, die jedoch auf Betriebssystemebene implementiert sind.
Die VESA BIOS Extension ist nur für IBM-PC-kompatible Computer mit BIOS verfügbar. Auf dem BIOS-Nachfolger Extensible Firmware Interface (EFI) wurde VBE anfangs durch UGA (Universal Graphics Adapter) ersetzt, welches wiederum ab UEFI (Unified EFI ab Version 2) von GOP (Graphics Output Protocol) abgelöst wurde. Für die meisten Betriebssysteme erfüllen VBE, EFI-UGA und UEFI-GOP eine Fallback-Funktion, falls kein Grafiktreiber zur Verfügung steht. Bei (U)EFI wird UGA/GOP vor dem Betriebssystemstart von der Firmware selbst verwendet, um für ein angeschlossenes Display per DDC in einen geeigneten Grafikmodus zu schalten.

## Einsatzbereich

Primär war die VESA BIOS Extension für 16-Bit-Applikationen unter DOS gedacht. Die meisten MS-DOS-basierten PC-Spiele zwischen etwa 1993 und 1997 verwendeten die schnellen 16-Bit-Modi mit niedriger Auflösung wie etwa 320×200 oder 320×240, später 640×480. Der Framebuffer kann allerdings auch von 32-Bit-DPMI-Programmen verwendet werden. Mit der Einführung von VBE 2.0 war es möglich, Grafikmodi in 16-Bit-Farbtiefe (65.536 Farben) mit Auflösungen bis zu 1600×1200 Pixeln zu verwenden, ohne gezielt programminterne Unterscheidungen zur verwendeten Grafikhardware zu implementieren. Außerdem wurde mit VBE 2.0 ein linearer Framebufferzugriff aus dem Protected Mode ermöglicht, was zu einem deutlich beschleunigten Bildaufbau führte. Unter DOS gab es vorher keine standardisierte Schnittstelle für Grafik, die über den VGA-Standard hinausging.
Die aktuelle Version des Standards 3.0 ist abwärtskompatibel zur vorherigen Spezifikation 2.0. Die wesentliche Neuerung der Version 3.0 ist der Protected Mode Entry Point, der sowohl vom 16- als auch vom 32-Bit-Protected-Mode aus aufgerufen werden kann. Version 3.0 wird von Anwendungssoftware nur selten vorausgesetzt, da bereits mit VBE 2.0 alle wesentlichen Funktionen zur Verfügung stehen.
VBE wird auf Computern mit BIOS, und damit auch auf (U)EFI-Systemen im BIOS-kompatiblen Modus „CSM“ (für Compatibility Support Module), von den meisten modernen Grafikkarten unterstützt. Die VESA BIOS Extension ist dabei im Grafik-BIOS der Grafikkarte enthalten. Da bei Einführung der VESA BIOS Extension nicht alle Grafikkarten eine entsprechende Funktionalität implementiert hatten, gibt es universelle „VESA-Treiber“ – Zusatzprogramme wie beispielsweise UniVBE oder Scitech Display Doctor, aber auch hardwarespezifische Treiber der Grafikkartenhersteller selbst (etwa S3VBE Core 2.0 für S3-Grafikkarten oder TLIVESA für Grafikkarten von Tseng Labs) – die unter DOS speicherresident als TSR-Programm geladen werden und ein VBE-Grafik-BIOS nachrüsten. Mit manchen entsprechenden Zusatzprogrammen ist es auch möglich, zusätzliche Grafikmodi einzufügen bzw. vorhandene auszutauschen; das kann z. B. dann erforderlich sein, wenn die native Auflösung eines Monitors verwendet werden soll, diese jedoch in den voreingestellten Standard-Auflösungen im VBE-Grafik-BIOS fehlen. Dem gleichen Prinzip folgend wurden auf Laptops einige der VBE-Standard-Modi im Grafik-BIOS z. B. mit WXGA-Auflösungen überschrieben, wenn dies der nativen Display-Auslösung entspricht.
Von Anwendungssoftware für moderne Betriebssysteme wird VBE kaum noch verwendet, da diese die Hardware nicht mehr direkt ansprechen können – auf Desktop-Systemen wie Windows, macOS oder Linux werden von der Grafikkarte unabhängige APIs verwendet, die die entsprechende Funktionalität über herstellerspezifische Treiber mit definierten Schnittstellen umsetzen. Linearer Framebuffer Zugriff (LFB) ist unter Windows in einer Virtual DOS Machine mittels NTVDM nicht möglich, da dessen DPMI nur Vesa Modi ohne linearen Framebuffer Zugriff unterstützen. Einige Anwendungen ermöglichen daher die höheren VESA Modi per CLI Parameter nicht zu nutzen und zu VESA 1.2 zurückzufallen. In VESA 1.2 gibt es noch keinen Linearen Framebuffer Zugriff, sondern nur Bank Switching, was wiederum von NTVDM und dessen DPMI unterstützt wird.
Der Standard spielt heute noch unter Betriebssystemen eine Rolle, für die es keine spezielle Treiberunterstützung für einen bestimmten Grafikchipsatz gibt. Sind bspw. für Windows, Linux oder FreeBSD keine Grafikkartentreiber für bestimmte Grafikkarten verfügbar, so können nur durch Verwendung eines VESA-Treibers, der die hier beschriebene Funktionalität nutzt, Auflösungen von mehr als 640×480 Pixel bei mehr als 256 Farben verwendet werden.
Unter Windows wird im abgesicherten Modus vom VESA-Modus massiv Gebrauch gemacht, weil in diesem Modus in der Regel keine herstellerspezifischen 3rd-Party-Treiber geladen werden.
Der Standard deckt allerdings keine 2D- oder 3D-Beschleunigerfunktionen ab. Bei der Darstellung von 2D- oder 3D-Inhalten muss die CPU also alles in Software rendern.
VESA VBE 1.2 unterstützt virtuelles Scrolling und Double und Tripple Buffering in Hardware.

## Liste der Modi

| Modus (hexadezimal) | Auflösung (Pixel×Pixel) | Farbtiefe (Bit) | Text/Grafisch | VESA VBE Version |
| 0x100 | 0640×0400 | 08 | | 1.0 |
| 0x101 | 0640×0480 | 08 | | 1.0 |
| 0x102 | 0800×0600 | 04 | | 1.0 |
| 0x103 | 0800×0600 | 08 | | 1.0 |
| 0x104 | 1024×0768 | 04 | | 1.0 |
| 0x105 | 1024×0768 | 08 | | 1.0 |
| 0x106 | 1280×1024 | 04 | | 1.0 |
| 0x107 | 1280×1024 | 08 | | 1.0 |
| 0x108 | 0080×0060 | 04 | Text | 1.0 |
| 0x109 | 0132×0025 | 04 | Text | 1.0 |
| 0x10A | 0132×0043 | 04 | Text | 1.0 |
| 0x10B | 0132×0050 | 04 | Text | 1.0 |
| 0x10C | 0132×0060 | 04 | Text | 1.0 |
| 0x10D | 0320×0200 | 15 | | 1.2 |
| 0x10E | 0320×0200 | 16 | | 1.2 |
| 0x10F | 0320×0200 | 24 | | 1.2 |
| 0x110 | 0640×0480 | 15 | | 1.2 |
| 0x111 | 0640×0480 | 16 | | 1.2 |
| 0x112 | 0640×0480 | 24 | | 1.2 |
| 0x113 | 0800×0600 | 15 | | 1.2 |
| 0x114 | 0800×0600 | 16 | | 1.2 |
| 0x115 | 0800×0600 | 24 | | 1.2 |
| 0x116 | 1024×0768 | 15 | | 1.2 |
| 0x117 | 1024×0768 | 16 | | 1.2 |
| 0x118 | 1024×0768 | 24 | | 1.2 |
| 0x119 | 1280×1024 | 15 | | 1.2 |
| 0x11A | 1280×1024 | 16 | | 1.2 |
| 0x11B | 1280×1024 | 24 | | 1.2 |
| 0x11C | 1600×1200 | 08 | | ? |
| 0x11D | 1600×1200 | 15 | | ? |
| 0x11E | 1600×1200 | 16 | | ? |
| 0x11F | 1600×1200 | 24 | | ? |
| 0x120h | 1600x1200 | 8 | | 2.0 |
| 0x121h | 1600x1200 | 15 | | 2.0 |
| 0x122h | 1600x1200 | 16 | | 2.0 |
Mit $n$ Bit lassen sich $2^{n}$ verschiedene Farben darstellen. Da für die rote, grüne und blaue Komponente eines Pixels jeweils 8 Bit zur Verfügung stehen, sind somit $2^{8}\cdot 2^{8}\cdot 2^{8}=2^{24}=16.777.216$ verschiedenen Farben für ein Pixel möglich, auch True Color genannt (siehe dazu RGB-Farbraum). Bei einer Farbtiefe von 16 Bit sind 65.536 verschiedene Farben für ein Pixel möglich, was High Color genannt wird.