相关疑难解决方法(0)

Vulkan中命令缓冲区之间的同步

有几种方法可以处理Vulkan中的同步.这就是我理解的方式:

  • Fences是GPU到CPU的同步.
  • 信号量是GPU到GPU的同步,它们用于同步队列提交(在相同或不同的队列上).
  • 事件更通用,在CPU和GPU上重置和检查.
  • 障碍用于命令缓冲区内的同步.

在我的情况下,我有两个命令缓冲区.我希望第二个命令缓冲区在第一个命令缓冲区之后执行.

submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);

// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
Run Code Online (Sandbox Code Playgroud)

什么样的同步最适合这个?如果我使用的vkQueueWaitIdle(queue)),是与使用栅栏相同的东西,或者我应该使用事件或信号量?

如果我同时向队列发送多个命令缓冲区:

std::vector<VkCommandBuffer> submitCmdBuffers = {
        firstCommandBuffer,
        secondCommandBuffer
    };
    submitInfo.commandBufferCount = submitCmdBuffers.size();
    submitInfo.pCommandBuffers = submitCmdBuffers.data();
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以在第一个和第二个之间同步吗?

c++ synchronization gpu vulkan

23
推荐指数
2
解决办法
2644
查看次数

Vulkan中RenderPass和Pipeline是什么关系?

Vulkan中RenderPass和Pipeline的逻辑关系是什么?

如果忽略RenderPass,我对渲染过程的理解是先将应用层准备好的顶点数据,然后将纹理数据提交给驱动,然后通过各个阶段的管道,写入Framebuffer后,就可以完成一次渲染。

那么RenderPass的职责是什么?它是为渲染每个阶段(例如格式)提供元数据的抽象,还是有其他作用?

RenderPass 和 Pipeline 是靠感觉的吗?例如,每个流水线都属于一个子通道。或者依赖项,例如流水线的最后一个输出,由 RenderPass 处理。或者是别的什么?

vulkan

9
推荐指数
1
解决办法
1743
查看次数

为什么有些命令只能在渲染过程之外记录?

我不知道这是API功能(我几乎可以肯定不是)还是GPU细节,但是为什么例如vkCmdWaitEvents可以在渲染过程的内部和外部vkCmdResetEvent进行记录,而只能在外部进行记录呢?其他命令也一样。

vulkan

4
推荐指数
1
解决办法
100
查看次数

标签 统计

vulkan ×3

c++ ×1

gpu ×1

synchronization ×1