|
@@ -3,8 +3,15 @@
|
|
|
|
|
|
// Implemented features:
|
|
// Implemented features:
|
|
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
|
|
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
|
|
-// Missing features:
|
|
|
|
-// [ ] Renderer: User texture binding. Changes of ImTextureID aren't supported by this backend! See https://github.com/ocornut/imgui/pull/914
|
|
|
|
|
|
+// [!] Renderer: User texture binding. Use 'VkDescriptorSet' as ImTextureID. Read the FAQ about ImTextureID! See https://github.com/ocornut/imgui/pull/914 for discussions.
|
|
|
|
+
|
|
|
|
+// Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'.
|
|
|
|
+// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
|
|
|
|
+// To build this on 32-bit systems and support texture changes:
|
|
|
|
+// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in our .vcxproj files)
|
|
|
|
+// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
|
|
|
|
+// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
|
|
|
|
+// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in our batch files)
|
|
|
|
|
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
|
@@ -57,6 +64,11 @@
|
|
#include "imgui_impl_vulkan.h"
|
|
#include "imgui_impl_vulkan.h"
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
+// Visual Studio warnings
|
|
|
|
+#ifdef _MSC_VER
|
|
|
|
+#pragma warning (disable: 4127) // condition expression is constant
|
|
|
|
+#endif
|
|
|
|
+
|
|
// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData()
|
|
// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData()
|
|
// [Please zero-clear before use!]
|
|
// [Please zero-clear before use!]
|
|
struct ImGui_ImplVulkanH_FrameRenderBuffers
|
|
struct ImGui_ImplVulkanH_FrameRenderBuffers
|
|
@@ -531,6 +543,14 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
|
|
|
|
// Bind DescriptorSet with font or user texture
|
|
// Bind DescriptorSet with font or user texture
|
|
VkDescriptorSet desc_set[1] = { (VkDescriptorSet)pcmd->TextureId };
|
|
VkDescriptorSet desc_set[1] = { (VkDescriptorSet)pcmd->TextureId };
|
|
|
|
+ #if UINTPTR_MAX == 0xffffffff
|
|
|
|
+ if (sizeof(ImTextureID) < sizeof(ImU64))
|
|
|
|
+ {
|
|
|
|
+ // We don't support texture switches if ImTextureID hasn't been redefined to be 64-bit. Do a flaky check that other textures haven't been used.
|
|
|
|
+ IM_ASSERT(pcmd->TextureId == (ImTextureID)bd->FontDescriptorSet);
|
|
|
|
+ desc_set[0] = bd->FontDescriptorSet;
|
|
|
|
+ }
|
|
|
|
+ #endif
|
|
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL);
|
|
vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL);
|
|
|
|
|
|
// Draw
|
|
// Draw
|
|
@@ -1071,7 +1091,7 @@ void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count)
|
|
|
|
|
|
// Register a texture
|
|
// Register a texture
|
|
// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions.
|
|
// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions.
|
|
-ImTextureID ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout)
|
|
|
|
|
|
+VkDescriptorSet ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout)
|
|
{
|
|
{
|
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
@@ -1102,7 +1122,7 @@ ImTextureID ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_vie
|
|
write_desc[0].pImageInfo = desc_image;
|
|
write_desc[0].pImageInfo = desc_image;
|
|
vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, NULL);
|
|
vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, NULL);
|
|
}
|
|
}
|
|
- return (ImTextureID)descriptor_set;
|
|
|
|
|
|
+ return descriptor_set;
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|