From 774d1f37bd627f25705547e69bdbe1da69cd820e Mon Sep 17 00:00:00 2001 From: saschawillems Date: Wed, 9 Mar 2016 21:37:46 +0100 Subject: [PATCH] Use wait and signal semaphores, renamed main for android triangle example --- .../triangle.NativeActivity.vcxproj | 4 +- .../triangle.NativeActivity.vcxproj.filters | 2 +- .../{main.cpp => triangle.cpp} | 38 ++++++++++++------- 3 files changed, 28 insertions(+), 16 deletions(-) rename android/triangle/triangle.NativeActivity/{main.cpp => triangle.cpp} (97%) diff --git a/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj b/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj index 3fb4842e..be2f0ce9 100644 --- a/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj +++ b/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj @@ -149,7 +149,7 @@ CompileAsCpp VK_NO_PROTOTYPES;VK_USE_PLATFORM_ANDROID_KHR;__STDINT_LIMITS c++11 - ../../../external;../../../base;../../../external/glm;%(AdditionalIncludeDirectories) + ../../../external;../../../base;../../../external/glm;../../base;%(AdditionalIncludeDirectories) %(LibraryDependencies);GLESv1_CM;EGL; @@ -215,7 +215,7 @@ - + diff --git a/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj.filters b/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj.filters index 923af197..f60379e1 100644 --- a/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj.filters +++ b/android/triangle/triangle.NativeActivity/triangle.NativeActivity.vcxproj.filters @@ -7,8 +7,8 @@ - + \ No newline at end of file diff --git a/android/triangle/triangle.NativeActivity/main.cpp b/android/triangle/triangle.NativeActivity/triangle.cpp similarity index 97% rename from android/triangle/triangle.NativeActivity/main.cpp rename to android/triangle/triangle.NativeActivity/triangle.cpp index f34c712e..a8df705d 100644 --- a/android/triangle/triangle.NativeActivity/main.cpp +++ b/android/triangle/triangle.NativeActivity/triangle.cpp @@ -17,7 +17,7 @@ #include #define GLM_FORCE_RADIANS -#define GLM_DEPTH_ZERO_TO_ONE +#define GLM_FORCE_DEPTH_ZERO_TO_ONE #include "glm/glm.hpp" #include "glm/gtc/matrix_transform.hpp" @@ -59,6 +59,11 @@ struct VulkanExample VkPhysicalDeviceMemoryProperties deviceMemoryProperties; std::vector shaderModules; + struct { + VkSemaphore presentComplete; + VkSemaphore submitSignal; + } semaphores; + struct { VkBuffer buf; VkDeviceMemory mem; @@ -251,6 +256,15 @@ struct VulkanExample VkResult err = vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache); assert(!err); + // Create semaphores for synchronization + VkSemaphoreCreateInfo semaphoreCreateInfo = {}; + semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + + err = vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphores.presentComplete); + assert(!err); + err = vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphores.submitSignal); + assert(!err); + createSetupCommandBuffer(); startSetupCommandBuffer(); @@ -318,6 +332,9 @@ struct VulkanExample vkDestroyImage(device, depthStencil.image, nullptr); vkFreeMemory(device, depthStencil.mem, nullptr); + vkDestroySemaphore(device, semaphores.presentComplete, nullptr); + vkDestroySemaphore(device, semaphores.submitSignal, nullptr); + vkDestroyPipelineCache(device, pipelineCache, nullptr); vkDestroyDevice(device, nullptr); vkDestroyInstance(instance, nullptr); @@ -983,27 +1000,24 @@ struct VulkanExample void draw() { VkResult err; - VkSemaphore presentCompleteSemaphore; - VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = {}; - presentCompleteSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - presentCompleteSemaphoreCreateInfo.pNext = NULL; - - err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore); - assert(!err); // Get next image in the swap chain (back/front buffer) - err = swapChain.acquireNextImage(presentCompleteSemaphore, ¤tBuffer); + err = swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer); assert(!err); // The submit infor strcuture contains a list of // command buffers and semaphores to be submitted to a queue // If you want to submit multiple command buffers, pass an array + VkPipelineStageFlags pipelineStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; VkSubmitInfo submitInfo = {}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.waitSemaphoreCount = 1; - submitInfo.pWaitSemaphores = &presentCompleteSemaphore; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; + submitInfo.pWaitDstStageMask = &pipelineStages; + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.submitSignal; // Submit to the graphics queue err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); @@ -1011,11 +1025,9 @@ struct VulkanExample // Present the current buffer to the swap chain // This will display the image - err = swapChain.queuePresent(queue, currentBuffer); + err = swapChain.queuePresent(queue, currentBuffer, semaphores.submitSignal); assert(!err); - vkDestroySemaphore(device, presentCompleteSemaphore, nullptr); - // Add a post present image memory barrier // This will transform the frame buffer color attachment back // to it's initial layout after it has been presented to the