diff options
author | Jaebaek Seo <duke.acacia@gmail.com> | 2018-11-15 11:10:03 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-15 11:10:03 -0500 |
commit | 540f53775169e3fa3577b2701407c0741841faf6 (patch) | |
tree | e608b637ebbb0a4963c9ed8290fd8f9486541c37 /src | |
parent | bd478ba2d65601db017612cdb1e17474bb1f5b80 (diff) | |
download | amber-540f53775169e3fa3577b2701407c0741841faf6.tar.gz |
Vulkan: add memory barrier (#9)
Draw after sending vertex data is not guaranteed currently, as well
as probe after copying frame buffer to host accessible buffer.
This CL adds a memory barrier after copying to the device or to the host
to make sure that memory updates are complete when we access the
associated buffers.
Fixes #9
Diffstat (limited to 'src')
-rw-r--r-- | src/vulkan/buffer.cc | 1 | ||||
-rw-r--r-- | src/vulkan/image.cc | 1 | ||||
-rw-r--r-- | src/vulkan/resource.cc | 50 | ||||
-rw-r--r-- | src/vulkan/resource.h | 4 |
4 files changed, 56 insertions, 0 deletions
diff --git a/src/vulkan/buffer.cc b/src/vulkan/buffer.cc index 4c7d2fe..d71d4bb 100644 --- a/src/vulkan/buffer.cc +++ b/src/vulkan/buffer.cc @@ -68,6 +68,7 @@ void Buffer::CopyToDevice(VkCommandBuffer command) { region.size = GetSize(); vkCmdCopyBuffer(command, GetHostAccessibleBuffer(), buffer_, 1, ®ion); + MemoryBarrier(command); } void Buffer::Shutdown() { diff --git a/src/vulkan/image.cc b/src/vulkan/image.cc index 7eb6df2..0e0f588 100644 --- a/src/vulkan/image.cc +++ b/src/vulkan/image.cc @@ -143,6 +143,7 @@ Result Image::CopyToHost(VkCommandBuffer command) { vkCmdCopyImageToBuffer(command, image_, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, GetHostAccessibleBuffer(), 1, ©_region); + MemoryBarrier(command); return {}; } diff --git a/src/vulkan/resource.cc b/src/vulkan/resource.cc index 69a21a5..5916c28 100644 --- a/src/vulkan/resource.cc +++ b/src/vulkan/resource.cc @@ -21,6 +21,30 @@ namespace amber { namespace vulkan { +namespace { + +VkMemoryBarrier kMemoryBarrierForAll = { + VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, + VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT | + VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | + VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | + VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | + VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT, + VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT | + VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | + VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | + VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | + VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT}; + +} // namespace Resource::Resource(VkDevice device, size_t size, @@ -205,5 +229,31 @@ void Resource::UnMapMemory(VkDeviceMemory memory) { vkUnmapMemory(device_, memory); } +void Resource::MemoryBarrier(VkCommandBuffer command) { + // TODO(jaebaek): Current memory barrier is natively implemented. + // Update it with the following access flags: + // (r = read, w = write) + // + // Host Device + // VertexBuffer host w vertex r + // transfer w transfer r + // + // IndexBuffer host w index r + // transfer w transfer r + // + // FrameBuffer host r color w + // depth/stencil w + // transfer r transfer w + // + // ReadWrite Descriptors host r/w shader r/w + // transfer r/w transfer r/w + // + // ReadOnly Descriptors host w shader r + // transfer w transfer r + vkCmdPipelineBarrier(command, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 1, + &kMemoryBarrierForAll, 0, nullptr, 0, nullptr); +} + } // namespace vulkan } // namespace amber diff --git a/src/vulkan/resource.h b/src/vulkan/resource.h index c2530ae..9bb763c 100644 --- a/src/vulkan/resource.h +++ b/src/vulkan/resource.h @@ -71,6 +71,10 @@ class Resource { Result MapMemory(VkDeviceMemory memory); void UnMapMemory(VkDeviceMemory memory); + // Make all memory operations before calling this method effective i.e., + // prevent hazards caused by out-of-order execution. + void MemoryBarrier(VkCommandBuffer command); + private: uint32_t ChooseMemory(uint32_t memory_type_bits, VkMemoryPropertyFlags flags, |