Vulkan验证层VkCmdWaitEvents srcStageMask错误含义

问题描述 投票:1回答:1

事件由具有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, {});
}
vulkan
1个回答
0
投票

在消息中,一个引用了vkCmdWaitEvents中使用的管道阶段,另一个引用了传递给vkCmdSetEvent的阶段。

© www.soinside.com 2019 - 2024. All rights reserved.