Oto niewyczerpująca lista Vulkan i DirectX 12. Jest to zestawione razem przy użyciu kryteriów podobnych do kryteriów Nathana.
Ogólnie oba interfejsy API są zaskakująco podobne. Rzeczy takie jak stopnie cieniowania pozostają niezmienione od DX11 i OpenGL. I oczywiście DirectX używa widoków, aby rzeczy były widoczne dla shaderów. Vulkan korzysta również z widoków, ale są one rzadsze.
Zachowanie widoczności modułu cieniującego różni się nieco między nimi. Vulkan używa maski, aby ustalić, czy deskryptor jest widoczny dla różnych stopni shadera. DX12 radzi sobie z tym trochę inaczej, widoczność zasobów odbywa się na jednym etapie lub na wszystkich etapach.
Zepsułem zestaw deskryptorów / parametry parametru root najlepiej, jak mogłem. Obsługa deskryptorów jest jednym z obszarów, które różnią się znacznie między dwoma interfejsami API. Jednak wynik końcowy jest dość podobny.
Podstawy 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
Warstwa WSI Vulkan dostarcza obrazy do wymiany. DX12 wymaga zasobów do tworzenia obrazu.
Ogólne zachowanie w kolejce jest dość podobne między nimi. Podczas przesyłania z wielu wątków jest trochę dziwactwa.
Spróbuję zaktualizować, ponieważ pamiętam więcej rzeczy ...
Bufor poleceń i pula
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
Verbage na temat puli poleceń / alokatora z dokumentów Vulkan / DX12 podaje zachowanie w bardzo różnych słowach - ale rzeczywiste zachowanie jest dość podobne. Użytkownicy mogą przydzielić wiele buforów / list poleceń z puli. Jednak tylko jeden bufor / lista poleceń z puli może nagrywać. Pule nie mogą być dzielone między wątkami. Tak więc wiele wątków wymaga wielu pul. Możesz także rozpocząć nagrywanie natychmiast po przesłaniu bufora / listy poleceń na oba.
Lista poleceń DX12 jest tworzona w stanie otwartym. Uważam to za trochę denerwujące, ponieważ jestem przyzwyczajony do Vulkanu. DX12 wymaga również jawnego zresetowania alokatora poleceń i listy poleceń. Jest to opcjonalne zachowanie w Vulkan.
Deskryptory
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter - nie jest to dokładny odpowiednik VkDescriptorSetLayoutBinding, ale podobne myślenie na większym obrazie.
VkDescriptorPool i ID3D12DescriptorHeaps są trochę podobne (dzięki Nicolas), ponieważ oba zarządzają alokacją samych deskryptorów.
Należy zauważyć, że DX12 obsługuje tylko dwa stosy deskryptorów powiązane z listą poleceń w danym momencie. Jeden CBVSRVUAV i jeden próbnik. Możesz mieć tyle tabel deskryptorów, ile chcesz odwoływać się do tych hałd.
Po stronie Vulkan istnieje sztywny limit maksymalnej liczby zestawów deskryptorów, które podajesz puli deskryptorów. W obu przypadkach należy wykonać ręczne rozliczanie liczby deskryptorów według typu, jaką może mieć pula / sterta. Vulkan jest również bardziej jednoznaczny z typem deskryptorów. Natomiast na DX12 deskryptory to CBVSRVUAV lub sampler.
DX12 ma również funkcję, dzięki której można w pewien sposób powiązać CBV w locie za pomocą SetGraphicsRootConstantBufferView. Jednak wersja SRV tego SetGraphicsRootShaderResourceView nie działa na teksturach. Jest w dokumentacji - ale może to potrwać kilka godzin, aby dowiedzieć się o tym, jeśli nie jesteś uważnym czytelnikiem.
Rurociąg
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - nie jest to dokładny odpowiednik VkPipelineLayout .
DX12 łączy atrybut wierzchołka i wiązanie w jeden opis.
Obrazy i bufory
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
Bariery w obu interfejsach API rozkładają się nieco inaczej, ale mają podobny wynik netto.
RenderPasses / RenderTargets
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Przepustki renderujące Vulkan mają niezłą funkcję automatycznego rozpoznawania. DX12 nie ma tego AFIAK. Oba interfejsy API zapewniają funkcje ręcznego rozwiązywania.
Nie ma bezpośredniej równoważności między VkFramebuffer a dowolnymi obiektami w DX12. Zbiór ID3D12Resource odwzorowany na RTV jest luźnym podobieństwem.
VkFramebuffer działa mniej więcej jak pula załączników, do których odwołuje się VkRenderPass przy użyciu indeksu. Podpody w VkRenderPass mogą odwoływać się do dowolnego załącznika w VkFramebuffer, zakładając, że ten sam załącznik nie jest wywoływany więcej niż raz na podpass. Maksymalna liczba załączników kolorów używanych jednocześnie jest ograniczona do VkPhysicalDeviceLimits.maxColorAttachments.
Cele renderowania DX12 to tylko RTV, które są wspierane przez obiekty ID3D12Resource. Maksymalna liczba załączników kolorowych używanych jednocześnie jest ograniczona do D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Oba interfejsy API wymagają określenia celów renderowania / przebiegów przy tworzeniu obiektów potoku. Jednak Vulkan pozwala na używanie zgodnych przejść renderowania, więc nie jesteś zablokowany w tych, które określisz podczas tworzenia potoku. Nie testowałem tego na DX12, ale zgaduję, że to tylko RTV, to samo dotyczy DX12.