Linux Adictos Pablinux  

D7VK 1.4 amplía la compatibilidad de juegos Direct3D 5, 6 y 7 sobre Vulkan, corrigiendo errores gráficos clave como la color key transparency

D7VK 1.4

Si juegas en Linux y te va la arqueología de los videojuegos, el nombre D7VK 1.4 seguramente te empiece a sonar cada vez más. Esta pequeña gran capa de traducción se ha convertido en una pieza clave para disfrutar de títulos clásicos basados en Direct3D 5, 6 y 7 a través de Vulkan, normalmente usando Wine o Proton como base. Además, llega en un contexto en el que DXVK también fue evolucionando en su propia versión 1.4, reforzando todo el ecosistema de traducción DirectX → Vulkan.

En las siguientes líneas vamos a repasar las novedades más importantes de D7VK 1.4, cómo encaja dentro del ecosistema DXVK/Wine, qué aporta a nivel de compatibilidad y rendimiento con juegos antiguos, qué limitaciones tiene y cómo puedes empezar a usarlo en tu sistema Linux (e incluso en Windows, aunque sea un uso secundario). También veremos de pasada las claves de DXVK 1.4, porque muchas ideas y conceptos son compartidos y se complementan.

¿Qué es exactamente D7VK y qué problema resuelve?

D7VK es una capa de traducción basada en Vulkan pensada para ejecutar aplicaciones y juegos 3D antiguos que utilizan Direct3D 7, 6 y 5 sobre Linux mediante Wine. En lugar de implementar desde cero todo el stack de Direct3D y DirectDraw, D7VK se apoya en el backend de D3D9 de DXVK y en la implementación de DDraw de Wine (o incluso en la nativa de Windows) para actuar como un proxy minimalista entre ambos mundos.

De forma simplificada, podríamos decir que D7VK hace de “intérprete” entre los viejos juegos Direct3D 5/6/7 y DXVK, que a su vez traduce todo a Vulkan. De esta forma, muchos títulos clásicos pueden aprovechar las ventajas de Vulkan (menor sobrecarga, mejor uso de la CPU, mejor gestión de recursos) sin que sus desarrolladores tengan que tocar una sola línea de código.

Es importante entender que el objetivo central de D7VK es ofrecer compatibilidad decente para D3D7, añadiendo soporte “experimental” para D3D6 y D3D5, precisamente porque cuanto más atrás se retrocede en la historia de DirectX, más “malditas” se vuelven las APIs y más raras son sus interacciones con DDraw y GDI.

Arquitectura y alcance de D7VK

La arquitectura de D7VK se basa en un enfoque muy pragmático: se apoya en DXVK (sobre todo en el backend de D3D9) y en el DDraw de Wine para construir una capa fina que implemente lo justo y necesario de D3D7/6/5. En lugar de reescribir DirectDraw y todas las APIs anteriores a D3D8, integra lo mínimo indispensable para que los juegos puedan comunicarse correctamente con DXVK.

Esto significa que no se pretende cubrir todos los recovecos más oscuros de DDraw, especialmente en lo referente a aplicaciones que mezclan sin pudor D3D con GDI o con distintas versiones de DirectX. En esos casos, el propio autor de D7VK recomienda sin tapujos tirar de WineD3D, que aunque sea algo menos eficiente en rendimiento, implementa prácticamente todo y gestiona mucho mejor esas interacciones “malditas”.

Al apoyarse en DXVK para D3D9, todas las opciones de configuración de DXVK para D3D9 resultan aplicables a D7VK, incluyendo parámetros como límites de FPS, control del VSync, HUD con estadísticas de rendimiento o ajustes de comportamiento internos. D7VK hereda así buena parte de la madurez y rendimiento que DXVK ha ido ganando a lo largo de los años.

Novedades más destacadas de D7VK 1.4

La versión 1.4 de D7VK introduce una serie de mejoras clave orientadas a la compatibilidad con juegos concretos y a pulir pequeños detalles del comportamiento gráfico. No hay un cambio radical de arquitectura, pero sí un conjunto de avances que, sumados, hacen que bastantes títulos “problemáticos” pasen a ser plenamente jugables.

Soporte de color key transparency

Una de las grandes estrellas de D7VK 1.4 es la implementación del soporte para color key transparency, una técnica muy usada en los inicios de Direct3D como alternativa barata al alpha testing. En lugar de canales alfa, se usaba un color específico para marcar píxeles transparentes, lo que con traducciones incompletas acababa generando bloques de color opacos donde debería haber transparencia.

Gracias al trabajo de la comunidad, especialmente de @CkNoSFeRaTU, ahora D7VK es capaz de manejar correctamente ese tipo de transparencia por color clave. Esto soluciona los artefactos de color sólido que aparecían en títulos como Arx Fatalis, Messiah, Darkstone, Divine Divinity, Mortal Kombat 4 y un buen puñado de juegos más que tiraron de este truco gráfico en su momento.

Mejor interoperabilidad con DDraw y juegos “cabezones”

Otro frente donde se ha avanzado bastante es en la consolidación de la interoperabilidad entre DDraw y las distintas versiones soportadas de D3D. Los antiguos APIs de DirectDraw y Direct3D se entremezclaban de formas muy poco ortodoxas, y muchas veces los juegos hacían cosas que, desde la perspectiva actual, no tienen ningún sentido.

En D7VK 1.4 se ha dedicado bastante trabajo a unificar y robustecer la forma en que se gestionan esas interacciones entre DDraw y D3D7/6/5, lo que se traduce en que juegos como Plants vs Zombies y otros títulos de PopCap de la misma época hayan pasado de ser inestables o injugables a funcionar correctamente.

También gracias a contribuciones de la comunidad se han corregido bugs relacionados con la instanciación de DDraw vía IClassFactory, fallo que impedía el funcionamiento de juegos como Re-Volt y Sea Dogs. Ahora estos títulos entran en la categoría de jugables, lo que amplía aún más la biblioteca de clásicos que pueden ejecutarse sobre D7VK sin dramas.

Mejoras de profundidad, limpieza y correcciones para juegos concretos

Aprovechando pistas aportadas por colaboradores como @Trass3r, en D7VK 1.4 se ha añadido soporte para clears de profundidad iniciados desde DDraw. Esta característica, que puede sonar bastante específica, es clave para que algunos juegos gestionen correctamente su buffer de profundidad y no muestren glitches de z-fighting o elementos mal dibujados.

Además, se ha incorporado un soporte preliminar para la escritura de profundidad de vuelta (depth write-back), por ahora centrado en el formato D16. Esta mejora se ha traducido en la corrección de problemas de oclusión de fuentes de luz en juegos como Star Wars Episode I: Racer, donde antes las luces se comportaban de forma irreal o directamente no se ocultaban cuando correspondía.

El changelog de D7VK 1.4 también recoge la corrección de un cuelgue en el arranque de V-Rally 2 Expert Edition, así como un buen número de fixes de “casos esquina” que podían provocar cierres, congelaciones o comportamientos extraños en títulos antiguos de D3D o DDraw. Entre los beneficiados se mencionan Revenant, Powerslide o Slave Zero, además de un workaround específico para un posible cuelgue al volver al menú principal en GTA 2.

Instalación básica y uso de D7VK

Poner en marcha D7VK en un prefijo de Wine es relativamente sencillo: basta con copiar el archivo ddraw.dll junto al ejecutable del juego o aplicación y luego configurar los overrides apropiados en Wine para que use esa DLL de forma prioritaria.

En concreto, en winecfg hay que añadir un override “native, builtin” para la biblioteca ddraw en la pestaña de Libraries, asegurándote de indicar exactamente ese orden. No es necesario preocuparse por la arquitectura, ya que DDraw y sus compañeros de D3D antiguos siempre fueron exclusivamente de 32 bits.

También existe una vía alternativa de despliegue necesaria para ciertos juegos especiales como GTA 2, StarLancer o Midtown Madness 2. En ese caso, hay que renombrar el ddraw.dll de sistema de Wine a ddraw_.dll y copiar el ddraw.dll de D7VK al directorio system32 o syswow64 dentro del prefijo, según su bitness. D7VK intentará primero cargar ddraw_.dll desde el path actual antes de recurrir al ddraw.dll del sistema, permitiendo así coexistir ambas piezas.

En Windows también es posible usar D7VK, aunque no es la plataforma principal para la que se desarrolla ni se prueba. En ese caso basta con copiar ddraw.dll junto al ejecutable del juego, pero se desaconseja totalmente colocarlo en directorios de sistema de Windows, ya que se requiere una implementación real de DDraw y se podrían provocar daños serios en la instalación.

DXVK 1.4: contexto y sinergias con D7VK

La historia de D7VK está fuertemente ligada a la evolución del propio proyecto DXVK, que es la gran columna vertebral de la traducción Direct3D → Vulkan para juegos más modernos (especialmente Direct3D 10 y 11). La versión 1.4 de DXVK supuso un salto relevante que afectó también a cómo se integran capas como D7VK o D8VK.

DXVK 1.4 actualizó la interfaz de Direct3D 11 hasta la versión 11.4 incluida en Windows 10 (build 1903), lo que permitió resolver problemas concretos con juegos como Plants vs Zombies – Battle for Neighbourville. Las nuevas APIs introducidas en D3D11.4 se implementan parcialmente, centrándose solo en aquellas características que tienen sentido sobre la funcionalidad de Vulkan existente.

También se actualizó la interfaz DXGI a la versión 1.5, incluyendo la posibilidad de comprobar soporte HDR (aunque sin salida HDR nativa todavía). Además, se añadieron métodos de interacción DXGI-GDI que, entre otras cosas, facilitaron el arranque de clientes como Rockstar Game Launcher, siempre que se acompañen de correcciones específicas en Direct2D dentro de Wine.

Rendimiento y mejoras internas de DXVK 1.4

En el plano del rendimiento, DXVK 1.4 trajo varias optimizaciones interesantes que afectan a muchos juegos Direct3D 11, mejorando la fluidez y reduciendo la carga de CPU. Una de las más destacadas es la activación por defecto de la opción d3d11.allowMapFlagNoWait, que incrementa el rendimiento en determinados títulos al permitir un manejo más eficiente de ciertos recursos mapeados.

Se solucionaron también los problemas que impedían lanzar correctamente The Witcher 3, ajustando el comportamiento de sincronización para acercarlo al del controlador D3D11 original. Además, se abordaron posibles cuellos de botella en juegos que hacen un uso intensivo de contextos diferidos, como Dark Souls III y Sekiro: Shadows Die Twice.

DXVK 1.4 mejoró de forma notable el seguimiento interno de recursos, reduciendo ligeramente el consumo de CPU al gestionar buffers, texturas y otros elementos gráficos. Todo este trabajo interno, aunque no siempre visible de cara al usuario, siembra el terreno para una integración aún más limpia con capas como D7VK, que necesitan un backend D3D9/D3D11 lo más sólido posible.

Instalación práctica de DXVK 1.4 sobre Wine

Para quienes quieran usar DXVK directamente sobre Wine, el flujo típico consiste en descargar el paquete estable de DXVK, extraerlo y ejecutar su script de instalación sobre el prefijo de Wine deseado. Por ejemplo, con la versión 1.4 se puede hacer algo así:

Primero se descarga el archivo con una herramienta como wget desde el enlace oficial de GitHub:

wget https://github.com/doitsujin/dxvk/releases/download/v1.4/dxvk-1.4.tar.gz

Luego se descomprime el paquete con tar y se accede a la carpeta descomprimida:

tar -xzvf dxvk-1.4.tar.gz
cd dxvk-1.4

Por último, se ejecuta el script de instalación contra el prefijo activo de Wine mediante un simple sh setup-dxvk.sh install con privilegios adecuados:

sudo sh setup-dxvk.sh install

El script también permite usar la implementación DXGI de Wine en lugar de la de DXVK si se desea utilizar vkd3d para juegos Direct3D 12 y DXVK para Direct3D 11. Para ello se puede ejecutar:

setup-dxvk.sh install --without-dxgi

Otra opción práctica que ofrece el script es instalar las DLL como enlaces simbólicos (mediante la opción --symlink), lo que facilita mucho la actualización simultánea de múltiples prefijos de Wine: basta con actualizar una única copia central de DXVK.

Mirando el conjunto, D7VK 1.4 y DXVK 1.4 refuerzan un ecosistema en el que Linux y Wine se consolidan como una plataforma muy seria para jugar tanto a clásicos de Direct3D 5/6/7 como a títulos modernos de D3D10/11, ofreciendo un rendimiento muchas veces sorprendentemente cercano a Windows y, sobre todo, una compatibilidad cada vez más amplia con APIs históricas que parecían condenadas al olvido.

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.