Vulkan 1.4.362 ya está disponible y llega con dos extensiones de la API impulsadas por el equipo de gráficos de Linux de Valve. Más allá de las correcciones de errores habituales en este tipo de revisiones rutinarias, la novedad principal reside en dos mejoras que afectan directamente a la compatibilidad con el trazado de rayos de DirectX y a la traducción de Direct3D 12 en Linux.
La actualización se publicó hace unos días y, aunque a primera vista parece una revisión más del calendario habitual de Vulkan, incorpora dos extensiones que Valve ha desarrollado junto a otros fabricantes de hardware gráfico. Una de ellas, además, es una extensión de proveedor exclusiva de Valve, algo que no ocurre en todas las revisiones de la especificación.
Primera extensión de Valve incluida
La primera extensión, VK_KHR_pipeline_library_group_handles, permite consultar los identificadores de grupo directamente desde las bibliotecas de canalización, sin necesidad de pasos intermedios. Esta capacidad resulta determinante para mejorar la compatibilidad con la especificación DXR 1.1, el nivel 1.1 de trazado de rayos de DirectX Ray-Tracing.
En términos generales, ese tipo de biblioteca agrupa estados de renderizado ya compilados que la aplicación puede reutilizar sin necesidad de recompilarlos para cada nueva canalización gráfica. Cuantas más piezas puedan compartirse de este modo, menor es el tiempo de compilación en tiempo real, algo especialmente sensible en el trazado de rayos, donde el número de combinaciones posibles crece con rapidez.
Detrás de este desarrollo está Hans-Kristian Arntzen, del equipo de gráficos de Linux de Valve, que ha trabajado junto a ingenieros de AMD, Igalia, Intel y NVIDIA. La participación conjunta de estos cuatro fabricantes podría facilitar la adopción de la extensión tanto en controladores libres como en los propietarios de cada fabricante, aunque el calendario de integración en cada uno de ellos está por confirmar.
Así mejora la compatibilidad gráfica en Linux
La segunda extensión sí lleva el sello exclusivo de Valve. VK_VALVE_buffer_device_address_allocation_alignment es obra de Hans-Kristian Arntzen y Connor Abbott, y permite especificar la alineación de cualquier asignación de dirección de dispositivo de búfer, algo que hasta ahora la especificación vigente no contemplaba más allá del mínimo necesario para que la implementación cumpliera sus propios requisitos.
En términos generales, la dirección de dispositivo de búfer (buffer device address) es la función de Vulkan que permite a los shaders acceder directamente a la memoria de un búfer mediante un puntero, sin pasar por las tablas de descriptores tradicionales. Cuanto más control tenga el desarrollador sobre cómo se alinea esa dirección en memoria, más fácil resulta replicar el comportamiento que otra API, como Direct3D 12, espera encontrar.
El motivo de esta extensión está en la superposición de otras API sobre Vulkan, como es el caso de Direct3D 12. La propia especificación recoge que algunas aplicaciones dan por hecho que la dirección de búfer asignada tendrá una alineación mayor que la que ofrecería normalmente la implementación, y que pueden comportarse de forma inesperada si esa alineación resulta más ajustada de lo previsto. Esta nueva extensión da a los desarrolladores el control necesario para evitarlo, algo especialmente útil para VKD3D-Proton, la capa que Valve usa para traducir llamadas de Direct3D 12 a Vulkan.
Qué cambia para Proton y los juegos de Windows en Linux
Proton recurre precisamente a Vulkan para traducir sobre la marcha las instrucciones de DirectX cuando jugáis en Linux a un título pensado para Windows. Si la memoria no queda alineada tal y como el título original espera, la traducción podría acabar en caídas de rendimiento, comportamientos erráticos o cierres inesperados del juego, un problema conocido en cualquier capa de compatibilidad de este tipo.
La alineación de memoria no es un detalle menor en el desarrollo de motores gráficos: si una aplicación asume un valor concreto y la plataforma subyacente ofrece otro distinto, el motor podría terminar leyendo o escribiendo en una zona incorrecta, con resultados que van desde una pérdida de rendimiento hasta la corrupción de datos en el búfer. VK_VALVE_buffer_device_address_allocation_alignment busca dar a VKD3D-Proton un margen de maniobra similar al que ya tiene Direct3D 12 en Windows, acercando el comportamiento entre ambas plataformas.
Ambas extensiones forman ya parte de la especificación oficial: podéis consultar el texto completo de Vulkan 1.4.362, junto con el resto de correcciones incluidas en esta revisión, en Vulkan.org.
