首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vulkan:数据一致性的vkCmdPipelineBarrier

Vulkan:数据一致性的vkCmdPipelineBarrier
EN

Stack Overflow用户
提问于 2016-11-13 18:03:40
回答 2查看 1.2K关注 0票数 0

我的问题有两部分:

  1. 内存可用/可见之间有什么区别?
  2. 我从本教程(https://vulkan-tutorial.com)学习Vulkan,目前正在寻找一种不同的方法将统一的数据(简单的模型/视图/投影矩阵)上传到设备本地内存中。矩阵用于顶点着色。 在本教程中,矩阵被更新并复制到暂存缓冲区(vkMapMemory等)。然后,通过创建命令缓冲区、记录vkCmdCopy、将其发送并销毁缓冲区,将其复制到最终的设备本地缓冲区。我试着在命令缓冲区中完成绘图的最后一步。 虽然教程的方式导致流畅的动画,但我的实验错过了这个功能。我试图安装2 bufferBarriers,以确保副本已经完成(这似乎是个问题),但这并没有帮助。资源被正确地创建和绑定--这很好。 //更新统一缓冲区并将其复制到暂存缓冲区//(调用每一帧)工具:UniformBufferObject ubo;//set矩阵void* data;data = device.mapMemory( uniformStagingMemory,0,sizeof of ( ubo ),(vk::MemoryMapFlagBits) 0 );memcpy( data & ubo,sizeof of(Ubo ));device.unmapMemory( uniformStagingMemory );//一次性:为交换链//队列族结构成员设置的每个帧缓冲区创建一个命令缓冲区:从主机内存转移到可用/可见的vk::BufferMemoryBarrier;bufMemBarrierStaging.srcAccessMask = vk::AccessFlagBits::eHostWrite;bufMemBarrierStaging.dstAccessMask =vk:AccessFlagBits::eTransferRead;bufMemBarrierStaging.buffer = uniformStagingBuffer;bufMemBarrierStaging.offset = 0;bufMemBarrierStaging.size = sizeof(工具:UniformBufferObject );//第二个屏障:使可用/可见的vk从暂存缓冲区转移到设备本地缓冲区:BufferMemoryBarrier;bufMemBarrier.srcAccessMask =vk:AccessFlagBits::eTransferW区;bufMemBarrier.dstAccessMask =vk:AccessFlagBits:eUniformRead:AccessFlagBits::eUniformRead:AccessFlagBits::eShaderRead;bufMemBarrier.buffer = dataBuffer;bufMemBarrier.offset = dataBufferOffsets2;bufMemBarrier.size =UniformBufferObject;对于( size_t i= 0;i< cmdBuffers.size();i++ ){ //begin命令缓冲器cmdBuffersi.pipelineBarrier( vk::管线DependencyFlagBits::eHost,//srcPipelineStage::管道DependencyFlagBits::eTransfer,//dstPipelineStage (vk::DependencyFlagBits) 0,nullptr,//memBarrier bufMemBarrierStaging,nullptr // buffer );vk:BufferCopy;//填充适当的cmdBuffersi.copyBuffer( uniformStagingBuffer,dataBuffer,copyRegion );cmdBuffersi.pipelineBarrier( vk::管道DependencyFlagBits:eTransfer,//srcPipelineStage::管线DependencyFlagBits::eVertexShader,//dstPipelineStage (vk::DependencyFlagBits) 0,nullptr,//memBarrier,nullptr //imgBarrier );/renderpass和绘图等等。 使用 命名空间工具{ struct UniformBufferObject { glm::mat4模型;glm::mat4视图;glm::mat4 proj;};};vk:Buffer uniformStagingBuffer;vk::DeviceMemory uniformStagingMemory;//dataBuffer也包含顶点和索引数据,是设备本地vk::dataBuffer;vk::DeviceMemory dataBufferMemory;vk::vector dataBufferOffsets;std::vector cmdBuffers; 我在使用vkcpp (https://github.com/KhronosGroup/Vulkan-Hpp)。 这种非流动动画缺少数据一致性的原因是--而我试图实现这一点是一个错误吗?

提前感谢!

编辑:第2部分的问题是缺少同步;在呈现之前,暂存缓冲区在读取之前(部分)被更新。(感谢您澄清了可用内存/可见内存之间的区别)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-13 21:10:33

如果暂存缓冲区内存不是主机相干的,那么您还需要在memcpy之后进行vkFlushMappedMemoryRanges (内存可以保持映射)。如果不这样做,就无法保证数据对gpu是可见的。

第一个障碍(传输的宿主)实际上并不需要;提交时有一个隐含的障碍。

我看到的另一个问题是,您只有一个暂存缓冲区,这意味着您需要等待上一帧完成后才能上载新数据。

如果提到“毁灭”意味着你分配每帧..。首先,您必须等待销毁,直到所有提交的命令缓冲区使用完成,第二,不要这样做。GPU端的分配是昂贵的,相反,更喜欢分配一次并使用环缓冲区.

票数 2
EN

Stack Overflow用户

发布于 2016-11-13 22:03:51

广告1.

可用和可见是内存依赖的两部分。几乎两者都必须发生,才能成为有效的内存依赖。

您可以将其视为一个状态序列:

资源是由src→写成的,src→使dst所使用的dst→可见。

它的目的是缓存的一致性。规范试图避免“缓存”这个词变得更抽象。

您负责提供可用和可见的。可以执行的操作包括障碍、事件、连贯映射内存或flushinvalidate等.

AFAIK有一个同步规范重写计划和命名可能改变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40577047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档