# Mesa 3D

Mesa 3D es una biblioteca gráfica de código abierto, desarrollada inicialmente por Brian Paul en agosto de 1993, que proporciona una implementación genérica de OpenGL para renderizar gráficos tridimensionales en plataformas múltiples. Desde septiembre de 2012 Mesa ha recibido el visto bueno de Khronos como API compatible OpenGL.
Mesa es mantenido por freedesktop.org, que es también donde se hospedan los servidores gráficos X.org y Wayland, y varios controladores de gráficos de código abierto.
En los sistemas basados en Unix tales como los derivados de BSD, o las distribuciones de Linux, Mesa implementa una capa de traducción independiente del fabricante entre un API de gráficos como OpenGL y los controladores de gráficos en el núcleo del sistema operativo. Además de las aplicaciones 3D, como juegos, los servidores gráficos utilizan llamadas OpenGL/EGL para producir la imagen en pantalla, por lo tanto, todos los gráficos (en aquellas implementaciones que se apoyen en esta librería) suelen pasar por Mesa. Algunos controladores (típicamente los propietarios desarrollados por los fabricantes) proporcionan su propia implementación de los API gráficos en lugar de usar Mesa.

## Arquitectura de software

Mesa está disponible y puede ser compilado en prácticamente cualquier plataforma moderna y es distribuido bajo la Licencia MIT. Al no ser una implementación oficial de OpenGL por razones de licencia, los desarrolladores de Mesa han trabajado para mantener el API en línea con los más recientes estándares y pruebas conformadas de OpenGL.
Mientras Mesa soporta varios tipos de aceleradores gráficos por hardware, también puede ser compilado como un renderizador solamente de software. Al ser de código abierto, es posible usarlo para estudiar el comportamiento interno de un render compatible con OpenGL.

### Implementación de API's gráficas

Históricamente, la principal API que Mesa implementa es OpenGL, junto a otras relacionadas del grupo Khronos (como OpenVG, OpenGL ES o recientemente EGL), pero Mesa puede implementar otras API's y de hecho lo hace con otras como Glide (en desuso) y Direct3D.
La versión soportada de las diferentes API's gráficas depende del controlador, porque cada uno tiene su propia implementación y por lo tanto su propia versión soportada. Esto ocurre especialmente cuando el controlador no está desarrollado con Gallium3D (dónde los controladores comparten código que tiende a homogeneizar la versión soportada).

#### OpenGL

Mesa 10.x soporta oficialmente OpenGL 3.3 con hardware gráfico Intel, AMD y Nvidia. Mesa 11.0 soporta OpenGL 4.1 en algunos controladores. Existe una tabla en la página oficial de Mesa con la versión soportada por cada uno de los controladores.
Hay que tener en cuenta que debido a la arquitectura modular de Mesa, hay extensiones de versiones recientes de OpenGL que también están implementadas, pero al no estar todas las que conforman la versión completa, dichas versiones no se consideran todavía soportadas.

#### Vulkan

El Grupo Khronos anunció el API Vulkan en marzo de 2015, y Vulkan 1.0 fue lanzado oficialmente el 16 de febrero de 2016.
Vulkan rompe la compatibilidad con OpenGL y abandona totalmente el concepto de una máquina de estados monolítica gigante. Los desarrolladores de Gallium3D dicen que Vulkan viene a ser Gallium3D 2.0 (Gallium3D separa la implementación de la máquina de estados de OpenGL del código propio de cada controlador gráfico).
Al mismo tiempo que Gallium3D recibe como entrada TGSI (Tungsten Graphics Shader Infrastructure), Vulkan recibe SPIR-V (Standard Portable Intermediate Representation - Vulkan), ambos lenguajes de representación intermedia de Shaders.
Intel lanzó su implementación del controlador Vulkan el mismo día que la especificación fue oficialmente lanzada, pero no fue hasta abril del mismo año cuando se introdujo en la rama principal del desarrollo de Mesa, por lo que la primera versión estable en soportarlo fue Mesa 12.0 en junio de 2016. Ya que el desarrollo del controlador i965 de Intel no fue desarrollado siguiendo las especificaciones de la arquitectura Gallium3D, tiene aún menos sentido seguirlas en el caso del controlador de Vulkan.
AMD lanzó su controlador propietario en marzo de 2016. En diciembre de 2017 se liberó el código de este controlador bajo el paraguas de su iniciativa GPUOpen, bajo el nombre AMDVLK. En paralelo y de manera no oficial se desarrolla el controlador RADV, desarrollado por David Airlie (mantenedor del subsistema DRM y desarrollador de Red Hat) y Bas Nieuwenhuizen, para dar soporte Vulkan, que fue incluido en Mesa en octubre de 2016 y publicado en versión estable a partir de Mesa 13.0. Actualmente, el desempeño de ambos controladores es similar en la mayoría de benchmarks, pero la comunidad ofrece soporte mayoritario a RADV por usar componentes más estandarizados (AMDVLK, al contrario que RADV, no está incluido en Mesa, tiene su propia infraestructura y usa una versión modificada de LLVM).
Por su parte, Nvidia lanzó su controlador propietario con soporte Vulkan en el día de lanzamiento, al igual que Imagination Technologies (PowerVR), Qualcomm (Adreno) y ARM (Mali) para Android y otros sistemas operativos. Pero cuándo, o si algún día llegarán a ser libres estos controladores es incierto.

### Gallium3D

Gallium3D es un framework que tiene como objetivo facilitar el desarrollo de controladores gráficos. Los controladores gráficos más representativos que se han desarrollado con este framework son los AMD Radeon R300g (R300, R400 y R500), R600g (R600, R700, HD 5000 y HD 6000) y RadeonSI (AMD Radeon HD 7000 series / GCN y posteriores), los controladores Nouveau NV50 (GeForce 8, GeForce 9, GeForce 100, GeForce 200 y GeForce 300) y NVC0 (GeForce 400 y GeForce 500), y algunos otros como Freedreno.
Comparado con la forma tradicional del desarrollo de controladores gráficos, Gallium3D tiene las siguientes ventajas:
* Hace los controladores más simples y pequeños: los actuales controladores son muy complejos, contienen mucho código duplicado y su programación está estrechamente ligada a la API de OpenGL 1.x / 2.x
* Modelado para hardware moderno: la nueva arquitectura de controlador es una abstracción de hardware en lugar de un simple traductor de hardware OpenGL.
* Soporte de múltiples API's gráficas: no está atado a un API gráfico específico.
* Soporte de múltiples sistemas operativos.
Gallium3D consta de un conjunto de interfaces y una colección de bibliotecas destinadas a facilitar la programación de los controladores gráficos, y separa el controlador en 3 partes:
* Gallium3D State Tracker: implementación propia de cada API gráfica. Esto permite unificar código entre los distintos controladores. Parte fundamental del controlador contenida en Mesa.
* Controlador gráfico Gallium3D: código específico propio de cada hardware gráfico, y se alimenta de código en lenguaje TGSI o NIR, ambos lenguajes de representación intermedia de shaders. Este código es traducido desde GLSL (lenguaje propio de OpenGL) y luego traducido en el juego de instrucciones de la GPU.
* Gallium3D WinSys: es propio del sistema operativo y se encuentra en el núcleo, ejecutándose típicamente en modo protegido e implementa el API de llamadas al sistema en todos los controladores gráficos.
El desarrollo de Gallium3D comenzó en 2008 en Tungsten Graphics y la implementación está disponible como software libre siendo parte de Mesa 3D desde 2009.