事件由具有VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
阶段掩码的同一队列上的另一个cmd缓冲区发出信号。
事件是不是通过主机上的vkSetEvent
发出的信号。
事件由vkCmdWaitEvents
和src阶段掩码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 ++类型转换魔术,但是值正确传递给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, {});
}
在消息中,一个引用了vkCmdWaitEvents
中使用的管道阶段,另一个引用了传递给vkCmdSetEvent
的阶段。