Схема сопоставления концепций DirectX / OpenGL (Vulkan)

32

Зачастую аналогичная аппаратная функция предоставляется через DirectX и OpenGL с использованием другой терминологии.

Например:
Константа Буфер / Равномерный буфер объект
RWBuffer / SSBO

Я ищу исчерпывающую диаграмму, которая описывает, какая терминология DirectX используется для обозначения какой концепции OpenGL, и наоборот.
Где я могу найти такой ресурс?

WIP
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Трихоплакс

Ответы:

55

Мне не удалось найти такой график в Интернете, поэтому я сделал его здесь. (Все, не стесняйтесь добавлять, уточнять или исправлять любые ошибки. Некоторые из них являются лишь лучшими догадками, основанными на частичном понимании API и аппаратных средств.)

Основы 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

шейдеры

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)

Геометрия и рисование

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

Буферы и текстуры

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)

Рендеринг целей

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

Запросы

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

Вычислить шейдеры

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

Другие источники

Натан Рид
источник
3
Вау. Они, вероятно, нанимают самых сложных умов в мире, чтобы придумывать самые разные имена для одних и тех же вещей.
Narthex
Этот график великолепен, спасибо, что нашли время записать его!
wip
3
« массив текстур - слоистое изображение » OpenGL также называет их Array Textures; Термин «многослойное изображение» используется главным образом вокруг их вложений в FBO. Кроме того, вы, вероятно, должны упомянуть объекты сэмплера OpenGL и их эквивалент D3D, состояние сэмплера.
Никол Болас
2
@ CpCd0y Да, они в разговорной речи называют это, но я хотел сказать, как эти вещи называются / как они представлены в API-интерфейсе.
Натан Рид
1
@NathanReed: MRT не используется в спецификации OpenGL, но «запрос окклюзии» очень часто используется. Термин «пройденные пробы» является всего лишь одним из видов окклюзионных запросов; Есть также «любые образцы, прошедшие» и «консервативные образцы, которые были пройдены».
Николь Болас
28

Вот неисчерпывающий список Vulkan и DirectX 12. Он составлен с использованием критериев, аналогичных критериям Натана.

В целом оба API удивительно похожи. Такие вещи, как этапы шейдера, остаются неизменными по сравнению с DX11 и OpenGL. И, очевидно, DirectX использует представления, чтобы сделать вещи видимыми для шейдеров. Vulkan также использует представления, но они встречаются реже.

Поведение видимости шейдера немного отличается между ними. Vulkan использует маску, чтобы определить, видим ли дескриптор на различных этапах шейдера. DX12 справляется с этим немного по-другому, видимость ресурсов выполняется либо на одном этапе, либо на всех этапах.

Я сломал набор параметров дескриптора / корневого параметра как мог. Обработка дескрипторов - одна из областей, которые сильно различаются между двумя API. Тем не менее, конечный результат довольно похож.

Основы 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

Слой Vulkan WSI предоставляет изображения для цепочки обмена. DX12 требует создания ресурсов для представления изображения.

Общее поведение очереди довольно похоже между ними. При отправке из нескольких потоков есть некоторая особенность.

Постараюсь обновить, как я помню больше вещей ...

Командный буфер и пул

Vulkan                              DirectX 12
---------------                     ---------------
VkCommandPool                       ID3D12CommandAllocator
VkCommandBuffer                     ID3D12CommandList/ID3D12GraphicsCommandList

В словах о пуле команд / распределителе из документов Vulkan / DX12 поведение описывается совершенно другими словами, но фактическое поведение довольно похоже. Пользователи могут свободно выделять много буферов / списков команд из пула. Однако, только один буфер / список команд из пула может быть записан. Пулы не могут быть разделены между потоками. Таким образом, несколько потоков требуют нескольких пулов. Вы также можете начать запись сразу после отправки буфера / списка команд на обоих.

Список команд DX12 создается в открытом состоянии. Я нахожу это немного раздражающим, так как я привык к Вулкану. DX12 также требует и явного сброса распределителя команд и списка команд. Это необязательное поведение в Vulkan.

Дескрипторы

Vulkan                              DirectX 12
---------------                     ---------------
VkDescriptorPool                    n/a
VkDescriptorSet                     n/a
VkDescriptorSetLayout               n/a
VkDescriptorSetLayoutBinding        RootParameter**
n/a                                 ID3D12DescriptorHeap

** RootParameter - не точный эквивалент VkDescriptorSetLayoutBinding, но похожее мышление в более широкой картине.

VkDescriptorPool и ID3D12DescriptorHeaps в некотором роде похожи (спасибо Николасу) в том, что они оба управляют распределением самих дескрипторов.

Следует отметить, что DX12 поддерживает не более двух куч дескрипторов, привязанных к списку команд в любой момент времени. Один CBVSRVUAV и один сэмплер. Вы можете иметь столько таблиц дескрипторов, сколько захотите, ссылаясь на эти кучи.

На стороне Vulkan существует жесткое ограничение на максимальное количество наборов дескрипторов, которые вы сообщаете пулу дескрипторов. В обоих случаях вам придется немного учесть количество дескрипторов для каждого типа, который может иметь пул / куча. Вулкан также более явный с типом дескрипторов. Принимая во внимание, что дескрипторы DX12 являются либо CBVSRVUAV, либо сэмплером.

DX12 также имеет функцию, с помощью которой вы можете сортировать CBV на лету, используя SetGraphicsRootConstantBufferView. Однако SRV-версия этого SetGraphicsRootShaderResourceView не работает с текстурами. Это в документации - но вам может понадобиться пара часов, чтобы понять это, если вы не внимательный читатель.

Трубопровод

Vulkan                              DirectX 12
---------------                     ---------------
VkPipelineLayout                    RootSignature***
VkPipeline                          ID3D12PipelineState
VkVertexInputAttributeDescription   D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription     "

* ** RootSignature - не точный эквивалент VkPipelineLayout .

DX12 объединяет атрибут вершины и привязку в одном описании.

Изображения и буферы

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

Барьеры на обоих API ломаются немного по-разному, но имеют одинаковый чистый результат.

RenderPasses / RenderTargets

Vulkan                              DirectX 12
---------------                     ---------------
VkRenderPass                        render pass
VkFramebuffer                       collection of ID3D12Resource
subpass                             n/a
n/a                                 render target

У проходов рендеринга Vulkan есть хорошая функция автоматического разрешения. DX12 не имеет этого AFIAK. Оба API предоставляют функции для ручного разрешения.

Нет прямой эквивалентности между VkFramebuffer и любыми объектами в DX12. Коллекция ID3D12Resource, которая отображается на RTVs, является довольно схожей.

VkFramebuffer действует более или менее как пул вложений, на который VkRenderPass ссылается с помощью индекса. Подпроходы в VkRenderPass могут ссылаться на любое из вложений в VkFramebuffer, предполагая, что одно и то же вложение не упоминается более одного раза за подпроход. Максимальное количество используемых цветовых вложений ограничено значением VkPhysicalDeviceLimits.maxColorAttachments.

Цели рендеринга DX12 - это просто RTV, которые поддерживаются объектами ID3D12Resource. Максимальное количество одновременно используемых цветовых вложений ограничено D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).

Оба API требуют указания целей / проходов рендеринга при создании объектов конвейера. Тем не менее, Vulkan позволяет вам использовать совместимые проходы рендеринга, поэтому вы не привязаны к тем, которые вы указали при создании трубопровода. Я не тестировал его на DX12, но, думаю, поскольку это просто RTV, то же самое относится и к DX12.

codingforlove
источник
Хорошо, это отличная работа!
wip
Я думаю , было бы справедливо сказать , что VkDescriptorPoolи ID3D12DescriptorHeapпохожи на функции (в том , что они , как вы распределяете дескрипторы), но совершенно разные по форме, из - за различий в общем пути дескрипторы обрабатываются между API. Кроме того, я представляю, что D3D12 эквивалентен VkBufferViewтипизированным буферам, так же как и для D3D11.
Николь Болас
Вы правы в куче дескрипторов. Обновлено. Что касается представлений буфера, оба API имеют концепцию представлений. Я не мог сказать, вышел ли DX12 из соглашения о типизированных буферах DX1 или нет, так как у меня нет большого опыта работы с DX11.
codingforlove
Не могли бы вы сказать, что цели рендеринга D3D12 эквивалентны VkFramebuffer?
Хорхе Родригес
2
Вдохновленный этой темой, я написал реализации с одним заголовком для визуализаторов Vulkan и DX12: renderers: github.com/chaoticbob/tinyrenderers
codingforlove