Mapa mapowania pojęć DirectX / OpenGL (Vulkan)

32

Często podobna funkcja sprzętowa jest udostępniana przez DirectX i OpenGL przy użyciu innej terminologii.

Na przykład:
Constant Buffer / Uniform Buffer Object
RWBuffer / SSBO

Szukam wyczerpującego wykresu, który opisuje, która terminologia DirectX jest używana w odniesieniu do której koncepcji OpenGL i odwrotnie.
Gdzie mogę znaleźć taki zasób?

wycierać
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
trichoplax

Odpowiedzi:

55

Nie udało mi się znaleźć takiego wykresu w Internecie, więc zrobiłem go tutaj. (Każdy może dodawać, opracowywać lub poprawiać wszelkie błędy. Niektóre z nich to po prostu najlepsze domysły oparte na częściowym zrozumieniu interfejsu API i wewnętrznych elementów sprzętowych).

Podstawy API

D3D11                          OpenGL 4.x
-----                          ----------
device                         context
immediate context              (implicit; no specific name)
deferred context               (no cross-vendor equivalent, but see
                                GL_NV_command_list)
swap chain                     (implicit; no specific name)
(no cross-vendor equivalent)   extensions
debug layer; info queue        GL_KHR_debug extension

Shadery

D3D11              OpenGL 4.x
-----              ----------
pixel shader       fragment shader
hull shader        tessellation control shader
domain shader      tessellation evaluation shader
(vertex shader, geometry shader, and compute shader
 are called the same in both)

registers          binding points
semantics          interface layouts
SV_Foo semantics   gl_Foo builtin variables

class linkage      subroutines

(no equivalent)    program objects; program linking

(D3D11's normal
 behavior; no      separate shader objects
 specific name)

Geometria i rysunek

D3D11              OpenGL 4.x
-----              ----------
vertex buffer      vertex attribute array buffer; vertex buffer object
index buffer       element array buffer
input layout       vertex array object (sort of)

Draw               glDrawArrays
DrawIndexed        glDrawElements
(instancing and indirect draw are called similarly in both)
(no equivalent)    multi-draw, e.g. glMultiDrawElements​

stream-out         transform feedback
DrawAuto           glDrawTransformFeedback​

predication        conditional rendering
(no equivalent)    sync objects

Bufory i tekstury

D3D11                    OpenGL 4.x
-----                    ----------
constant buffer          uniform buffer object
typed buffer             texture buffer
structured buffer        (no specific name; subset of SSBO features)
UAV buffer; RWBuffer     SSBO (shader storage buffer object)
UAV texture; RWTexture   image load/store

shader resource view     texture view
sampler state            sampler object

interlocked operations   atomic operations
append/consume buffer    SSBO + atomic counter

discard buffer/texture   invalidate buffer/texture
(no equivalent)          persistent mapping
(D3D11's normal
 behavior; no            immutable storage
 specific name)
(implicitly inserted     glMemoryBarrier; glTextureBarrier
 by the API)

Renderuj cele

D3D11                     OpenGL 4.x
-----                     ----------
(no equivalent)           framebuffer object
render target view        framebuffer color attachment
depth-stencil view        framebuffer depth-stencil attachment
multisample resolve       blit multisampled buffer to non-multisampled one

multiple render targets   multiple color attachments
render target array       layered image

(no equivalent)           renderbuffer

Zapytania

D3D11                       OpenGL 4.x
-----                       ----------
timestamp query             timer query
timestamp-disjoint query    (no equivalent)
(no equivalent)             time-elapsed query
occlusion query             samples-passed query
occlusion predicate query   any-samples-passed query
pipeline statistics query   (no equivalent in core, but see
                             GL_ARB_pipeline_statistics_query)
SO statistics query         primitives-generated/-written queries 
(no equivalent)             query buffer object

Compute Shaders

D3D11                     OpenGL 4.x
-----                     ----------
thread                    invocation
thread group              work group
thread group size         local size
threadgroup variable      shared variable

group sync                "plain" barrier
group memory barrier      shared memory barrier
device memory barrier     atomic+buffer+image memory barriers
all memory barrier        group memory barrier

Inne zasoby

Nathan Reed
źródło
3
Łał. Prawdopodobnie zatrudniają najtwardsze umysły na świecie, aby stworzyć najróżniejsze nazwy dla tych samych rzeczy.
narthex
Ten wykres jest świetny, dziękuję za poświęcenie czasu na jego spisanie!
wip
3
tekstury tablic - obraz warstwowy ” OpenGL nazywa je również Array Textures; termin „obraz warstwowy” jest używany przede wszystkim wokół ich załączników w podmiotach prowadzących przedsiębiorstwa spożywcze. Powinieneś również prawdopodobnie wspomnieć o obiektach próbkujących OpenGL i ich odpowiedniku D3D, stanie samplera.
Nicol Bolas,
2
@ CpCd0y Tak, nazywają to potocznie, ale moim celem było powiedzieć, jak te rzeczy się nazywają / jak są reprezentowane w API-ese.
Nathan Reed,
1
@NathanReed: MRT nie jest używany w specyfikacji OpenGL, ale „kwerenda okluzji” jest bardzo podobna. Termin „próbki przekazane” jest tylko jednym rodzajem zapytania dotyczącego okluzji; istnieją również „wszelkie przekazane próbki” i „konserwatywne wszelkie przekazane próbki”.
Nicol Bolas
28

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.

codingforlove
źródło
Fajnie, to świetna robota!
wip
Myślę, że byłoby to słuszne powiedzieć VkDescriptorPooli ID3D12DescriptorHeapmają one podobną funkcję (w tym sensie, jak przydzielają deskryptory), ale mają zupełnie inną formę ze względu na różnice w ogólnym sposobie obsługi deskryptorów między interfejsami API. Wyobrażam sobie również, że odpowiednikiem D3D12 VkBufferViewjest bufor buforowany, tak jak w przypadku D3D11.
Nicol Bolas,
Jesteś na kupie deskryptorów. Zaktualizowano Jeśli chodzi o widoki buforów, oba interfejsy API mają pojęcie widoków. Nie mogłem powiedzieć, czy DX12 zerwał z konwencją buforów maszynowych DX1, czy nie, ponieważ nie mam dużego doświadczenia z DX11.
codingforlove
Czy możesz powiedzieć, że cele renderowania D3D12 są odpowiednikami bufora VkFramebuffer?
Jorge Rodriguez
2
Zainspirowany tym tematem napisałem implementacje pojedynczego nagłówka rendererów zarówno Vulkan, jak i DX12: renderers: github.com/chaoticbob/tinyrenderers
codingforlove