DirectX 12 - вопросы о списке команд
Пытаясь понять списки команд. Ну, команда перечисляет записи моих команд для рендеринга, но также связывает ресурсы, скажем, буфер с данными вершин.
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
Это записывает привязку буфера вершин. Что происходит с буфером в этот момент? Что произойдет, если я изменю содержимое этого буфера вершин после его записи? Что произойдет, если я изменю содержимое этого буфера вершин после вызова списка выполнения команды, а gpu еще не завершил его?
Я полагаю, что ExecuteCommandList - это асинхронный вызов функции, я прав? Выполняет ли он всю привязку (передачу данных в gpu) одновременно или выполняет команды одну за другой, даже все привязки? Список команд выполняется драйвером или все отправлено в gpu?
Ну, из-за отсутствия хороших примеров у меня все еще много вопросов. Я был бы счастлив, если бы вы могли ответить на некоторые из них, чтобы было понятно.
1 ответ
В DirectX 12 синхронизация полностью ложится на приложение. Вы должны вставить и проверить заборы, чтобы убедиться, что графический процессор завершен с вашим буфером, прежде чем изменять его. Для динамических буферов вам нужно сделать свою собственную двойную / тройную / n буферизацию.
Когда вы звоните ExecuteCommandList
это просто ставит его в очередь на GPU. Пройдет некоторое время, прежде чем GPU на самом деле его подберет, а затем завершит.
Обязательно проверьте проект DirectX Graphics Samples GitHub. Примеры там и демонстрация Mini Engine - хорошие места, чтобы найти пример использования.
Такая конструкция делает DirectX 12 чрезвычайно мощным, поскольку дает приложению прямой контроль над множеством вещей, которые были "волшебными" в среде выполнения Direct3D 11. Тем не менее, получившийся API намного сложнее в действительности использовать, если вы уже не достаточно хороший графический инженер, который мог бы написать Direct3D 11 Runtime. Использование Direct3D 11 API все еще является хорошим выбором и для проекта.