使用带有 std::condition_variable 的 vkFence
Using a vkFence with an std::condition_variable
一个VkFence
可以是waited upon or queried about its state。当围栏准备就绪时,是否可以让 Vulkan 实现调用回调?
这将允许它与 std::condition_variable
等对象一起使用。当围栏准备就绪时,condition_variable
会收到通知。
这种方法还允许与像 Boost.Fiber 这样的库集成,这将完全消除线程休眠的需要,而是它可以在等待栅栏时做有用的工作。
如果这在基础 Vulkan 中是不可能的,是否有允许它的扩展?
Vulkan 不是这样工作的。 Vulkan 设备和队列独立于 CPU 执行。事实上,除了一两个例外,Vulkan 实现仅 ever 在特定函数调用范围内且仅在进行此调用的线程上使用 CPU 资源。甚至调试回调也是在导致错误的函数范围内进行的。
没有机制可以让 Vulkan 实现在未经 API 用户明确同意的情况下使用 CPU 资源(同样,减去一两个例外)。所以没有回调在 API 调用之外起作用。
Vulkan 确实有办法从 VkFence
中提取本机同步对象,但令人惊讶的是它在 Windows 中没有用。虽然您可以获得 HANDLE
,但 Win32 API 无法使用它来等待它。这主要是为了与其他 API 互操作(比如将其转换为 D3D12 同步对象),而不是为了自己等待它。但是文件描述符提取操作可以获得一个功能齐全的同步对象......如果实现允许你。
一个VkFence
可以是waited upon or queried about its state。当围栏准备就绪时,是否可以让 Vulkan 实现调用回调?
这将允许它与 std::condition_variable
等对象一起使用。当围栏准备就绪时,condition_variable
会收到通知。
这种方法还允许与像 Boost.Fiber 这样的库集成,这将完全消除线程休眠的需要,而是它可以在等待栅栏时做有用的工作。
如果这在基础 Vulkan 中是不可能的,是否有允许它的扩展?
Vulkan 不是这样工作的。 Vulkan 设备和队列独立于 CPU 执行。事实上,除了一两个例外,Vulkan 实现仅 ever 在特定函数调用范围内且仅在进行此调用的线程上使用 CPU 资源。甚至调试回调也是在导致错误的函数范围内进行的。
没有机制可以让 Vulkan 实现在未经 API 用户明确同意的情况下使用 CPU 资源(同样,减去一两个例外)。所以没有回调在 API 调用之外起作用。
Vulkan 确实有办法从 VkFence
中提取本机同步对象,但令人惊讶的是它在 Windows 中没有用。虽然您可以获得 HANDLE
,但 Win32 API 无法使用它来等待它。这主要是为了与其他 API 互操作(比如将其转换为 D3D12 同步对象),而不是为了自己等待它。但是文件描述符提取操作可以获得一个功能齐全的同步对象......如果实现允许你。