From cdeef65b052c47303781cc695b30fdf890dfbfa7 Mon Sep 17 00:00:00 2001 From: omar Date: Mon, 12 Mar 2018 17:37:28 +0100 Subject: [PATCH] Examples: Vulkan: Passing Queue, QueueFamily to binding. Fixed scissor (fixed in master). ImGui_ImplVulkanH_DestroyWindowData() waits for device to be idle. (#1042) --- examples/imgui_impl_vulkan.cpp | 17 +++++++++++++---- examples/imgui_impl_vulkan.h | 2 ++ examples/sdl_vulkan_example/main.cpp | 7 +++++-- examples/vulkan_example/main.cpp | 7 +++++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/examples/imgui_impl_vulkan.cpp b/examples/imgui_impl_vulkan.cpp index 839d737c..8864c3d5 100644 --- a/examples/imgui_impl_vulkan.cpp +++ b/examples/imgui_impl_vulkan.cpp @@ -29,6 +29,8 @@ static const VkAllocationCallbacks* g_Allocator = NULL; static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; static VkInstance g_Instance = VK_NULL_HANDLE; static VkDevice g_Device = VK_NULL_HANDLE; +static uint32_t g_QueueFamily = (uint32_t)-1; +static VkQueue g_Queue = VK_NULL_HANDLE; static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE; static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; static VkRenderPass g_RenderPass = VK_NULL_HANDLE; @@ -298,7 +300,7 @@ void ImGui_ImplVulkan_RenderDrawData(VkCommandBuffer command_buffer, ImDrawData* // Apply scissor/clipping rectangle // FIXME: We could clamp width/height based on clamped min/max values. VkRect2D scissor; - scissor.offset.x = (int32_t)(pcmd->ClipRect.x - io.DisplayPos.x) > 0 ? (int32_t)(pcmd->ClipRect.x - io.DisplayPos.y) : 0; + scissor.offset.x = (int32_t)(pcmd->ClipRect.x - io.DisplayPos.x) > 0 ? (int32_t)(pcmd->ClipRect.x - io.DisplayPos.x) : 0; scissor.offset.y = (int32_t)(pcmd->ClipRect.y - io.DisplayPos.y) > 0 ? (int32_t)(pcmd->ClipRect.y - io.DisplayPos.y) : 0; scissor.extent.width = (uint32_t)(pcmd->ClipRect.z - pcmd->ClipRect.x); scissor.extent.height = (uint32_t)(pcmd->ClipRect.w - pcmd->ClipRect.y + 1); // FIXME: Why +1 here? @@ -624,7 +626,7 @@ bool ImGui_ImplVulkan_CreateDeviceObjects() VkDynamicState dynamic_states[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR }; VkPipelineDynamicStateCreateInfo dynamic_state = {}; dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - dynamic_state.dynamicStateCount = 2; + dynamic_state.dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states); dynamic_state.pDynamicStates = dynamic_states; VkGraphicsPipelineCreateInfo info = {}; @@ -692,13 +694,19 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend IM_ASSERT(info->Instance != NULL); IM_ASSERT(info->PhysicalDevice != NULL); IM_ASSERT(info->Device != NULL); + IM_ASSERT(info->Queue != NULL); + IM_ASSERT(info->DescriptorPool != NULL); + IM_ASSERT(render_pass != NULL); - g_Allocator = info->Allocator; + g_Instance = info->Instance; g_PhysicalDevice = info->PhysicalDevice; g_Device = info->Device; + g_QueueFamily = info->QueueFamily; + g_Queue = info->Queue; g_RenderPass = render_pass; g_PipelineCache = info->PipelineCache; g_DescriptorPool = info->DescriptorPool; + g_Allocator = info->Allocator; g_CheckVkResultFn = info->CheckVkResultFn; ImGuiIO& io = ImGui::GetIO(); @@ -999,6 +1007,7 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice void ImGui_ImplVulkanH_DestroyWindowData(VkInstance instance, VkDevice device, ImGui_ImplVulkan_WindowData* wd, const VkAllocationCallbacks* allocator) { + vkDeviceWaitIdle(device); for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++) { ImGui_ImplVulkan_FrameData* fd = &wd->Frames[i]; @@ -1027,7 +1036,7 @@ void ImGui_ImplVulkanH_DestroyWindowData(VkInstance instance, VkDevice device, I struct ImGuiPlatformDataVulkan { - ImGui_ImplVulkan_WindowData Wd; + ImGui_ImplVulkan_WindowData WindowData; ImGuiPlatformDataVulkan() { } ~ImGuiPlatformDataVulkan() { } diff --git a/examples/imgui_impl_vulkan.h b/examples/imgui_impl_vulkan.h index 50a223d1..afabbb74 100644 --- a/examples/imgui_impl_vulkan.h +++ b/examples/imgui_impl_vulkan.h @@ -18,6 +18,8 @@ struct ImGui_ImplVulkan_InitInfo VkInstance Instance; VkPhysicalDevice PhysicalDevice; VkDevice Device; + uint32_t QueueFamily; + VkQueue Queue; VkPipelineCache PipelineCache; VkDescriptorPool DescriptorPool; const VkAllocationCallbacks* Allocator; diff --git a/examples/sdl_vulkan_example/main.cpp b/examples/sdl_vulkan_example/main.cpp index d896b839..7ed0f997 100644 --- a/examples/sdl_vulkan_example/main.cpp +++ b/examples/sdl_vulkan_example/main.cpp @@ -38,8 +38,8 @@ static void check_vk_result(VkResult err) #ifdef IMGUI_VULKAN_DEBUG_REPORT static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { - (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguemnts - printf("[vulkan] ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); + (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments + fprintf(stderr, "[vulkan] ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); return VK_FALSE; } #endif // IMGUI_VULKAN_DEBUG_REPORT @@ -348,10 +348,13 @@ int main(int, char**) io.ConfigFlags |= ImGuiConfigFlags_PlatformNoTaskBar; //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + // Setup Vulkan binding ImGui_ImplVulkan_InitInfo init_info = {}; init_info.Instance = g_Instance; init_info.PhysicalDevice = g_PhysicalDevice; init_info.Device = g_Device; + init_info.QueueFamily = g_QueueFamily; + init_info.Queue = g_Queue; init_info.PipelineCache = g_PipelineCache; init_info.DescriptorPool = g_DescriptorPool; init_info.Allocator = g_Allocator; diff --git a/examples/vulkan_example/main.cpp b/examples/vulkan_example/main.cpp index fbec7a6d..3e39cb06 100644 --- a/examples/vulkan_example/main.cpp +++ b/examples/vulkan_example/main.cpp @@ -41,8 +41,8 @@ static void check_vk_result(VkResult err) #ifdef IMGUI_VULKAN_DEBUG_REPORT static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { - (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguemnts - printf("[vulkan] ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); + (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments + fprintf(stderr, "[vulkan] ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); return VK_FALSE; } #endif // IMGUI_VULKAN_DEBUG_REPORT @@ -357,10 +357,13 @@ int main(int, char**) io.ConfigFlags |= ImGuiConfigFlags_PlatformNoTaskBar; //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + // Setup Vulkan binding ImGui_ImplVulkan_InitInfo init_info = {}; init_info.Instance = g_Instance; init_info.PhysicalDevice = g_PhysicalDevice; init_info.Device = g_Device; + init_info.QueueFamily = g_QueueFamily; + init_info.Queue = g_Queue; init_info.PipelineCache = g_PipelineCache; init_info.DescriptorPool = g_DescriptorPool; init_info.Allocator = g_Allocator;