我的问题有两部分:
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部分的问题是缺少同步;在呈现之前,暂存缓冲区在读取之前(部分)被更新。(感谢您澄清了可用内存/可见内存之间的区别)。
发布于 2016-11-13 21:10:33
如果暂存缓冲区内存不是主机相干的,那么您还需要在memcpy之后进行vkFlushMappedMemoryRanges
(内存可以保持映射)。如果不这样做,就无法保证数据对gpu是可见的。
第一个障碍(传输的宿主)实际上并不需要;提交时有一个隐含的障碍。
我看到的另一个问题是,您只有一个暂存缓冲区,这意味着您需要等待上一帧完成后才能上载新数据。
如果提到“毁灭”意味着你分配每帧..。首先,您必须等待销毁,直到所有提交的命令缓冲区使用完成,第二,不要这样做。GPU端的分配是昂贵的,相反,更喜欢分配一次并使用环缓冲区.
发布于 2016-11-13 22:03:51
广告1.
可用和可见是内存依赖的两部分。几乎两者都必须发生,才能成为有效的内存依赖。
您可以将其视为一个状态序列:
资源是由src
→写成的,src
→使dst
所使用的dst
→可见。
它的目的是缓存的一致性。规范试图避免“缓存”这个词变得更抽象。
您负责提供可用和可见的。可以执行的操作包括障碍、事件、连贯映射内存或flush
和invalidate
等.
AFAIK有一个同步规范重写计划和命名可能改变。
https://stackoverflow.com/questions/40577047
复制相似问题