aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Barbour <tony@LunarG.com>2015-10-21 10:14:48 -0600
committerTony Barbour <tony@LunarG.com>2015-10-21 16:45:30 -0600
commit15a4ef64ff0aab706e64c313e9bfcb8a3bd6b226 (patch)
tree05295428efa8a61b004715e1ce75f352f43d8398
parente92b5e5f5446fbf9c976cf6943bc50a48bce8c31 (diff)
downloadusermoji-15a4ef64ff0aab706e64c313e9bfcb8a3bd6b226.tar.xz
demos: Add mem barrier to change layout to present
This addresses LunarExchange issue 168
-rw-r--r--demos/cube.c30
-rw-r--r--demos/tri.c29
2 files changed, 57 insertions, 2 deletions
diff --git a/demos/cube.c b/demos/cube.c
index 8a2b2235..c5b287a1 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -566,6 +566,24 @@ static void demo_draw_build_cmd(struct demo *demo, VkCmdBuffer cmd_buf)
vkCmdDraw(cmd_buf, 12 * 3, 1, 0, 0);
vkCmdEndRenderPass(cmd_buf);
+ VkImageMemoryBarrier prePresentBarrier = {
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = NULL,
+ .outputMask = VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT,
+ .inputMask = 0,
+ .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ .newLayout = VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .destQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
+ };
+
+ prePresentBarrier.image = demo->buffers[demo->current_buffer].image;
+ VkImageMemoryBarrier *pmemory_barrier = &prePresentBarrier;
+ vkCmdPipelineBarrier(cmd_buf, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ VK_FALSE, 1, (const void * const*)&pmemory_barrier);
+
+
err = vkEndCommandBuffer(cmd_buf);
assert(!err);
}
@@ -625,6 +643,14 @@ static void demo_draw(struct demo *demo)
err = vkQueueWaitSemaphore(demo->queue, presentCompleteSemaphore);
assert(!err);
+ // Assume the command buffer has been run on current_buffer before so
+ // we need to set the image layout back to COLOR_ATTACHMENT_OPTIMAL
+ demo_set_image_layout(demo, demo->buffers[demo->current_buffer].image,
+ VK_IMAGE_ASPECT_COLOR_BIT,
+ VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ demo_flush_init_cmd(demo);
+
// FIXME/TODO: DEAL WITH VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR
err = vkQueueSubmit(demo->queue, 1, &demo->buffers[demo->current_buffer].cmd,
nullFence);
@@ -788,10 +814,12 @@ static void demo_prepare_buffers(struct demo *demo)
demo->buffers[i].image = swapchainImages[i];
+ // Render loop will expect image to have been used before and in VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR
+ // layout and will change to COLOR_ATTACHMENT_OPTIMAL, so init the image to that state
demo_set_image_layout(demo, demo->buffers[i].image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR);
color_image_view.image = demo->buffers[i].image;
diff --git a/demos/tri.c b/demos/tri.c
index a749f421..dc12f071 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -409,6 +409,23 @@ static void demo_draw_build_cmd(struct demo *demo)
vkCmdDraw(demo->draw_cmd, 3, 1, 0, 0);
vkCmdEndRenderPass(demo->draw_cmd);
+ VkImageMemoryBarrier prePresentBarrier = {
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .pNext = NULL,
+ .outputMask = VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT,
+ .inputMask = 0,
+ .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ .newLayout = VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .destQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
+ };
+
+ prePresentBarrier.image = demo->buffers[demo->current_buffer].image;
+ VkImageMemoryBarrier *pmemory_barrier = &prePresentBarrier;
+ vkCmdPipelineBarrier(demo->draw_cmd, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ VK_FALSE, 1, (const void * const*)&pmemory_barrier);
+
err = vkEndCommandBuffer(demo->draw_cmd);
assert(!err);
}
@@ -444,6 +461,14 @@ static void demo_draw(struct demo *demo)
err = vkQueueWaitSemaphore(demo->queue, presentCompleteSemaphore);
assert(!err);
+ // Assume the command buffer has been run on current_buffer before so
+ // we need to set the image layout back to COLOR_ATTACHMENT_OPTIMAL
+ demo_set_image_layout(demo, demo->buffers[demo->current_buffer].image,
+ VK_IMAGE_ASPECT_COLOR_BIT,
+ VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ demo_flush_init_cmd(demo);
+
// FIXME/TODO: DEAL WITH VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR
demo_draw_build_cmd(demo);
VkFence nullFence = { VK_NULL_HANDLE };
@@ -595,10 +620,12 @@ static void demo_prepare_buffers(struct demo *demo)
demo->buffers[i].image = swapchainImages[i];
+ // Render loop will expect image to have been used before and in VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR
+ // layout and will change to COLOR_ATTACHMENT_OPTIMAL, so init the image to that state
demo_set_image_layout(demo, demo->buffers[i].image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR);
color_attachment_view.image = demo->buffers[i].image;