Vulkan: дескриптор набора совместимости - PullRequest
0 голосов
/ 18 января 2019

В главе «Привязка набора дескрипторов» в спецификации Vulkan делается следующее утверждение:

Совместимый набор дескрипторов должен быть привязан ко всем номерам наборов, к которым имеют доступ любые шейдеры в конвейере, во время записи команды рисования или отправки для выполнения с использованием этого конвейера.

Где определяется «совместимый дескриптор»? Я не нашел определение в спецификации. Интересно, должен ли набор дескрипторов точно соответствовать макету набора в шейдере или разрешено ли набору дескрипторов иметь ресурс, связанный с точкой привязки, которой нет в шейдере.

Причина этого вопроса заключается в следующем: предположим, что у меня есть два почти идентичных шейдера (рассмотрим их «вариации» шаблонного шейдера), они имеют одинаковые макеты, за исключением того, что один из них не использует одну конкретную привязку точка (т. е. это может быть «быстрый путь», получаемый из общего пути с помощью #ifdef, что приводит к оптимизации одной точки привязки). Предположим, у меня есть два вызова отрисовки: первый использует один шейдер, а второй - другой, и предположим, что требуемые ресурсы идентичны, за исключением того, что есть дополнительный ресурс для одного шейдера, который имеет эту особую точку привязки. Также предположим, что я использую тот же макет набора дескрипторов, который отображается точно на один шейдер, который имеет дополнительную точку привязки. В этой ситуации я бы предпочел использовать один и тот же набор дескрипторов для обоих шейдеров, чтобы уменьшить количество обновлений / привязок наборов дескрипторов. Набор будет точно соответствовать одному шейдеру и будет содержать привязку ресурса, которой нет в другом шейдере.

1 Ответ

0 голосов
/ 18 января 2019

шейдеры не имеют раскладки; трубопроводы имеют планировку. Когда вы строите конвейер, VkPipelineLayout должен согласиться с тем, что определено в шейдере ... в некоторой степени.

То есть ресурсы, которые объявляет шейдер, должны соответствовать ресурсам, указанным VkPipelineLayout. Но компоновка конвейера также может определять другие ресурсы, которые не используются шейдерами в этом конвейере.

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

...