summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Faye-Lund <erik.faye-lund@collabora.com>2023-04-04 20:38:57 +0200
committerErik Faye-Lund <erik.faye-lund@collabora.com>2023-04-17 08:53:18 +0200
commit0cc3100fe300d7050d8b2abef125a14682d4f4d2 (patch)
treea967afc4551ad8c2f37554686472570d5737daa3
parentcc6ec4130e6c69e0b9a2da5e5ebf64efac945f02 (diff)
downloadmesa-demos-0cc3100fe300d7050d8b2abef125a14682d4f4d2.tar.gz
vkgears: put barriers around vkCmdUpdateBuffer
Without this, we end up with sync-hazards, it seems. Acked-by: Hoe Hao Cheng <haochengho12907@gmail.com>
-rw-r--r--src/vulkan/vkgears.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/vulkan/vkgears.c b/src/vulkan/vkgears.c
index ad51151f..b6b560a6 100644
--- a/src/vulkan/vkgears.c
+++ b/src/vulkan/vkgears.c
@@ -1361,6 +1361,33 @@ static struct wsi_callbacks wsi_callbacks = {
.exit = wsi_exit,
};
+static void
+buffer_barrier(VkCommandBuffer cmd_buffer,
+ VkPipelineStageFlags src_flags,
+ VkPipelineStageFlags dst_flags,
+ VkAccessFlags src_access,
+ VkAccessFlags dst_access,
+ VkBuffer buffer,
+ VkDeviceSize offset,
+ VkDeviceSize size)
+{
+ vkCmdPipelineBarrier(cmd_buffer,
+ src_flags, dst_flags,
+ 0, 0, NULL,
+ 1, &(VkBufferMemoryBarrier) {
+ .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ .pNext = NULL,
+ .srcAccessMask = src_access,
+ .dstAccessMask = dst_access,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .buffer = buffer,
+ .offset = offset,
+ .size = size,
+ },
+ 0, NULL);
+}
+
int
main(int argc, char *argv[])
{
@@ -1481,8 +1508,22 @@ main(int argc, char *argv[])
struct ubo ubo;
mat4_identity(ubo.projection);
mat4_frustum_vk(ubo.projection, -1.0, 1.0, -h, +h, 5.0f, 60.0f);
+
+ buffer_barrier(swap_chain_data[index].cmd_buffer,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0, 0,
+ ubo_buffer, 0, sizeof(ubo));
+
vkCmdUpdateBuffer(swap_chain_data[index].cmd_buffer, ubo_buffer, 0, sizeof(ubo), &ubo);
+ buffer_barrier(swap_chain_data[index].cmd_buffer,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ ubo_buffer, 0, sizeof(ubo));
+
/* Translate and rotate the view */
float view[16];
mat4_identity(view);