diff options
Diffstat (limited to 'src/cplusplus.cpp')
-rw-r--r-- | src/cplusplus.cpp | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/src/cplusplus.cpp b/src/cplusplus.cpp index 4441cc2..750a5bf 100644 --- a/src/cplusplus.cpp +++ b/src/cplusplus.cpp @@ -1,5 +1,121 @@ // not needed yet -- add custom cpp functions first -// #include "cplusplus.h" +#include "cplusplus.h" +#include "vksetup.h" #define VMA_IMPLEMENTATION #include "vk_mem_alloc.h" + +#include <imgui.h> +#include <backends/imgui_impl_sdl2.h> +#include <backends/imgui_impl_vulkan.h> + +static void check_vk_result(VkResult err) +{ + if (err == 0) + return; + fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); + if (err < 0) + abort(); +} + +void +imgui_draw_cmd(VkCommandBuffer cmd) +{ + ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cmd); +} + +void +imgui_draw() +{ + ImGui::Render(); +} + +void +imgui_new_frame(vks_context vk) +{ + + ImGui_ImplVulkan_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + + ImGui::NewFrame(); + + + ImGui::ShowDemoWindow(); +} + + +bool +imgui_proc_event(SDL_Event* e) +{ + return ImGui_ImplSDL2_ProcessEvent(e); +} + +static VkDescriptorPool imguiPool; +void +init_imgui(vks_context vk) +{ + VkDescriptorPoolSize pool_sizes[] = { + { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } + }; + + VkDescriptorPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + pool_info.maxSets = 1000; + pool_info.poolSizeCount = std::size(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + + VK_CHECK(vkCreateDescriptorPool(vk.device, &pool_info, nullptr, &imguiPool)); + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= + ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + ImGui_ImplSDL2_InitForVulkan(vk.window); + ImGui_ImplVulkan_InitInfo init_info = {}; + init_info.Instance = vk.instance; + init_info.PhysicalDevice = vk.physical_device; + init_info.Device = vk.device; + //init_info.QueueFamily = ; + init_info.Queue = vk.graphics_and_compute_queue; + //init_info.PipelineCache = YOUR_PIPELINE_CACHE; + init_info.DescriptorPool = imguiPool; + init_info.Subpass = 0; + init_info.MinImageCount = 2; + init_info.ImageCount = 2; + init_info.MSAASamples = vk.msaa_samples; + init_info.CheckVkResultFn = check_vk_result; + init_info.UseDynamicRendering = true; + //init_info. + init_info.PipelineRenderingCreateInfo.sType = + VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR; + init_info.PipelineRenderingCreateInfo.colorAttachmentCount = 1; + init_info.PipelineRenderingCreateInfo.pColorAttachmentFormats = &vk.swapchain.image_format; + init_info.PipelineRenderingCreateInfo.depthAttachmentFormat = findDepthFormat(vk); + + ImGui_ImplVulkan_Init(&init_info); + // (this gets a bit more complicated, see example app for full reference) + ImGui_ImplVulkan_CreateFontsTexture(); + // (your code submit a queue) + ImGui_ImplVulkan_DestroyFontsTexture(); +} + +void +imgui_destroy(vks_context vk) +{ + ImGui_ImplVulkan_Shutdown(); + vkDestroyDescriptorPool(vk.device, imguiPool, nullptr); +} |