demos: Add semaphore between queue and present
authorTony Barbour <tony@LunarG.com>
Mon, 20 Jun 2016 16:44:08 +0000 (10:44 -0600)
committerTony Barbour <tony@LunarG.com>
Mon, 20 Jun 2016 19:12:52 +0000 (13:12 -0600)
LeX #548

Change-Id: Ic34266d759923f2856cbd6efc9e5bdcfd193c366

demos/cube.c
demos/tri.c

index 608a81c..cc89d97 100644 (file)
@@ -708,18 +708,22 @@ void demo_update_data_buffer(struct demo *demo) {
 
 static void demo_draw(struct demo *demo) {
     VkResult U_ASSERT_ONLY err;
-    VkSemaphore imageAcquiredSemaphore;
-    VkSemaphoreCreateInfo imageAcquiredSemaphoreCreateInfo = {
+    VkSemaphore imageAcquiredSemaphore, drawCompleteSemaphore;
+    VkSemaphoreCreateInfo semaphoreCreateInfo = {
         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
         .pNext = NULL,
         .flags = 0,
     };
     VkFence nullFence = VK_NULL_HANDLE;
 
-    err = vkCreateSemaphore(demo->device, &imageAcquiredSemaphoreCreateInfo,
+    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
                             NULL, &imageAcquiredSemaphore);
     assert(!err);
 
+    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
+                            NULL, &drawCompleteSemaphore);
+    assert(!err);
+
     // Get the index of the next available swapchain image:
     err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,
                                       imageAcquiredSemaphore,
@@ -731,6 +735,7 @@ static void demo_draw(struct demo *demo) {
         demo_resize(demo);
         demo_draw(demo);
         vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
+        vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
         return;
     } else if (err == VK_SUBOPTIMAL_KHR) {
         // demo->swapchain is not as optimal as it could be, but the platform's
@@ -756,8 +761,8 @@ static void demo_draw(struct demo *demo) {
                                 .commandBufferCount = 1,
                                 .pCommandBuffers =
                                     &demo->buffers[demo->current_buffer].cmd,
-                                .signalSemaphoreCount = 0,
-                                .pSignalSemaphores = NULL};
+                                .signalSemaphoreCount = 1,
+                                .pSignalSemaphores = &drawCompleteSemaphore};
 
     err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
     assert(!err);
@@ -768,6 +773,8 @@ static void demo_draw(struct demo *demo) {
         .swapchainCount = 1,
         .pSwapchains = &demo->swapchain,
         .pImageIndices = &demo->current_buffer,
+        .waitSemaphoreCount = 1,
+        .pWaitSemaphores = &drawCompleteSemaphore,
     };
 
     // TBD/TODO: SHOULD THE "present" PARAMETER BE "const" IN THE HEADER?
@@ -787,6 +794,7 @@ static void demo_draw(struct demo *demo) {
     assert(err == VK_SUCCESS);
 
     vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
+    vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
 }
 
 static void demo_prepare_buffers(struct demo *demo) {
index 7acc561..1db0f82 100644 (file)
@@ -530,17 +530,21 @@ static void demo_draw_build_cmd(struct demo *demo) {
 
 static void demo_draw(struct demo *demo) {
     VkResult U_ASSERT_ONLY err;
-    VkSemaphore imageAcquiredSemaphore;
-    VkSemaphoreCreateInfo imageAcquiredSemaphoreCreateInfo = {
+    VkSemaphore imageAcquiredSemaphore, drawCompleteSemaphore;
+    VkSemaphoreCreateInfo semaphoreCreateInfo = {
         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
         .pNext = NULL,
         .flags = 0,
     };
 
-    err = vkCreateSemaphore(demo->device, &imageAcquiredSemaphoreCreateInfo,
+    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
                             NULL, &imageAcquiredSemaphore);
     assert(!err);
 
+    err = vkCreateSemaphore(demo->device, &semaphoreCreateInfo,
+                            NULL, &drawCompleteSemaphore);
+    assert(!err);
+
     // Get the index of the next available swapchain image:
     err = demo->fpAcquireNextImageKHR(demo->device, demo->swapchain, UINT64_MAX,
                                       imageAcquiredSemaphore,
@@ -552,6 +556,7 @@ static void demo_draw(struct demo *demo) {
         demo_resize(demo);
         demo_draw(demo);
         vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
+        vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
         return;
     } else if (err == VK_SUBOPTIMAL_KHR) {
         // demo->swapchain is not as optimal as it could be, but the platform's
@@ -578,8 +583,8 @@ static void demo_draw(struct demo *demo) {
                                 .pWaitDstStageMask = &pipe_stage_flags,
                                 .commandBufferCount = 1,
                                 .pCommandBuffers = &demo->draw_cmd,
-                                .signalSemaphoreCount = 0,
-                                .pSignalSemaphores = NULL};
+                                .signalSemaphoreCount = 1,
+                                .pSignalSemaphores = &drawCompleteSemaphore};
 
     err = vkQueueSubmit(demo->queue, 1, &submit_info, nullFence);
     assert(!err);
@@ -590,6 +595,8 @@ static void demo_draw(struct demo *demo) {
         .swapchainCount = 1,
         .pSwapchains = &demo->swapchain,
         .pImageIndices = &demo->current_buffer,
+        .waitSemaphoreCount = 1,
+        .pWaitSemaphores = &drawCompleteSemaphore,
     };
 
     // TBD/TODO: SHOULD THE "present" PARAMETER BE "const" IN THE HEADER?
@@ -609,6 +616,7 @@ static void demo_draw(struct demo *demo) {
     assert(err == VK_SUCCESS);
 
     vkDestroySemaphore(demo->device, imageAcquiredSemaphore, NULL);
+    vkDestroySemaphore(demo->device, drawCompleteSemaphore, NULL);
 }
 
 static void demo_prepare_buffers(struct demo *demo) {