aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaebaek Seo <duke.acacia@gmail.com>2018-11-15 11:10:03 -0500
committerGitHub <noreply@github.com>2018-11-15 11:10:03 -0500
commit540f53775169e3fa3577b2701407c0741841faf6 (patch)
treee608b637ebbb0a4963c9ed8290fd8f9486541c37 /src
parentbd478ba2d65601db017612cdb1e17474bb1f5b80 (diff)
downloadamber-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.cc1
-rw-r--r--src/vulkan/image.cc1
-rw-r--r--src/vulkan/resource.cc50
-rw-r--r--src/vulkan/resource.h4
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, &region);
+ 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, &copy_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,