VKCMDCOPYBUFFER对分期缓冲液的转移没有影响
vkCmdCopyBuffer has no effect for transfer of staging buffer
对于使用Vulkan-HPP和Vulkan内存分配器的Vulkan渲染器,我试图使用登台缓冲区将顶点数据传输到GPU。不使用中间分期缓冲区,可以渲染传输作品和网格没有任何问题(仅使用VMA_MEMORY_USAGE_CPU_TO_GPU创建的单个缓冲区)。但是,通过呼叫vkcmdcopybuffer,由此产生的顶点仅包含0(用Nsight检查)。认为可能需要使用壁垒同步我尝试以下代码,但仍然存在相同的问题。
也许需要将命令缓冲区与后来的命令缓冲区绑定和从顶点缓冲区进行采购同步?尽管我在任何教程中都没有看到或提到过。
。// vulkan initialization
// VmaAllocator initialization
std::vector<Vertex> vertices = { /*filled*/ };
auto vertexBufferSize = vertices.size() * sizeof(Vertex);
vk::Buffer stagingBuffer;
auto ci = vk::BufferCreateInfo().
setUsage(vk::BufferUsageFlagBits::eTransferSrc).
setSharingMode(vk::SharingMode::eExclusive).
setSize(vertexBufferSize );
VmaAllocationCreateInfo allocationCI = {};
allocationCI.usage = VMA_MEMORY_USAGE_CPU_ONLY;
vmaCreateBuffer(allocator, (VkBufferCreateInfo*)&ci,
&allocationCI, (VkBuffer*)&stagingBuffer, &allocation, nullptr);
void* pVBufMem = nullptr;
vmaMapMemory(allocator, allocation, &pVBufMem);
std::memcpy(pVBufMem, vertices.size(), vertexBufferSize );
vmaUnmapMemory(allocator, allocation);
vk::Buffer vertexBuffer;
ci = vk::BufferCreateInfo().
setUsage(vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer).
setSharingMode(vk::SharingMode::eExclusive).
setSize(vertexBufferSize);
allocationCI = {};
allocationCI.usage = VMA_MEMORY_USAGE_GPU_ONLY;
vmaCreateBuffer(allocator, (VkBufferCreateInfo*)&ci,
&allocationCI, (VkBuffer*)&vertexBuffer, &allocation, nullptr);
// copy staging buffer to vertex buffer
auto allocCI = vk::CommandBufferAllocateInfo().
setCommandBufferCount(1).
setCommandPool(pool).
setLevel(vk::CommandBufferLevel::ePrimary);
auto cmd = device.allocateCommandBuffers(allocCI)[0];
cmd.begin({ vk::CommandBufferUsageFlagBits::eOneTimeSubmit });
// barrier host write -> copyBuffer read
auto bufferMemoryBarrier = vk::BufferMemoryBarrier()
.setBuffer(stagingBuffer)
.setSize(vertexBufferSize)
.setSrcAccessMask(vk::AccessFlagBits::eMemoryWrite)
.setDstAccessMask(vk::AccessFlagBits::eTransferRead)
.setSrcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
.setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED);
cmd.pipelineBarrier(
vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, {},
{ }, { bufferMemoryBarrier }, { });
cmd.copyBuffer(stagingBuffer, vertexBuffer, { 0, 0, vertexBufferSize });
// copyBuffer write -> vertex read
bufferMemoryBarrier = vk::BufferMemoryBarrier()
.setBuffer(vertexBuffer)
.setSize(vertexBufferSize)
.setSrcAccessMask(vk::AccessFlagBits::eTransferWrite)
.setDstAccessMask(vk::AccessFlagBits::eVertexAttributeRead)
.setSrcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
.setDstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED);
cmd.pipelineBarrier(
vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, {},
{ }, { bufferMemoryBarrier }, { });
cmd.end();
auto submitInfo = vk::SubmitInfo().
setCommandBufferCount(1).
setPCommandBuffers(&cmdBuffer);
queue.submit({ submitInfo }, {});
queue.waitIdle();
它已修复。CopyBuffer的第三个论点未正确初始化。正确的呼叫应该是这样:
cmd.copyBuffer(stagingBuffer, vertexBuffer, {{ 0, 0, vertexBufferSize }});
线
cmd.copyBuffer(stagingBuffer, vertexBuffer, { 0, 0, vertexBufferSize });
实际上创建了三个不同的复制区域。
相关文章:
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 是否有任何区域设置会影响宽字符编码?
- 此分配对速度有影响吗?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 当在循环中使用时,std::shared_ptr 对该循环的矢量化有任何影响吗?
- 如果A("whole")有一组B("parts"),如何同步"part" B从A "whole"到另一个A的转移?
- 明确定义'static const variable in a struct'对C++ 11 及以上有什么影响吗?
- 每个帧的参考中都有多少性能影响
- VKCMDCOPYBUFFER对分期缓冲液的转移没有影响
- "insert"对德克的引用有什么影响?
- 如果订购有什么影响..否则如果按概率陈述
- 预编译的标题有多少影响MFC
- 等号在大括号初始化中是否有影响?例如。 'T a = {}'与'T a{}'
- 完成的线程是否对 winapi 中的主程序有影响
- 在 c++ 中使用 "this" 关键字对性能有影响吗?
- 额外的继承对对象结构或实例化有影响吗?
- 当do额外的括号有影响时,除了运算符优先级
- Array2的变化对Array(表)有影响
- try-catch对char**返回值有影响