diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index 01d00e0ca..412ddabda 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -72,6 +72,7 @@ Other changes:
platforms not supporting VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR. (#8222) [@Zer0xFF]
- Backends: Vulkan: Added a few more ImGui_ImplVulkanH_XXX helper functions
primarily for the purpose of making our examples simpler.
+- Examples: Added Win32+Vulkan example for completeness. (#8180) [@jristic]
-----------------------------------------------------------------------
diff --git a/docs/EXAMPLES.md b/docs/EXAMPLES.md
index f84f9497b..224beb1c1 100644
--- a/docs/EXAMPLES.md
+++ b/docs/EXAMPLES.md
@@ -167,9 +167,13 @@ DirectX12 example, Windows only.
This is quite long and tedious, because: DirectX12.
[example_win32_opengl3/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_opengl3/)
-Raw Windows + OpenGL3 + example (modern, programmable pipeline)
+Raw Windows + OpenGL3 example (modern, programmable pipeline)
= main.cpp + imgui_impl_win32.cpp + imgui_impl_opengl3.cpp
+[example_win32_vulkan/](https://github.com/ocornut/imgui/blob/master/examples/example_win32_vulkan/)
+Raw Windows + Vulkan example
+= main.cpp + imgui_impl_win32.cpp + imgui_impl_vulkan.cpp
+
### Miscellaneous
diff --git a/examples/example_glfw_vulkan/main.cpp b/examples/example_glfw_vulkan/main.cpp
index 1197ca4e6..9f8dced2f 100644
--- a/examples/example_glfw_vulkan/main.cpp
+++ b/examples/example_glfw_vulkan/main.cpp
@@ -52,7 +52,7 @@ static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE;
static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE;
static ImGui_ImplVulkanH_Window g_MainWindowData;
-static int g_MinImageCount = 2;
+static uint32_t g_MinImageCount = 2;
static bool g_SwapChainRebuild = false;
static void glfw_error_callback(int error, const char* description)
diff --git a/examples/example_win32_vulkan/example_win32_vulkan.vcxproj b/examples/example_win32_vulkan/example_win32_vulkan.vcxproj
index cbf01a4ab..dab8afd4e 100644
--- a/examples/example_win32_vulkan/example_win32_vulkan.vcxproj
+++ b/examples/example_win32_vulkan/example_win32_vulkan.vcxproj
@@ -19,36 +19,35 @@
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}
- example_win32_vulkan
- 10.0
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}
+ example_win32_directx11
Application
true
Unicode
- v143
+ v140
Application
true
Unicode
- v143
+ v140
Application
false
true
Unicode
- v143
+ v140
Application
false
true
Unicode
- v143
+ v140
@@ -120,6 +119,7 @@
true
..\..;..\..\backends;%VULKAN_SDK%\include;%(AdditionalIncludeDirectories)
_UNICODE;UNICODE;%(PreprocessorDefinitions)
+ false
/utf-8 %(AdditionalOptions)
@@ -169,11 +169,9 @@
+
-
-
-
diff --git a/examples/example_win32_vulkan/example_win32_vulkan.vcxproj.filters b/examples/example_win32_vulkan/example_win32_vulkan.vcxproj.filters
index a514e6830..c91a95810 100644
--- a/examples/example_win32_vulkan/example_win32_vulkan.vcxproj.filters
+++ b/examples/example_win32_vulkan/example_win32_vulkan.vcxproj.filters
@@ -2,10 +2,10 @@
- {fb3d294f-51ec-478e-a627-25831c80fefd}
+ {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}
- {4f33ddea-9910-456d-b868-4267eb3c2b19}
+ {08e36723-ce4f-4cff-9662-c40801cf1acf}
@@ -18,10 +18,10 @@
imgui
-
+
sources
-
+
sources
@@ -38,28 +38,26 @@
imgui
-
- sources
+
+ imgui
sources
+
+ sources
+
imgui
-
- imgui
-
+
+ imgui
+
imgui
-
-
- imgui
-
-
\ No newline at end of file
diff --git a/examples/example_win32_vulkan/main.cpp b/examples/example_win32_vulkan/main.cpp
index f3f6367b0..3fabf7a2d 100644
--- a/examples/example_win32_vulkan/main.cpp
+++ b/examples/example_win32_vulkan/main.cpp
@@ -1,4 +1,4 @@
-// Dear ImGui: standalone example application for Vulkan
+// Dear ImGui: standalone example application for Win32 + Vulkan
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
@@ -74,35 +74,6 @@ static bool IsExtensionAvailable(const ImVector& properti
return false;
}
-static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice()
-{
- uint32_t gpu_count;
- VkResult err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, nullptr);
- check_vk_result(err);
- IM_ASSERT(gpu_count > 0);
-
- ImVector gpus;
- gpus.resize(gpu_count);
- err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus.Data);
- check_vk_result(err);
-
- // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers
- // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple
- // dedicated GPUs) is out of scope of this sample.
- for (VkPhysicalDevice& device : gpus)
- {
- VkPhysicalDeviceProperties properties;
- vkGetPhysicalDeviceProperties(device, &properties);
- if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)
- return device;
- }
-
- // Use first GPU (Integrated) is a Discrete one is not available.
- if (gpu_count > 0)
- return gpus[0];
- return VK_NULL_HANDLE;
-}
-
static void SetupVulkan(ImVector instance_extensions)
{
VkResult err;
@@ -166,23 +137,12 @@ static void SetupVulkan(ImVector instance_extensions)
}
// Select Physical Device (GPU)
- g_PhysicalDevice = SetupVulkan_SelectPhysicalDevice();
+ g_PhysicalDevice = ImGui_ImplVulkanH_SelectPhysicalDevice(g_Instance);
+ IM_ASSERT(g_PhysicalDevice != VK_NULL_HANDLE);
// Select graphics queue family
- {
- uint32_t count;
- vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, nullptr);
- VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count);
- vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues);
- for (uint32_t i = 0; i < count; i++)
- if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
- {
- g_QueueFamily = i;
- break;
- }
- free(queues);
- IM_ASSERT(g_QueueFamily != (uint32_t)-1);
- }
+ g_QueueFamily = ImGui_ImplVulkanH_SelectQueueFamilyIndex(g_PhysicalDevice);
+ IM_ASSERT(g_QueueFamily != (uint32_t)-1);
// Create Logical Device (with 1 queue)
{
@@ -257,7 +217,7 @@ static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface
wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace);
// Select Present Mode
-#ifdef APP_UNLIMITED_FRAME_RATE
+#ifdef APP_USE_UNLIMITED_FRAME_RATE
VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR };
#else
VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR };
@@ -387,7 +347,7 @@ int main(int, char**)
//ImGui_ImplWin32_EnableDpiAwareness();
WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr };
::RegisterClassExW(&wc);
- HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Vulkan Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr);
+ HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Win32+Vulkan Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr);
ImVector extensions;
extensions.push_back("VK_KHR_surface");
@@ -400,7 +360,7 @@ int main(int, char**)
VkWin32SurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = hwnd;
- createInfo.hinstance = GetModuleHandle(nullptr);
+ createInfo.hinstance = ::GetModuleHandle(nullptr);
if (vkCreateWin32SurfaceKHR(g_Instance, &createInfo, nullptr, &surface) != VK_SUCCESS)
{
printf("Failed to create Vulkan surface.\n");
@@ -408,6 +368,7 @@ int main(int, char**)
}
// Show the window
+ // FIXME: Retrieve client size from window itself.
ImGui_ImplVulkanH_Window* wd = &g_MainWindowData;
SetupVulkanWindow(wd, surface, 1280, 800);
::ShowWindow(hwnd, SW_SHOWDEFAULT);
@@ -525,7 +486,6 @@ int main(int, char**)
// Rendering
ImGui::Render();
-
ImDrawData* draw_data = ImGui::GetDrawData();
const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f);
if (!is_minimized)
@@ -539,10 +499,9 @@ int main(int, char**)
}
}
+ // Cleanup
err = vkDeviceWaitIdle(g_Device);
check_vk_result(err);
-
- // Cleanup
ImGui_ImplVulkan_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
diff --git a/examples/imgui_examples.sln b/examples/imgui_examples.sln
index 3a856462a..85f7451d4 100644
--- a/examples/imgui_examples.sln
+++ b/examples/imgui_examples.sln
@@ -35,7 +35,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl3_sdlrenderer3",
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl3_vulkan", "example_sdl3_vulkan\example_sdl3_vulkan.vcxproj", "{663A7E89-1E42-4222-921C-177F5B5910DF}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_vulkan", "example_win32_vulkan\example_win32_vulkan.vcxproj", "{4CB8C22A-96F8-4D31-B747-FDAA6B742E47}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_vulkan", "example_win32_vulkan\example_win32_vulkan.vcxproj", "{0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -173,14 +173,14 @@ Global
{663A7E89-1E42-4222-921C-177F5B5910DF}.Release|Win32.Build.0 = Release|Win32
{663A7E89-1E42-4222-921C-177F5B5910DF}.Release|x64.ActiveCfg = Release|x64
{663A7E89-1E42-4222-921C-177F5B5910DF}.Release|x64.Build.0 = Release|x64
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Debug|Win32.ActiveCfg = Debug|Win32
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Debug|Win32.Build.0 = Debug|Win32
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Debug|x64.ActiveCfg = Debug|x64
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Debug|x64.Build.0 = Debug|x64
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Release|Win32.ActiveCfg = Release|Win32
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Release|Win32.Build.0 = Release|Win32
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Release|x64.ActiveCfg = Release|x64
- {4CB8C22A-96F8-4D31-B747-FDAA6B742E47}.Release|x64.Build.0 = Release|x64
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Debug|Win32.Build.0 = Debug|Win32
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Debug|x64.ActiveCfg = Debug|x64
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Debug|x64.Build.0 = Debug|x64
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Release|Win32.ActiveCfg = Release|Win32
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Release|Win32.Build.0 = Release|Win32
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Release|x64.ActiveCfg = Release|x64
+ {0A1E32DF-E0F4-4CCE-B3DC-9644C503BD88}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE