diff options
| author | Tony Barbour <tony@LunarG.com> | 2015-10-21 10:14:48 -0600 |
|---|---|---|
| committer | Tony Barbour <tony@LunarG.com> | 2015-10-21 16:45:30 -0600 |
| commit | 15a4ef64ff0aab706e64c313e9bfcb8a3bd6b226 (patch) | |
| tree | 05295428efa8a61b004715e1ce75f352f43d8398 | |
| parent | e92b5e5f5446fbf9c976cf6943bc50a48bce8c31 (diff) | |
| download | usermoji-15a4ef64ff0aab706e64c313e9bfcb8a3bd6b226.tar.xz | |
demos: Add mem barrier to change layout to present
This addresses LunarExchange issue 168
| -rw-r--r-- | demos/cube.c | 30 | ||||
| -rw-r--r-- | demos/tri.c | 29 |
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; |
