Каков правильный способ связывания однородных буферов для каждого объекта (например, матрицы камер)? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть простое приложение на вулканском языке, которое имеет:

  • 3 буфера команд для каждого изображения цепочки обмена (# 1, # 2, # 3)

  • 1 унифицированный буфер с данными матрицы проекции

Я хочу связать единый буфер один раз. я использую командный буфер # 1 для привязки единого буфера:

   begin();
   bindDescriptorSets();
   end();
   submit();
   waitIdle();
   reset();

Затем я записываю команды для каждого образа swapchain (3 раза):

   begin()
   bindVertexBuffers()
   beginRenderPass()
   bindPipeline()
   draw()
   endRenderPass()
   end();

Рисование работает, как и ожидалось, но слой проверки регистрирует ошибку:

[ UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound ] Object: 0x1a57aad7910 (Type = 6) | VkPipeline 0x21 uses set #0 but that set is not bound.

Если я переместу строку bindDescriptorSets(); во второй блок записи, например:

   begin()
   bindDescriptorSets();
   bindVertexBuffers()
   beginRenderPass()
   bindPipeline()
   draw()
   endRenderPass()
   end();

Проверка в порядке, но нет никакой разницы в рендеринге.

Итак, вопрос в том: нужно ли связывать наборы дескрипторов для каждой записи буфера? Если да, почему приложение работает нормально, когда я связываю дескрипторные наборы один раз?

1 Ответ

0 голосов
/ 21 мая 2019

Я полагаю, это относится к текущему состоянию приложения Vulkan. Давайте посмотрим, что спецификация говорит о состоянии:

2.2.1. Операция очереди

Команды, записанные в буферах команд, либо выполняют действия (...), либо устанавливают состояние (связывание конвейеров, наборы дескрипторов , и буферы, установить динамическое состояние, push-константы, установить визуализацию проход / подпроход) или выполнить синхронизацию (...). Некоторые команды выполнить более одной из этих задач. Обновление команд настройки состояния текущее состояние буфера команд.

Обратите внимание, я выделил жирным шрифтом, что привязка набора дескрипторов является командой состояния .

Вы связываете набор дескрипторов с буфером команд, заканчиваете этот буфер и отправляете. Далее вы запускаете другие командные буферы. Давайте еще раз посмотрим, что спецификация говорит нам о буферах команд:

  1. Командные буферы

Каждый буфер команд управляет состоянием независимо от других буферов команд. Там нет наследования состояния через основной и вторичные буферы команд, или между вторичными буферами команд. Когда буфер команд начинает запись, все состояния в этой команде буфер не определен.

Таким образом, спецификация и слои говорят вам, что вы должны привязать дескрипторы к каждому буферу команд, который использует это состояние. Почему это работает даже с предупреждениями? Я не знаю, возможно, ваша реализация это позволяет, но я бы не рекомендовал оставить все как есть.

...