Aquí hay una lista no exhaustiva de Vulkan y DirectX 12. Esto se combina usando criterios similares a los de Nathan.
En general, ambas API son sorprendentemente similares. Cosas como las etapas de sombreador permanecen sin cambios desde DX11 y OpenGL. Y obviamente, DirectX usa vistas para hacer que las cosas sean visibles para los sombreadores. Vulkan también usa vistas, pero son menos frecuentes.
El comportamiento de visibilidad del sombreador difiere un poco entre los dos. Vulkan usa una máscara para determinar si un descriptor es visible para las distintas etapas del sombreador. DX12 maneja esto un poco diferente, la visibilidad de los recursos se realiza en una sola etapa o en todas las etapas.
Rompí el conjunto de descriptores / parámetros del parámetro raíz lo mejor que pude. El manejo del descriptor es una de las áreas que varían mucho entre las dos API. Sin embargo, el resultado final es bastante similar.
Conceptos básicos de API
Vulkan DirectX 12
--------------- ---------------
n/a IDXGIFactory4
VkInstance n/a
VkPhysicalDevice IDXGIAdapter1
VkDevice ID3D12Device
VkQueue ID3D12CommandQueue
VkSwapchain IDXGISwapChain3
VkFormat DXGI_FORMAT
SPIR-V D3D12_SHADER_BYTECODE
VkFence fences
VkSemaphore n/a
VkEvent n/a
La capa WSI de Vulkan proporciona imágenes para la cadena de intercambio. DX12 requiere recursos de creación para representar la imagen.
El comportamiento general de la cola es bastante similar entre ambos. Hay un poco de idiosincrasia al enviar desde múltiples hilos.
Intentaré actualizar a medida que recuerdo más cosas ...
Comando Buffer y Pool
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
La palabrería sobre el grupo de comandos / asignador de documentos de Vulkan / DX12 establece el comportamiento en palabras muy diferentes, pero el comportamiento real es bastante similar. Los usuarios son libres de asignar muchos buffers / listas de comandos del grupo. Sin embargo, solo se puede grabar un búfer / lista de comandos del grupo. Las agrupaciones no se pueden compartir entre subprocesos. Por lo tanto, varios subprocesos requieren múltiples grupos. También puede comenzar a grabar inmediatamente después de enviar el comando buffer / list en ambos.
La lista de comandos DX12 se crea en un estado abierto. Esto me resulta un poco molesto ya que estoy acostumbrado a Vulkan. DX12 también requiere un reinicio explícito del asignador de comandos y la lista de comandos. Este es un comportamiento opcional en Vulkan.
Descriptores
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter : no es un equivalente exacto de VkDescriptorSetLayoutBinding pero un pensamiento similar en la imagen más grande.
VkDescriptorPool y ID3D12DescriptorHeaps son algo similares (gracias Nicolas) en que ambos manejan la asignación de los descriptores ellos mismos.
Cabe señalar que DX12 solo admite como máximo dos montones de descriptores vinculados a una lista de comandos en un momento dado. Un CBVSRVUAV y una muestra. Puede tener tantas tablas de descriptores como desee haciendo referencia a estos montones.
En el lado de Vulkan, hay un límite estricto para el número máximo de conjuntos de descriptores que le dice al grupo de descriptores. En ambos, debe realizar un poco de contabilidad manual sobre el número de descriptores por tipo que puede tener el grupo / montón. Vulkan también es más explícito con el tipo de descriptores. Mientras que en DX12 los descriptores son CBVSRVUAV o muestreador.
DX12 también tiene una función en la que puede vincular un CBV sobre la marcha utilizando SetGraphicsRootConstantBufferView. Sin embargo, la versión SRV de esto, SetGraphicsRootShaderResourceView, no funciona en texturas. Está en los documentos, pero también puede tomarle un par de horas para resolver esto si no es un lector cuidadoso.
Tubería
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature : no es un equivalente exacto de VkPipelineLayout .
DX12 combina el atributo de vértice y el enlace en una sola descripción.
Imágenes y Buffers
Vulkan DirectX 12
--------------- ---------------
VkImage ID3D12Resource
VkBuffer ID3D12Resource
uniform buffer constant buffer
index buffer index buffer
vertex buffer vertex buffer
VkSampler sampler
barriers/transitions barriers/transitions
Las barreras en ambas API se descomponen un poco diferentes, pero tienen un resultado neto similar.
RenderPasses / RenderTargets
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Los pases de render Vulkan tienen una buena característica de resolución automática. DX12 no tiene este AFIAK. Ambas API proporcionan funciones para la resolución manual.
No hay una equivalencia directa entre VkFramebuffer y ningún objeto en DX12. Una colección de ID3D12Resource que se asigna a los RTV es una similitud suelta.
VkFramebuffer actúa más o menos como un grupo de archivos adjuntos a los que VkRenderPass hace referencia mediante un índice. Los subpasos dentro de un VkRenderPass pueden hacer referencia a cualquiera de los archivos adjuntos en un VkFramebuffer, suponiendo que el mismo archivo adjunto no esté referenciado más de una vez por subpaso. El número máximo de archivos adjuntos de color utilizados a la vez está limitado a VkPhysicalDeviceLimits.maxColorAttachments.
Los objetivos de representación de DX12 son solo RTV respaldados por objetos ID3D12Resource. El número máximo de archivos adjuntos de color utilizados a la vez está limitado a D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Ambas API requieren que especifique los objetivos / pasos de representación en la creación de los objetos de canalización. Sin embargo, Vulkan le permite usar pases de renderizado compatibles, por lo que no está bloqueado en los que especifique durante la creación de la tubería. No lo he probado en DX12, pero supongo que ya que es solo un RTV, esto también es cierto en DX12.