Слой проверки ядра LunarG сбрасывает структуру до нуля

Я реализую базовый пример текстурированного куба и столкнулся с интересной проблемой: после передачи моей структуры DescriptorWriteSet вызову API UpdateDescriptorSets все поля были обнулены. Любой код, который пытается прочитать поля после этого, получает исключение нулевого указателя (поскольку указатель DescriptorBufferInfo теперь нулевой). Это только происходит, когда VK_LAYER_LUNARG_core_validation включен, и если я отключу его, вызов API будет работать нормально.

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

  • Windows 10
  • LunarG SDK 1.0.8 (я бы хотел использовать версию 1.0.13, но для этого требуется более новый драйвер AMD, из-за которого на моем компьютере появляется синий экран)

ИЗМЕНИТЬ:

Это не просто обнуление структуры, которую я ей даю - в настоящее время я передаю только первое DescriptorWriteSet в постоянном массиве, и оно также обнуляет второе. На самом деле, когда я проверяю память вокруг массива, этот слой касается памяти с обеих сторон массива. Мне это больше похоже на баг...

РЕДАКТИРОВАТЬ 2:

Оказывается, проблема связана с моим кодом:

DescriptorSetLayoutBinding layout_bindings[]{
    DescriptorSetLayoutBinding()
        .Binding(0)
        .Descriptors(DescriptorType::UNIFORM_BUFFER, 1)
        .StageFlags(ShaderStageFlagBits::VERTEX),
    DescriptorSetLayoutBinding()
        .Binding(0)
        .Descriptors(DescriptorType::COMBINED_IMAGE_SAMPLER, 1)
        .StageFlags(ShaderStageFlagBits::FRAGMENT)
};

Обе мои привязки макета имели одинаковый индекс привязки 0. Конечно, я ожидал, что это вызовет проблемы, но я не ожидал, что это вызовет обнуление структур, передаваемых в будущих вызовах API... Я всегда не решаюсь поднять такие вещи как проблемы на Github, потому что более чем в половине случаев это моя вина, что я получаю проблему.


person Andrew Williamson    schedule 15.06.2016    source источник
comment
В Вулкане нет такого типа под названием DescriptorWriteSet. Можете ли вы рассказать нам, каковы настоящие типы Vulkan, возможно, с реальным кодом Vulkan?   -  person Nicol Bolas    schedule 16.06.2016
comment
Извините, это должно быть WriteDescriptorSet. Я добавлю код, когда вернусь из универа.   -  person Andrew Williamson    schedule 16.06.2016
comment
Какой вопрос? В противном случае отправьте допустимые проблемы разработчикам слоев github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues   -  person krOoze    schedule 16.06.2016
comment
Кстати, используйте обновленный SDK (1.0.13). ; И последняя версия AMD на самом деле 11. Насколько я знаю, вы можете смешивать и сопоставлять эти версии драйверов и патчей SDK (но самые новые версии всегда лучше, верно?)   -  person krOoze    schedule 16.06.2016
comment
SDK @krOoze LunarG версии 1.0.8 и ниже содержал обходной путь для ошибки в драйвере AMD vulkan. Теперь, когда AMD исправила ошибку, SDK 1.0.13+ не нужно включать обходной путь. К сожалению, новый драйвер AMD дает мне BSOD, поэтому я пока застрял на 1.0.8. Это тот случай, когда я не могу смешивать и сопоставлять версии драйверов и патчей SDK.   -  person Andrew Williamson    schedule 18.06.2016
comment
Итак... Я могу удалить вопрос, но если я хочу закрыть его, я могу только проголосовать - для этого все равно нужно проголосовать еще четыре человека. Вы могли бы подумать, что у ОП будет возможность закрыть свой вопрос.   -  person Andrew Williamson    schedule 18.06.2016
comment
@AndrewWilliamson У него есть, выбрав предпочтительный ответ (или самостоятельно ответив и выбрав его, если ни один ответ не является удовлетворительным). Закрытие только для особых случаев, я думаю   -  person krOoze    schedule 19.06.2016


Ответы (1)


Слой VK_LAYER_LUNARG_core_validation не должен изменять структуру, на которую указывает pDescriptorWrites в vkUpdateDescriptorSets. Если вы считаете, что это изменение переданной структуры, отправьте сообщение о проблеме вместе с репозиторием на https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues.

person Jon Ashburn    schedule 16.06.2016
comment
Уровень проверки модифицировал структуру и другую память, к которой у него не должно было быть доступа, но только потому, что я ранее передал неверные значения в API (в частности, я создал два DescriptorSetLayoutBinding с одинаковым индексом привязки). Как вы думаете, стоит ли писать об этом как об ошибке, учитывая, что это действительно была моя вина? - person Andrew Williamson; 18.06.2016
comment
@AndrewWilliamson Да, судя по вашему описанию, я так думаю, ЕСЛИ вы включили все слои проверки в правильном порядке (например, с помощью VK_LAYER_LUNARG_standard_validation). (и, конечно, если об этой проблеме еще не сообщалось) Смысл слоев в том, чтобы выявлять ваши ошибки - вы, вероятно, не найдете ошибку в слое, имея правильный код. - person krOoze; 22.06.2016