|
@@ -7,7 +7,7 @@
|
|
// Missing features:
|
|
// 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. Changes of ImTextureID aren't supported by this backend! See https://github.com/ocornut/imgui/pull/914
|
|
|
|
|
|
-// 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.
|
|
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
|
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
|
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
|
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
|
@@ -24,6 +24,8 @@
|
|
|
|
|
|
// CHANGELOG
|
|
// CHANGELOG
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
|
+// 2021-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
|
|
|
+// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
|
|
// 2021-03-22: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize.
|
|
// 2021-03-22: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize.
|
|
// 2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer.
|
|
// 2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer.
|
|
// 2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions().
|
|
// 2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions().
|
|
@@ -90,30 +92,43 @@ struct ImGuiViewportDataVulkan
|
|
};
|
|
};
|
|
|
|
|
|
// Vulkan data
|
|
// Vulkan data
|
|
-static ImGui_ImplVulkan_InitInfo g_VulkanInitInfo = {};
|
|
|
|
-static VkRenderPass g_RenderPass = VK_NULL_HANDLE;
|
|
|
|
-static VkDeviceSize g_BufferMemoryAlignment = 256;
|
|
|
|
-static VkPipelineCreateFlags g_PipelineCreateFlags = 0x00;
|
|
|
|
-static VkDescriptorSetLayout g_DescriptorSetLayout = VK_NULL_HANDLE;
|
|
|
|
-static VkPipelineLayout g_PipelineLayout = VK_NULL_HANDLE;
|
|
|
|
-static VkDescriptorSet g_DescriptorSet = VK_NULL_HANDLE;
|
|
|
|
-static VkPipeline g_Pipeline = VK_NULL_HANDLE;
|
|
|
|
-static uint32_t g_Subpass = 0;
|
|
|
|
-static VkShaderModule g_ShaderModuleVert;
|
|
|
|
-static VkShaderModule g_ShaderModuleFrag;
|
|
|
|
-#ifdef VK_NO_PROTOTYPES
|
|
|
|
-static bool g_FunctionsLoaded = false;
|
|
|
|
-#else
|
|
|
|
-static bool g_FunctionsLoaded = true;
|
|
|
|
-#endif
|
|
|
|
|
|
+struct ImGui_ImplVulkan_Data
|
|
|
|
+{
|
|
|
|
+ ImGui_ImplVulkan_InitInfo VulkanInitInfo;
|
|
|
|
+ VkRenderPass RenderPass;
|
|
|
|
+ VkDeviceSize BufferMemoryAlignment;
|
|
|
|
+ VkPipelineCreateFlags PipelineCreateFlags;
|
|
|
|
+ VkDescriptorSetLayout DescriptorSetLayout;
|
|
|
|
+ VkPipelineLayout PipelineLayout;
|
|
|
|
+ VkDescriptorSet DescriptorSet;
|
|
|
|
+ VkPipeline Pipeline;
|
|
|
|
+ uint32_t Subpass;
|
|
|
|
+ VkShaderModule ShaderModuleVert;
|
|
|
|
+ VkShaderModule ShaderModuleFrag;
|
|
|
|
+
|
|
|
|
+ // Font data
|
|
|
|
+ VkSampler FontSampler;
|
|
|
|
+ VkDeviceMemory FontMemory;
|
|
|
|
+ VkImage FontImage;
|
|
|
|
+ VkImageView FontView;
|
|
|
|
+ VkDeviceMemory UploadBufferMemory;
|
|
|
|
+ VkBuffer UploadBuffer;
|
|
|
|
+
|
|
|
|
+ // Render buffers
|
|
|
|
+ ImGui_ImplVulkanH_WindowRenderBuffers MainWindowRenderBuffers;
|
|
|
|
+
|
|
|
|
+ ImGui_ImplVulkan_Data()
|
|
|
|
+ {
|
|
|
|
+ memset(this, 0, sizeof(*this));
|
|
|
|
+ BufferMemoryAlignment = 256;
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
|
|
-// Font data
|
|
|
|
-static VkSampler g_FontSampler = VK_NULL_HANDLE;
|
|
|
|
-static VkDeviceMemory g_FontMemory = VK_NULL_HANDLE;
|
|
|
|
-static VkImage g_FontImage = VK_NULL_HANDLE;
|
|
|
|
-static VkImageView g_FontView = VK_NULL_HANDLE;
|
|
|
|
-static VkDeviceMemory g_UploadBufferMemory = VK_NULL_HANDLE;
|
|
|
|
-static VkBuffer g_UploadBuffer = VK_NULL_HANDLE;
|
|
|
|
|
|
+// Wrapping access to backend data (to facilitate multiple-contexts stored in io.BackendPlatformUserData)
|
|
|
|
+static ImGui_ImplVulkan_Data* g_Data;
|
|
|
|
+static ImGui_ImplVulkan_Data* ImGui_ImplVulkan_CreateBackendData() { IM_ASSERT(g_Data == NULL); g_Data = IM_NEW(ImGui_ImplVulkan_Data); return g_Data; }
|
|
|
|
+static ImGui_ImplVulkan_Data* ImGui_ImplVulkan_GetBackendData() { return ImGui::GetCurrentContext() ? g_Data : NULL; }
|
|
|
|
+static void ImGui_ImplVulkan_DestroyBackendData() { IM_DELETE(g_Data); g_Data = NULL; }
|
|
|
|
|
|
// Forward Declarations
|
|
// Forward Declarations
|
|
bool ImGui_ImplVulkan_CreateDeviceObjects();
|
|
bool ImGui_ImplVulkan_CreateDeviceObjects();
|
|
@@ -129,6 +144,11 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_devi
|
|
// Vulkan prototypes for use with custom loaders
|
|
// Vulkan prototypes for use with custom loaders
|
|
// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h
|
|
// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h
|
|
#ifdef VK_NO_PROTOTYPES
|
|
#ifdef VK_NO_PROTOTYPES
|
|
|
|
+static bool g_FunctionsLoaded = false;
|
|
|
|
+#else
|
|
|
|
+static bool g_FunctionsLoaded = true;
|
|
|
|
+#endif
|
|
|
|
+#ifdef VK_NO_PROTOTYPES
|
|
#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \
|
|
#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \
|
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \
|
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \
|
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \
|
|
IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \
|
|
@@ -325,7 +345,8 @@ static uint32_t __glsl_shader_frag_spv[] =
|
|
|
|
|
|
static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits)
|
|
static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits)
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
VkPhysicalDeviceMemoryProperties prop;
|
|
VkPhysicalDeviceMemoryProperties prop;
|
|
vkGetPhysicalDeviceMemoryProperties(v->PhysicalDevice, &prop);
|
|
vkGetPhysicalDeviceMemoryProperties(v->PhysicalDevice, &prop);
|
|
for (uint32_t i = 0; i < prop.memoryTypeCount; i++)
|
|
for (uint32_t i = 0; i < prop.memoryTypeCount; i++)
|
|
@@ -336,21 +357,25 @@ static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, ui
|
|
|
|
|
|
static void check_vk_result(VkResult err)
|
|
static void check_vk_result(VkResult err)
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ if (!bd)
|
|
|
|
+ return;
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
if (v->CheckVkResultFn)
|
|
if (v->CheckVkResultFn)
|
|
v->CheckVkResultFn(err);
|
|
v->CheckVkResultFn(err);
|
|
}
|
|
}
|
|
|
|
|
|
static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage)
|
|
static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage)
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
VkResult err;
|
|
VkResult err;
|
|
if (buffer != VK_NULL_HANDLE)
|
|
if (buffer != VK_NULL_HANDLE)
|
|
vkDestroyBuffer(v->Device, buffer, v->Allocator);
|
|
vkDestroyBuffer(v->Device, buffer, v->Allocator);
|
|
if (buffer_memory != VK_NULL_HANDLE)
|
|
if (buffer_memory != VK_NULL_HANDLE)
|
|
vkFreeMemory(v->Device, buffer_memory, v->Allocator);
|
|
vkFreeMemory(v->Device, buffer_memory, v->Allocator);
|
|
|
|
|
|
- VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / g_BufferMemoryAlignment + 1) * g_BufferMemoryAlignment;
|
|
|
|
|
|
+ VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment;
|
|
VkBufferCreateInfo buffer_info = {};
|
|
VkBufferCreateInfo buffer_info = {};
|
|
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
buffer_info.size = vertex_buffer_size_aligned;
|
|
buffer_info.size = vertex_buffer_size_aligned;
|
|
@@ -361,7 +386,7 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory
|
|
|
|
|
|
VkMemoryRequirements req;
|
|
VkMemoryRequirements req;
|
|
vkGetBufferMemoryRequirements(v->Device, buffer, &req);
|
|
vkGetBufferMemoryRequirements(v->Device, buffer, &req);
|
|
- g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;
|
|
|
|
|
|
+ bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment;
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.allocationSize = req.size;
|
|
alloc_info.allocationSize = req.size;
|
|
@@ -376,11 +401,13 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory
|
|
|
|
|
|
static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height)
|
|
static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+
|
|
// Bind pipeline and descriptor sets:
|
|
// Bind pipeline and descriptor sets:
|
|
{
|
|
{
|
|
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
|
vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
|
- VkDescriptorSet desc_set[1] = { g_DescriptorSet };
|
|
|
|
- vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_PipelineLayout, 0, 1, desc_set, 0, NULL);
|
|
|
|
|
|
+ VkDescriptorSet desc_set[1] = { bd->DescriptorSet };
|
|
|
|
+ vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
// Bind Vertex And Index Buffer:
|
|
// Bind Vertex And Index Buffer:
|
|
@@ -413,8 +440,8 @@ static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline
|
|
float translate[2];
|
|
float translate[2];
|
|
translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0];
|
|
translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0];
|
|
translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1];
|
|
translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1];
|
|
- vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale);
|
|
|
|
- vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
|
|
|
|
|
|
+ vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale);
|
|
|
|
+ vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -427,9 +454,10 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
if (fb_width <= 0 || fb_height <= 0)
|
|
if (fb_width <= 0 || fb_height <= 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
if (pipeline == VK_NULL_HANDLE)
|
|
if (pipeline == VK_NULL_HANDLE)
|
|
- pipeline = g_Pipeline;
|
|
|
|
|
|
+ pipeline = bd->Pipeline;
|
|
|
|
|
|
// Allocate array to store enough vertex/index buffers. Each unique viewport gets its own storage.
|
|
// Allocate array to store enough vertex/index buffers. Each unique viewport gets its own storage.
|
|
ImGuiViewportDataVulkan* viewport_renderer_data = (ImGuiViewportDataVulkan*)draw_data->OwnerViewport->RendererUserData;
|
|
ImGuiViewportDataVulkan* viewport_renderer_data = (ImGuiViewportDataVulkan*)draw_data->OwnerViewport->RendererUserData;
|
|
@@ -547,8 +575,9 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
|
|
|
|
bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
|
|
|
|
unsigned char* pixels;
|
|
unsigned char* pixels;
|
|
int width, height;
|
|
int width, height;
|
|
@@ -573,17 +602,17 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
|
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
|
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
|
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
|
info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
- err = vkCreateImage(v->Device, &info, v->Allocator, &g_FontImage);
|
|
|
|
|
|
+ err = vkCreateImage(v->Device, &info, v->Allocator, &bd->FontImage);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
VkMemoryRequirements req;
|
|
VkMemoryRequirements req;
|
|
- vkGetImageMemoryRequirements(v->Device, g_FontImage, &req);
|
|
|
|
|
|
+ vkGetImageMemoryRequirements(v->Device, bd->FontImage, &req);
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.allocationSize = req.size;
|
|
alloc_info.allocationSize = req.size;
|
|
alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits);
|
|
alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits);
|
|
- err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &g_FontMemory);
|
|
|
|
|
|
+ err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->FontMemory);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
- err = vkBindImageMemory(v->Device, g_FontImage, g_FontMemory, 0);
|
|
|
|
|
|
+ err = vkBindImageMemory(v->Device, bd->FontImage, bd->FontMemory, 0);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -591,25 +620,25 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
{
|
|
{
|
|
VkImageViewCreateInfo info = {};
|
|
VkImageViewCreateInfo info = {};
|
|
info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
|
info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
|
- info.image = g_FontImage;
|
|
|
|
|
|
+ info.image = bd->FontImage;
|
|
info.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
|
info.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
|
info.format = VK_FORMAT_R8G8B8A8_UNORM;
|
|
info.format = VK_FORMAT_R8G8B8A8_UNORM;
|
|
info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
info.subresourceRange.levelCount = 1;
|
|
info.subresourceRange.levelCount = 1;
|
|
info.subresourceRange.layerCount = 1;
|
|
info.subresourceRange.layerCount = 1;
|
|
- err = vkCreateImageView(v->Device, &info, v->Allocator, &g_FontView);
|
|
|
|
|
|
+ err = vkCreateImageView(v->Device, &info, v->Allocator, &bd->FontView);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
// Update the Descriptor Set:
|
|
// Update the Descriptor Set:
|
|
{
|
|
{
|
|
VkDescriptorImageInfo desc_image[1] = {};
|
|
VkDescriptorImageInfo desc_image[1] = {};
|
|
- desc_image[0].sampler = g_FontSampler;
|
|
|
|
- desc_image[0].imageView = g_FontView;
|
|
|
|
|
|
+ desc_image[0].sampler = bd->FontSampler;
|
|
|
|
+ desc_image[0].imageView = bd->FontView;
|
|
desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
VkWriteDescriptorSet write_desc[1] = {};
|
|
VkWriteDescriptorSet write_desc[1] = {};
|
|
write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
|
write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
|
- write_desc[0].dstSet = g_DescriptorSet;
|
|
|
|
|
|
+ write_desc[0].dstSet = bd->DescriptorSet;
|
|
write_desc[0].descriptorCount = 1;
|
|
write_desc[0].descriptorCount = 1;
|
|
write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
write_desc[0].pImageInfo = desc_image;
|
|
write_desc[0].pImageInfo = desc_image;
|
|
@@ -623,34 +652,34 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
buffer_info.size = upload_size;
|
|
buffer_info.size = upload_size;
|
|
buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
|
buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
|
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
|
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
|
- err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &g_UploadBuffer);
|
|
|
|
|
|
+ err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &bd->UploadBuffer);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
VkMemoryRequirements req;
|
|
VkMemoryRequirements req;
|
|
- vkGetBufferMemoryRequirements(v->Device, g_UploadBuffer, &req);
|
|
|
|
- g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;
|
|
|
|
|
|
+ vkGetBufferMemoryRequirements(v->Device, bd->UploadBuffer, &req);
|
|
|
|
+ bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment;
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
VkMemoryAllocateInfo alloc_info = {};
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
alloc_info.allocationSize = req.size;
|
|
alloc_info.allocationSize = req.size;
|
|
alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
|
|
alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
|
|
- err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &g_UploadBufferMemory);
|
|
|
|
|
|
+ err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->UploadBufferMemory);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
- err = vkBindBufferMemory(v->Device, g_UploadBuffer, g_UploadBufferMemory, 0);
|
|
|
|
|
|
+ err = vkBindBufferMemory(v->Device, bd->UploadBuffer, bd->UploadBufferMemory, 0);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
// Upload to Buffer:
|
|
// Upload to Buffer:
|
|
{
|
|
{
|
|
char* map = NULL;
|
|
char* map = NULL;
|
|
- err = vkMapMemory(v->Device, g_UploadBufferMemory, 0, upload_size, 0, (void**)(&map));
|
|
|
|
|
|
+ err = vkMapMemory(v->Device, bd->UploadBufferMemory, 0, upload_size, 0, (void**)(&map));
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
memcpy(map, pixels, upload_size);
|
|
memcpy(map, pixels, upload_size);
|
|
VkMappedMemoryRange range[1] = {};
|
|
VkMappedMemoryRange range[1] = {};
|
|
range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
|
range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
|
- range[0].memory = g_UploadBufferMemory;
|
|
|
|
|
|
+ range[0].memory = bd->UploadBufferMemory;
|
|
range[0].size = upload_size;
|
|
range[0].size = upload_size;
|
|
err = vkFlushMappedMemoryRanges(v->Device, 1, range);
|
|
err = vkFlushMappedMemoryRanges(v->Device, 1, range);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
- vkUnmapMemory(v->Device, g_UploadBufferMemory);
|
|
|
|
|
|
+ vkUnmapMemory(v->Device, bd->UploadBufferMemory);
|
|
}
|
|
}
|
|
|
|
|
|
// Copy to Image:
|
|
// Copy to Image:
|
|
@@ -662,7 +691,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
|
copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
|
copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
- copy_barrier[0].image = g_FontImage;
|
|
|
|
|
|
+ copy_barrier[0].image = bd->FontImage;
|
|
copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
copy_barrier[0].subresourceRange.levelCount = 1;
|
|
copy_barrier[0].subresourceRange.levelCount = 1;
|
|
copy_barrier[0].subresourceRange.layerCount = 1;
|
|
copy_barrier[0].subresourceRange.layerCount = 1;
|
|
@@ -674,7 +703,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
region.imageExtent.width = width;
|
|
region.imageExtent.width = width;
|
|
region.imageExtent.height = height;
|
|
region.imageExtent.height = height;
|
|
region.imageExtent.depth = 1;
|
|
region.imageExtent.depth = 1;
|
|
- vkCmdCopyBufferToImage(command_buffer, g_UploadBuffer, g_FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
|
|
|
|
|
+ vkCmdCopyBufferToImage(command_buffer, bd->UploadBuffer, bd->FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
|
|
|
|
|
VkImageMemoryBarrier use_barrier[1] = {};
|
|
VkImageMemoryBarrier use_barrier[1] = {};
|
|
use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
|
@@ -684,7 +713,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
|
use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
- use_barrier[0].image = g_FontImage;
|
|
|
|
|
|
+ use_barrier[0].image = bd->FontImage;
|
|
use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
use_barrier[0].subresourceRange.levelCount = 1;
|
|
use_barrier[0].subresourceRange.levelCount = 1;
|
|
use_barrier[0].subresourceRange.layerCount = 1;
|
|
use_barrier[0].subresourceRange.layerCount = 1;
|
|
@@ -692,7 +721,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
}
|
|
}
|
|
|
|
|
|
// Store our identifier
|
|
// Store our identifier
|
|
- io.Fonts->SetTexID((ImTextureID)(intptr_t)g_FontImage);
|
|
|
|
|
|
+ io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontImage);
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -700,29 +729,31 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
|
static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
{
|
|
{
|
|
// Create the shader modules
|
|
// Create the shader modules
|
|
- if (g_ShaderModuleVert == NULL)
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ if (bd->ShaderModuleVert == NULL)
|
|
{
|
|
{
|
|
VkShaderModuleCreateInfo vert_info = {};
|
|
VkShaderModuleCreateInfo vert_info = {};
|
|
vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
|
|
vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
|
|
vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
|
vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
|
- VkResult err = vkCreateShaderModule(device, &vert_info, allocator, &g_ShaderModuleVert);
|
|
|
|
|
|
+ VkResult err = vkCreateShaderModule(device, &vert_info, allocator, &bd->ShaderModuleVert);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
- if (g_ShaderModuleFrag == NULL)
|
|
|
|
|
|
+ if (bd->ShaderModuleFrag == NULL)
|
|
{
|
|
{
|
|
VkShaderModuleCreateInfo frag_info = {};
|
|
VkShaderModuleCreateInfo frag_info = {};
|
|
frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
|
|
frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
|
|
frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
|
frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
|
- VkResult err = vkCreateShaderModule(device, &frag_info, allocator, &g_ShaderModuleFrag);
|
|
|
|
|
|
+ VkResult err = vkCreateShaderModule(device, &frag_info, allocator, &bd->ShaderModuleFrag);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreateFontSampler(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
static void ImGui_ImplVulkan_CreateFontSampler(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
{
|
|
{
|
|
- if (g_FontSampler)
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ if (bd->FontSampler)
|
|
return;
|
|
return;
|
|
|
|
|
|
VkSamplerCreateInfo info = {};
|
|
VkSamplerCreateInfo info = {};
|
|
@@ -736,17 +767,18 @@ static void ImGui_ImplVulkan_CreateFontSampler(VkDevice device, const VkAllocati
|
|
info.minLod = -1000;
|
|
info.minLod = -1000;
|
|
info.maxLod = 1000;
|
|
info.maxLod = 1000;
|
|
info.maxAnisotropy = 1.0f;
|
|
info.maxAnisotropy = 1.0f;
|
|
- VkResult err = vkCreateSampler(device, &info, allocator, &g_FontSampler);
|
|
|
|
|
|
+ VkResult err = vkCreateSampler(device, &info, allocator, &bd->FontSampler);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreateDescriptorSetLayout(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
static void ImGui_ImplVulkan_CreateDescriptorSetLayout(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
{
|
|
{
|
|
- if (g_DescriptorSetLayout)
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ if (bd->DescriptorSetLayout)
|
|
return;
|
|
return;
|
|
|
|
|
|
ImGui_ImplVulkan_CreateFontSampler(device, allocator);
|
|
ImGui_ImplVulkan_CreateFontSampler(device, allocator);
|
|
- VkSampler sampler[1] = { g_FontSampler };
|
|
|
|
|
|
+ VkSampler sampler[1] = { bd->FontSampler };
|
|
VkDescriptorSetLayoutBinding binding[1] = {};
|
|
VkDescriptorSetLayoutBinding binding[1] = {};
|
|
binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
binding[0].descriptorCount = 1;
|
|
binding[0].descriptorCount = 1;
|
|
@@ -756,13 +788,14 @@ static void ImGui_ImplVulkan_CreateDescriptorSetLayout(VkDevice device, const Vk
|
|
info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
info.bindingCount = 1;
|
|
info.bindingCount = 1;
|
|
info.pBindings = binding;
|
|
info.pBindings = binding;
|
|
- VkResult err = vkCreateDescriptorSetLayout(device, &info, allocator, &g_DescriptorSetLayout);
|
|
|
|
|
|
+ VkResult err = vkCreateDescriptorSetLayout(device, &info, allocator, &bd->DescriptorSetLayout);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
{
|
|
{
|
|
- if (g_PipelineLayout)
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ if (bd->PipelineLayout)
|
|
return;
|
|
return;
|
|
|
|
|
|
// Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
|
|
// Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
|
|
@@ -771,29 +804,30 @@ static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAlloc
|
|
push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
|
push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
|
push_constants[0].offset = sizeof(float) * 0;
|
|
push_constants[0].offset = sizeof(float) * 0;
|
|
push_constants[0].size = sizeof(float) * 4;
|
|
push_constants[0].size = sizeof(float) * 4;
|
|
- VkDescriptorSetLayout set_layout[1] = { g_DescriptorSetLayout };
|
|
|
|
|
|
+ VkDescriptorSetLayout set_layout[1] = { bd->DescriptorSetLayout };
|
|
VkPipelineLayoutCreateInfo layout_info = {};
|
|
VkPipelineLayoutCreateInfo layout_info = {};
|
|
layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
layout_info.setLayoutCount = 1;
|
|
layout_info.setLayoutCount = 1;
|
|
layout_info.pSetLayouts = set_layout;
|
|
layout_info.pSetLayouts = set_layout;
|
|
layout_info.pushConstantRangeCount = 1;
|
|
layout_info.pushConstantRangeCount = 1;
|
|
layout_info.pPushConstantRanges = push_constants;
|
|
layout_info.pPushConstantRanges = push_constants;
|
|
- VkResult err = vkCreatePipelineLayout(device, &layout_info, allocator, &g_PipelineLayout);
|
|
|
|
|
|
+ VkResult err = vkCreatePipelineLayout(device, &layout_info, allocator, &bd->PipelineLayout);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline, uint32_t subpass)
|
|
static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline, uint32_t subpass)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
|
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
|
|
|
|
|
VkPipelineShaderStageCreateInfo stage[2] = {};
|
|
VkPipelineShaderStageCreateInfo stage[2] = {};
|
|
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
|
|
stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
|
|
- stage[0].module = g_ShaderModuleVert;
|
|
|
|
|
|
+ stage[0].module = bd->ShaderModuleVert;
|
|
stage[0].pName = "main";
|
|
stage[0].pName = "main";
|
|
stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
|
stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
|
- stage[1].module = g_ShaderModuleFrag;
|
|
|
|
|
|
+ stage[1].module = bd->ShaderModuleFrag;
|
|
stage[1].pName = "main";
|
|
stage[1].pName = "main";
|
|
|
|
|
|
VkVertexInputBindingDescription binding_desc[1] = {};
|
|
VkVertexInputBindingDescription binding_desc[1] = {};
|
|
@@ -869,7 +903,7 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|
|
|
|
|
VkGraphicsPipelineCreateInfo info = {};
|
|
VkGraphicsPipelineCreateInfo info = {};
|
|
info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
- info.flags = g_PipelineCreateFlags;
|
|
|
|
|
|
+ info.flags = bd->PipelineCreateFlags;
|
|
info.stageCount = 2;
|
|
info.stageCount = 2;
|
|
info.pStages = stage;
|
|
info.pStages = stage;
|
|
info.pVertexInputState = &vertex_info;
|
|
info.pVertexInputState = &vertex_info;
|
|
@@ -880,7 +914,7 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|
info.pDepthStencilState = &depth_info;
|
|
info.pDepthStencilState = &depth_info;
|
|
info.pColorBlendState = &blend_info;
|
|
info.pColorBlendState = &blend_info;
|
|
info.pDynamicState = &dynamic_state;
|
|
info.pDynamicState = &dynamic_state;
|
|
- info.layout = g_PipelineLayout;
|
|
|
|
|
|
+ info.layout = bd->PipelineLayout;
|
|
info.renderPass = renderPass;
|
|
info.renderPass = renderPass;
|
|
info.subpass = subpass;
|
|
info.subpass = subpass;
|
|
VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline);
|
|
VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline);
|
|
@@ -889,10 +923,11 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|
|
|
|
|
bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
VkResult err;
|
|
VkResult err;
|
|
|
|
|
|
- if (!g_FontSampler)
|
|
|
|
|
|
+ if (!bd->FontSampler)
|
|
{
|
|
{
|
|
VkSamplerCreateInfo info = {};
|
|
VkSamplerCreateInfo info = {};
|
|
info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
|
info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
|
@@ -905,13 +940,13 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
info.minLod = -1000;
|
|
info.minLod = -1000;
|
|
info.maxLod = 1000;
|
|
info.maxLod = 1000;
|
|
info.maxAnisotropy = 1.0f;
|
|
info.maxAnisotropy = 1.0f;
|
|
- err = vkCreateSampler(v->Device, &info, v->Allocator, &g_FontSampler);
|
|
|
|
|
|
+ err = vkCreateSampler(v->Device, &info, v->Allocator, &bd->FontSampler);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
- if (!g_DescriptorSetLayout)
|
|
|
|
|
|
+ if (!bd->DescriptorSetLayout)
|
|
{
|
|
{
|
|
- VkSampler sampler[1] = {g_FontSampler};
|
|
|
|
|
|
+ VkSampler sampler[1] = {bd->FontSampler};
|
|
VkDescriptorSetLayoutBinding binding[1] = {};
|
|
VkDescriptorSetLayoutBinding binding[1] = {};
|
|
binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
|
binding[0].descriptorCount = 1;
|
|
binding[0].descriptorCount = 1;
|
|
@@ -921,7 +956,7 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
|
info.bindingCount = 1;
|
|
info.bindingCount = 1;
|
|
info.pBindings = binding;
|
|
info.pBindings = binding;
|
|
- err = vkCreateDescriptorSetLayout(v->Device, &info, v->Allocator, &g_DescriptorSetLayout);
|
|
|
|
|
|
+ err = vkCreateDescriptorSetLayout(v->Device, &info, v->Allocator, &bd->DescriptorSetLayout);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -931,64 +966,66 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
|
alloc_info.descriptorPool = v->DescriptorPool;
|
|
alloc_info.descriptorPool = v->DescriptorPool;
|
|
alloc_info.descriptorSetCount = 1;
|
|
alloc_info.descriptorSetCount = 1;
|
|
- alloc_info.pSetLayouts = &g_DescriptorSetLayout;
|
|
|
|
- err = vkAllocateDescriptorSets(v->Device, &alloc_info, &g_DescriptorSet);
|
|
|
|
|
|
+ alloc_info.pSetLayouts = &bd->DescriptorSetLayout;
|
|
|
|
+ err = vkAllocateDescriptorSets(v->Device, &alloc_info, &bd->DescriptorSet);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
- if (!g_PipelineLayout)
|
|
|
|
|
|
+ if (!bd->PipelineLayout)
|
|
{
|
|
{
|
|
// Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
|
|
// Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
|
|
VkPushConstantRange push_constants[1] = {};
|
|
VkPushConstantRange push_constants[1] = {};
|
|
push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
|
push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
|
push_constants[0].offset = sizeof(float) * 0;
|
|
push_constants[0].offset = sizeof(float) * 0;
|
|
push_constants[0].size = sizeof(float) * 4;
|
|
push_constants[0].size = sizeof(float) * 4;
|
|
- VkDescriptorSetLayout set_layout[1] = { g_DescriptorSetLayout };
|
|
|
|
|
|
+ VkDescriptorSetLayout set_layout[1] = { bd->DescriptorSetLayout };
|
|
VkPipelineLayoutCreateInfo layout_info = {};
|
|
VkPipelineLayoutCreateInfo layout_info = {};
|
|
layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
|
layout_info.setLayoutCount = 1;
|
|
layout_info.setLayoutCount = 1;
|
|
layout_info.pSetLayouts = set_layout;
|
|
layout_info.pSetLayouts = set_layout;
|
|
layout_info.pushConstantRangeCount = 1;
|
|
layout_info.pushConstantRangeCount = 1;
|
|
layout_info.pPushConstantRanges = push_constants;
|
|
layout_info.pPushConstantRanges = push_constants;
|
|
- err = vkCreatePipelineLayout(v->Device, &layout_info, v->Allocator, &g_PipelineLayout);
|
|
|
|
|
|
+ err = vkCreatePipelineLayout(v->Device, &layout_info, v->Allocator, &bd->PipelineLayout);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
}
|
|
}
|
|
|
|
|
|
- ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, g_RenderPass, v->MSAASamples, &g_Pipeline, g_Subpass);
|
|
|
|
|
|
+ ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, bd->RenderPass, v->MSAASamples, &bd->Pipeline, bd->Subpass);
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
void ImGui_ImplVulkan_DestroyFontUploadObjects()
|
|
void ImGui_ImplVulkan_DestroyFontUploadObjects()
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
- if (g_UploadBuffer)
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
|
|
+ if (bd->UploadBuffer)
|
|
{
|
|
{
|
|
- vkDestroyBuffer(v->Device, g_UploadBuffer, v->Allocator);
|
|
|
|
- g_UploadBuffer = VK_NULL_HANDLE;
|
|
|
|
|
|
+ vkDestroyBuffer(v->Device, bd->UploadBuffer, v->Allocator);
|
|
|
|
+ bd->UploadBuffer = VK_NULL_HANDLE;
|
|
}
|
|
}
|
|
- if (g_UploadBufferMemory)
|
|
|
|
|
|
+ if (bd->UploadBufferMemory)
|
|
{
|
|
{
|
|
- vkFreeMemory(v->Device, g_UploadBufferMemory, v->Allocator);
|
|
|
|
- g_UploadBufferMemory = VK_NULL_HANDLE;
|
|
|
|
|
|
+ vkFreeMemory(v->Device, bd->UploadBufferMemory, v->Allocator);
|
|
|
|
+ bd->UploadBufferMemory = VK_NULL_HANDLE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void ImGui_ImplVulkan_DestroyDeviceObjects()
|
|
void ImGui_ImplVulkan_DestroyDeviceObjects()
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
|
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
|
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
|
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
|
|
|
|
|
- if (g_ShaderModuleVert) { vkDestroyShaderModule(v->Device, g_ShaderModuleVert, v->Allocator); g_ShaderModuleVert = VK_NULL_HANDLE; }
|
|
|
|
- if (g_ShaderModuleFrag) { vkDestroyShaderModule(v->Device, g_ShaderModuleFrag, v->Allocator); g_ShaderModuleFrag = VK_NULL_HANDLE; }
|
|
|
|
- if (g_FontView) { vkDestroyImageView(v->Device, g_FontView, v->Allocator); g_FontView = VK_NULL_HANDLE; }
|
|
|
|
- if (g_FontImage) { vkDestroyImage(v->Device, g_FontImage, v->Allocator); g_FontImage = VK_NULL_HANDLE; }
|
|
|
|
- if (g_FontMemory) { vkFreeMemory(v->Device, g_FontMemory, v->Allocator); g_FontMemory = VK_NULL_HANDLE; }
|
|
|
|
- if (g_FontSampler) { vkDestroySampler(v->Device, g_FontSampler, v->Allocator); g_FontSampler = VK_NULL_HANDLE; }
|
|
|
|
- if (g_DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, g_DescriptorSetLayout, v->Allocator); g_DescriptorSetLayout = VK_NULL_HANDLE; }
|
|
|
|
- if (g_PipelineLayout) { vkDestroyPipelineLayout(v->Device, g_PipelineLayout, v->Allocator); g_PipelineLayout = VK_NULL_HANDLE; }
|
|
|
|
- if (g_Pipeline) { vkDestroyPipeline(v->Device, g_Pipeline, v->Allocator); g_Pipeline = VK_NULL_HANDLE; }
|
|
|
|
|
|
+ if (bd->ShaderModuleVert) { vkDestroyShaderModule(v->Device, bd->ShaderModuleVert, v->Allocator); bd->ShaderModuleVert = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->ShaderModuleFrag) { vkDestroyShaderModule(v->Device, bd->ShaderModuleFrag, v->Allocator); bd->ShaderModuleFrag = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->FontView) { vkDestroyImageView(v->Device, bd->FontView, v->Allocator); bd->FontView = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->FontImage) { vkDestroyImage(v->Device, bd->FontImage, v->Allocator); bd->FontImage = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->FontMemory) { vkFreeMemory(v->Device, bd->FontMemory, v->Allocator); bd->FontMemory = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->FontSampler) { vkDestroySampler(v->Device, bd->FontSampler, v->Allocator); bd->FontSampler = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->Pipeline) { vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator); bd->Pipeline = VK_NULL_HANDLE; }
|
|
}
|
|
}
|
|
|
|
|
|
bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data)
|
|
bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data)
|
|
@@ -1016,8 +1053,12 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
|
|
{
|
|
{
|
|
IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
|
|
IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
|
|
|
|
|
|
- // Setup backend capabilities flags
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
+ IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
|
|
|
|
+
|
|
|
|
+ // Setup backend capabilities flags
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_CreateBackendData();
|
|
|
|
+ io.BackendRendererUserData = (void*)bd;
|
|
io.BackendRendererName = "imgui_impl_vulkan";
|
|
io.BackendRendererName = "imgui_impl_vulkan";
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional)
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional)
|
|
@@ -1031,9 +1072,9 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
|
|
IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
|
IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
|
IM_ASSERT(render_pass != VK_NULL_HANDLE);
|
|
IM_ASSERT(render_pass != VK_NULL_HANDLE);
|
|
|
|
|
|
- g_VulkanInitInfo = *info;
|
|
|
|
- g_RenderPass = render_pass;
|
|
|
|
- g_Subpass = info->Subpass;
|
|
|
|
|
|
+ bd->VulkanInitInfo = *info;
|
|
|
|
+ bd->RenderPass = render_pass;
|
|
|
|
+ bd->Subpass = info->Subpass;
|
|
|
|
|
|
ImGui_ImplVulkan_CreateDeviceObjects();
|
|
ImGui_ImplVulkan_CreateDeviceObjects();
|
|
|
|
|
|
@@ -1060,6 +1101,11 @@ void ImGui_ImplVulkan_Shutdown()
|
|
|
|
|
|
// Clean up windows
|
|
// Clean up windows
|
|
ImGui_ImplVulkan_ShutdownPlatformInterface();
|
|
ImGui_ImplVulkan_ShutdownPlatformInterface();
|
|
|
|
+
|
|
|
|
+ ImGuiIO& io = ImGui::GetIO();
|
|
|
|
+ io.BackendRendererName = NULL;
|
|
|
|
+ io.BackendRendererUserData = NULL;
|
|
|
|
+ ImGui_ImplVulkan_DestroyBackendData();
|
|
}
|
|
}
|
|
|
|
|
|
void ImGui_ImplVulkan_NewFrame()
|
|
void ImGui_ImplVulkan_NewFrame()
|
|
@@ -1068,17 +1114,18 @@ void ImGui_ImplVulkan_NewFrame()
|
|
|
|
|
|
void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count)
|
|
void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
IM_ASSERT(min_image_count >= 2);
|
|
IM_ASSERT(min_image_count >= 2);
|
|
- if (g_VulkanInitInfo.MinImageCount == min_image_count)
|
|
|
|
|
|
+ if (bd->VulkanInitInfo.MinImageCount == min_image_count)
|
|
return;
|
|
return;
|
|
|
|
|
|
IM_ASSERT(0); // FIXME-VIEWPORT: Unsupported. Need to recreate all swap chains!
|
|
IM_ASSERT(0); // FIXME-VIEWPORT: Unsupported. Need to recreate all swap chains!
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
VkResult err = vkDeviceWaitIdle(v->Device);
|
|
VkResult err = vkDeviceWaitIdle(v->Device);
|
|
check_vk_result(err);
|
|
check_vk_result(err);
|
|
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
|
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
|
|
|
|
|
- g_VulkanInitInfo.MinImageCount = min_image_count;
|
|
|
|
|
|
+ bd->VulkanInitInfo.MinImageCount = min_image_count;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1348,7 +1395,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|
|
|
|
|
// We do not create a pipeline by default as this is also used by examples' main.cpp,
|
|
// We do not create a pipeline by default as this is also used by examples' main.cpp,
|
|
// but secondary viewport in multi-viewport mode may want to create one with:
|
|
// but secondary viewport in multi-viewport mode may want to create one with:
|
|
- //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, g_Subpass);
|
|
|
|
|
|
+ //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, bd->Subpass);
|
|
}
|
|
}
|
|
|
|
|
|
// Create The Image Views
|
|
// Create The Image Views
|
|
@@ -1406,7 +1453,7 @@ void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevic
|
|
void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator)
|
|
void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator)
|
|
{
|
|
{
|
|
vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals)
|
|
vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals)
|
|
- //vkQueueWaitIdle(g_Queue);
|
|
|
|
|
|
+ //vkQueueWaitIdle(bd->Queue);
|
|
|
|
|
|
for (uint32_t i = 0; i < wd->ImageCount; i++)
|
|
for (uint32_t i = 0; i < wd->ImageCount; i++)
|
|
{
|
|
{
|
|
@@ -1481,10 +1528,11 @@ void ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(VkDevice device, const V
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|
static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGuiViewportDataVulkan* data = IM_NEW(ImGuiViewportDataVulkan)();
|
|
ImGuiViewportDataVulkan* data = IM_NEW(ImGuiViewportDataVulkan)();
|
|
viewport->RendererUserData = data;
|
|
viewport->RendererUserData = data;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
|
|
|
|
// Create surface
|
|
// Create surface
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
@@ -1520,9 +1568,10 @@ static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|
static void ImGui_ImplVulkan_DestroyWindow(ImGuiViewport* viewport)
|
|
static void ImGui_ImplVulkan_DestroyWindow(ImGuiViewport* viewport)
|
|
{
|
|
{
|
|
// The main viewport (owned by the application) will always have RendererUserData == NULL since we didn't create the data for it.
|
|
// The main viewport (owned by the application) will always have RendererUserData == NULL since we didn't create the data for it.
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
if (ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData)
|
|
if (ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData)
|
|
{
|
|
{
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
if (data->WindowOwned)
|
|
if (data->WindowOwned)
|
|
ImGui_ImplVulkanH_DestroyWindow(v->Instance, v->Device, &data->Window, v->Allocator);
|
|
ImGui_ImplVulkanH_DestroyWindow(v->Instance, v->Device, &data->Window, v->Allocator);
|
|
ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &data->RenderBuffers, v->Allocator);
|
|
ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &data->RenderBuffers, v->Allocator);
|
|
@@ -1533,19 +1582,21 @@ static void ImGui_ImplVulkan_DestroyWindow(ImGuiViewport* viewport)
|
|
|
|
|
|
static void ImGui_ImplVulkan_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
|
static void ImGui_ImplVulkan_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
if (data == NULL) // This is NULL for the main viewport (which is left to the user/app to handle)
|
|
if (data == NULL) // This is NULL for the main viewport (which is left to the user/app to handle)
|
|
return;
|
|
return;
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
data->Window.ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true;
|
|
data->Window.ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true;
|
|
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, &data->Window, v->QueueFamily, v->Allocator, (int)size.x, (int)size.y, v->MinImageCount);
|
|
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, &data->Window, v->QueueFamily, v->Allocator, (int)size.x, (int)size.y, v->MinImageCount);
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
VkResult err;
|
|
VkResult err;
|
|
|
|
|
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
|
@@ -1616,9 +1667,10 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
|
|
|
|
static void ImGui_ImplVulkan_SwapBuffers(ImGuiViewport* viewport, void*)
|
|
static void ImGui_ImplVulkan_SwapBuffers(ImGuiViewport* viewport, void*)
|
|
{
|
|
{
|
|
|
|
+ ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
ImGuiViewportDataVulkan* data = (ImGuiViewportDataVulkan*)viewport->RendererUserData;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
ImGui_ImplVulkanH_Window* wd = &data->Window;
|
|
- ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
|
|
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
|
|
|
|
VkResult err;
|
|
VkResult err;
|
|
uint32_t present_index = wd->FrameIndex;
|
|
uint32_t present_index = wd->FrameIndex;
|