Предположим, что металлический вершинный шейдер A
обновляет буфер buf
. Также предположим, что у меня есть второй вершинный шейдер B
, который кодируется после A
. Может ли B
использовать результаты в buf
или возможно, что B
начнет выполнение до того, как A
закончит, что означает, что содержимое буфера не готово?В металле выполняется один вершинный шейдер перед выполнением следующего вершинного шейдера?
ответ
Второй вершинный шейдер B
можно выполнить до вершинного шейдера A
, если они закодированы в том же MTLRenderCommandEncoder
. Если вы хотите прочитать вывод A
в B
, тогда они должны быть закодированы отдельными MTLRenderCommandEncoder
.
Обратите внимание, однако, то же самое не истинно для рассылок вычислений в пределах MTLComputeCommandEncoder
. В relevant part of the doc состояния:
Выполнение Compute команды
Для кодирования команды для выполнения функции вычисления , вызовите dispatchThreadgroups: threadsPerThreadgroup: метод из MTLComputeCommandEncoder и указать размеры ThreadGroup и количество threadgroups , Вы можете запросить свойства threadExecutionWidth и свойств maxTotalThreadsPerThreadgroup MTLComputePipelineState до оптимизировать выполнение функции вычисления на этом устройстве.
Для наиболее эффективного выполнения функции вычислений, установить общее количество потоков, указанных аргументом threadsPerThreadgroup к dispatchThreadgroups: threadsPerThreadgroup: метод кратного threadExecutionWidth. Общее число потоков в группе нитей составляет продукт компонентов threadsPerThreadgroup: threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth. Свойство maxTotalThreadsPerThreadgroup указывает максимальное количество потоков, которые могут быть в одной группе нитей , для выполнения этой вычислительной функции на устройстве.
Вычислительные команды выполняются в том порядке, в котором они закодированы в буфер команд. Команда вычисления завершает выполнение, когда все группы , связанные с завершением выполнения команды, и все результаты записываются в память. Из-за этой последовательности результаты команды вычисления доступны для любых команд, закодированных после него в командном буфере.
Для завершения команд кодирования для командного кодера вычисления вызовите метод endEncoding MTLComputeCommandEncoder. После окончания предыдущего кодера команд вы можете создать новый командный кодер любого типа для кодирования дополнительных команд в буфер команды .
Запись в одном коде команды рендера видна в следующем командном кодере. На уровне вызова ничьи нет такой гарантии. – warrenm
Точки вывода вершинного шейдера. Вы также можете использовать их в качестве возможности генерации данных, которые будут интерполированы с помощью флеш-шейдеров. Вы не используете их для записи в буферы.Какие буферы вы пишете в шейдере? Как ваш шейдер вершин обновляет буфер? Вы хотели спросить об вычислительном шейдере вместо вершинного шейдера? –
Вы можете записать в буфер устройства из вершинного шейдера, как вы можете в вычислительном шейдере. Кажется, я мог бы сэкономить немного накладных расходов, обновив некоторые буферы в вершинном шейдере, а не записывая выделенный вычислительный шейдер. Просто не уверен, что GPU начнет обработку следующей команды рисования перед тем, как закончить команду предварительного рисования, тем самым создав содержимое буфера устройства, которое будет обновлено из вершинного шейдера непредсказуемым. Документы Apple, похоже, не затрагивают это, поскольку, конечно, это не соответствует типичному использованию шейдера вершин. – gloo