… aprovechando el tema de multi núcleos del procesador lo que pueden crecer APIs como Directx 12 o Vulkan en el futuro ahora que 6, 8, 12 o incluso 16 nucleos es algo normal y al alcance de casi todo el mundo. No es normal por ejemplo que hoy en día se siga usando Directx 11 y que la mayoría de los motores de videojuegos no estén optimizados o construidos desde el principio para aprovechar todos los núcleos que ofrece el procesador.

Imagino que parte de culpa aquí será de los desarrolladores y de Microsoft para que DirectX 12 no se haya hecho tan popular como. Directx 11. Pero creo que Intel en este tema tiene mucha parte de culpa por los juegos mono núcleo.

Bueno, en realidad DX12 no es más que una versión mejorada de DX11 aunque Microsoft lo llame con el nombre de una versión nueva porque no realiza cambios en el pipeline gráfico:

  • DX10 añadió respecto a DX9 la etapa del Geometry Shader y la teselación por función fija.
  • DX11 «reemplazo» la teselación por el Hull Shader y el Domain Shader
  • ¿DX12? Nada, no ha añadido nada.

A nivel de API lo que hizo DirectX 11 fue la posibilidad de varias listas de comandos desde la CPU con tal de repartir ese trabajo entre los diferentes núcleos y aligerar la sobrecarga. Es simple división del trabajo, si tienes 4 núcleos entonces puedes hacer en teoría que 4 hagan el trabajo en el 25% de uno.

Pero internamente las primeras GPUs DX11 continuaban tratando esas listas de comandos como una sola. La primera GPU DX de AMD que salio en el mercado fue la R800 aka Evergreen, aka HD 5xx0.

Fijaos que tiene un solo procesador de comandos sin que nada lo acompañe, pues bien, AMD cuando lanzo GCN por primera vez añadio una serie de unidades llamadas ACE… (Asynchonous Compute Engine) que se encargan de procesar listas de comandos que funcionan en parelelo y son independiente de la lista principal para renderizar la escena. ¿Que significaba? Pues que tareas simples de computación realizadas por los Compute Shaders solo se podían ejecutar con anterioridad dentro de los huecos del pipeline gráfico y por tanto dentro de la misma lista. Si la GPU tenía una parada de repente se paraba la lista entera, con el hecho de trasladar a las listas de computación ciertas tareas entonces estas se podían solventar mucho antes.

Cuando fue lanzada la arquitectura GCN, ninguna API soportaba esto… Por lo que AMD decidió lanzar la suya propia llamada Mantle, ahora esta API esta muerta pero ha generado dos hijos que son Vulkan por un lado y DirectX12 por otro. En realidad DX12 no es más que un hack de DX11 aplicando las mejoras de Mantle sobre este. Incluso la API GNM utilizada por Sony en PS4 es una derivada de Mantle.

El resto de mejoras sobre DX12 que se han ido haciendo podrían haber terminado en DX11 sin problemas realmente, pero la computación asincrona que es la capacidad de que la GPU pueda trabajar con diferentes listas de comandos requiere que los juegos se ajusten más a nivel del hardware porque la búsqueda es no depender tanto de lo drivers para ciertas tareas. ¿El problema? Son los drivers los que permiten que lenguas francas como el DirectX por ejemplo funcionen con cualquier tipo de arquitectura de GPU aunque sean dispares, el hecho de tener que acceder a bajo nivel a una arquitectura en concreto no solamente significa perjudicar a un fabricante sobre otro sino hacer que los juegos funcionen mejor con una arquitectura concreta y volvamos a tiempos pretéritos. Es decir, es una idea genial para sistemas cerrados como son las consolas de videojuegos pero en PC…

Curiosamente DirectX 12 en PC nace de «portar» el DX11.X de Xbox One, la cual ha ido rebautizada como DX12 también en Xbox. ¿En que consiste? Pues en aplicar las mejoras para aprovechar mejor el hardware único de Xbox One como es la capacidad de la computación asincrona, como es un ecosistema cerrado no pasa nada que se haga eso.

Dado que al mismo tiempo esto conlleva que tenga que existir una compatibilidad en el PC pues tenemos que existen dos DX12 distintos en el mercado.

¿Por qué es esto? Pues por el hecho que hay elementos del DX12 de Xbox One que rompen la compatibilidad con todo tipo de tarjetas y Microsoft los ha de conservar. El DX 11.X de Xbox One estaba directamente mapeado y 1:1 con el procesador de comandos gráficos modificado que Microsoft hizo junto para AMD para Xbox One, el cual es una extensión de la ISA Sea Islands. De ahí a que AMD de cara a la siguiente generación (RDNA) haya tenido que rescatar dicha ISA y expandirla para ponerla al día, por motivos de compatibilidad. Las APIs de alto nivel no envian instrucciones que pueda entender la GPU sino que tienen un interpete que las traduce, esto conlleva tiempo, las de bajo nivel hablan un idioma o un dialecto directo y no necesitan el controlador, pero pierden compatibilidad.

Dicho de otra forma, como dice la diapositiva de arriba, DX11.X no es DX12… Pero Microsoft por marketing lo bautizo como DX12 y porque el DX12 de PC se basa en el DX11.X… Es más, cuando Microsoft lanzo Xbox One al mercado dejaron ir claramente que iban a portar o al menos portar elementos del D3D de Xbox One. Y como todos sabemo así fue.

Una vez realizada la introducción, la respuesta es simple… DX12 requiere que el desarrollador se haga cargo de elementos de los que antes se hacía cargo el controlador. Si tu juego rinde bien y es lo suficientemente bueno no vas a perder tiempo en calentarte la cabeza en que el motor del juego controle elemento que el controlador ya controla lo suficientemente bien. Muchos estudios no tienen conocimiento ni capacidad para modificar y crear un motor gráfico porque gente así es muy rara de conseguir. Los Sweeney, Carmack… Son una rareza increíble realmente, no son la norma y la mayoria de estudios prefieren ir hacía lo que sea suficientemente bueno para realizar su trabajo.

La pregunta en realidad se resuelve con otra pregunta… ¿Por qué C# acabo por desplazar a C++ en desarrollo en muchos estudios? Pensadlo y veréis que es exactamente el mismo tiempo… ¿Cuanto tiempo de trabajo me cuesta resolver un problema concreto con esa herramienta?

Esto es todo, como siempre tenéis el Discord y los comentarios de la misma entrada para comentar el contenido de la misma.