Уровни проверки Vulkan VkCmdWaitEvents srcStageMask Значение ошибки - PullRequest
1 голос
/ 11 февраля 2020

Событие сигнализируется другим буфером cmd в той же очереди с маской этапа VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT.

Событие не , переданное через хост vkSetEvent.

Событие ожидает vkCmdWaitEvents с sr c маской этапа VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT и маской этапа dst VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT.

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

Сообщение обратного вызова слоев проверки:

Submitting cmdbuffer with call to VkCmdWaitEvents using srcStageMask 0x200 which must be the 
bitwise OR of the stageMask parameters used in calls to vkCmdSetEvent and 
VK_PIPELINE_STAGE_HOST_BIT if used with vkSetEvent but instead is 0x0. The Vulkan spec 
states: srcStageMask must be a valid combination of VkPipelineStageFlagBits values 
(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-
vkCmdWaitEvents-srcStageMask-parameter)

На самом деле говорится, что «переданное значение равно 0x200, но равно 0x0». Это ошибка? Откуда берется значение 0x0, как оно может быть 0x200 и 0x0 одновременно?


Какой-то код

Сигнал после рендеринга буфера глубины:

cmd.cmd_event_set_signaled(cmd_data.event<EventId::SHADOW_MAP>(),
                           vkw::StageFlag::LATE_FRAGMENT_TESTS);

Подождите, пока основной рендеринг не передаст другой cmd:

vkw::StageMaskChange stage_masks;
stage_masks.src = vkw::StageFlag::LATE_FRAGMENT_TESTS;
stage_masks.dst = vkw::StageFlag::FRAGMENT_SHADER;
auto &shadow_map_event = cmd_data.event<EventId::SHADOW_MAP>();
cmd.cmd_event_wait(shadow_map_event, stage_masks);
cmd.cmd_event_set_unsignaled(shadow_map_event, stage_masks.dst);

Код оболочки. Есть некоторые преобразования типов C ++ magi c, но значения передаются в функции vkCmd правильно.

void cmd_event_set_signaled(Event e, StageMask stage_mask) {
    vkCmdSetEvent(*this, e, stage_mask);
}
void cmd_event_set_unsignaled(Event e, StageMask stage_mask) {
    vkCmdResetEvent(*this, e, stage_mask);
}
void cmd_event_wait(Events es, StageMaskChange smc) {
    vkCmdWaitEvents(*this, es.count32(), &es.begin()->p_vk, smc.src, smc.dst,
                    0, {}, 0, {}, 0, {});
}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Проблема отсутствует в VulkanSDK 1.2.131.2, поэтому vulkan-loader-1.1.125 немного устарела.

0 голосов
/ 11 февраля 2020

В сообщении один ссылается на этап конвейера, использованный в vkCmdWaitEvents, другой - на этап, переданный vkCmdSetEvent.

...