Как избежать ошибок слоя проверки о неиспользуемых входах вершин? - PullRequest
0 голосов
/ 02 сентября 2018

Я получаю много ошибок, таких как:

The Pipeline State Object (0x51) expects that this Command Buffer's vertex binding Index 10 should be set via vkCmdBindVertexBuffers. This is because VkVertexInputBindingDescription struct at index 10 of pVertexBindingDescriptions has a binding value of 10.'

Причина в том, что у меня есть шейдер, в котором используются определенные входы вершин в зависимости от значений некоторой постоянной специализации, например ::10000

layout(constant_id = 0) const bool flag = false;
layout(location    = 0) in vec3 input;

void main() {
  if (flag) {
    f(input);
  } else {
    // ignore input
  }
}

Тем не менее все работает должным образом, поскольку я на самом деле не использую input.

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

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Допустимое использование для всех команд vkCmdDraw говорит:

Все входные привязки вершины, доступные через входные переменные вершины, объявленные в интерфейсе точки входа вершинного шейдера, должны иметь допустимые буферы, ограниченные

Это очень похоже на правило для других привязок ресурсов, которые обрабатываются с помощью дескрипторов:

Дескрипторы в каждом наборе связанных дескрипторов, заданные с помощью vkCmdBindDescriptorSets, должны быть действительными, если они статически используются связанным объектом VkPipeline, указанным с помощью vkCmdBindPipeline

Спецификация соответствует , а не , требующей устранения мертвого кода на основе констант специализации. Без DCE вызов f(input) все еще присутствует в шейдере, даже если он никогда не будет выполнен. Таким образом, переменная input все еще статически используется / объявляется в интерфейсе, и применимо вышеупомянутое допустимое использование.

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

0 голосов
/ 06 сентября 2018

В настоящее время мое решение - создать фиктивный буфер, связать память и скопировать в нее некоторые данные. Это заглушает ошибки из слоя проверки.

Связывание памяти и копирование некоторых данных необходимо, в противном случае я получаю предупреждение: Cannot read invalid region of memory allocation XXX for bound Buffer object XXX, please fill the memory before using..

Хотелось бы узнать, есть ли более чистое решение?

...