From be711bf5b3955cb0338a55faee82601a982fa127 Mon Sep 17 00:00:00 2001 From: SimoZ64 Date: Mon, 19 May 2025 07:01:26 +0200 Subject: [PATCH] doesnt quite work yet --- src/frontend/EmuThread.cpp | 2 - src/frontend/KaizenGui.cpp | 120 ++++++++++++++++++++++++++++++++++ src/frontend/KaizenGui.hpp | 1 + src/frontend/RenderWidget.cpp | 2 + 4 files changed, 123 insertions(+), 2 deletions(-) diff --git a/src/frontend/EmuThread.cpp b/src/frontend/EmuThread.cpp index 54ac8675..dfd67ad3 100644 --- a/src/frontend/EmuThread.cpp +++ b/src/frontend/EmuThread.cpp @@ -8,8 +8,6 @@ EmuThread::EmuThread(const std::shared_ptr &core, double &fps, Render void EmuThread::start() noexcept { thread = std::thread([this]() { isRunning = true; - core->parallel.Init(renderWidget.wsiPlatform, renderWidget.windowInfo, - core->cpu->GetMem().GetRDRAMPtr()); auto lastSample = std::chrono::high_resolution_clock::now(); auto avgFps = 16.667; diff --git a/src/frontend/KaizenGui.cpp b/src/frontend/KaizenGui.cpp index 3cfae399..d83cd5fb 100644 --- a/src/frontend/KaizenGui.cpp +++ b/src/frontend/KaizenGui.cpp @@ -2,8 +2,128 @@ #include #include #include +#include +#include +#include + +static void check_vk_result(VkResult err) +{ + if (err == 0) + return; + fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); + if (err < 0) + abort(); +} + +void KaizenGui::InitImGui() { + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + (void)io; + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + + ParallelRDP& prdp = core->parallel; + Vulkan::WSI& wsi = *prdp.wsi.get(); + volkInitialize(); + volkLoadInstance(wsi.get_context().get_instance()); + ImGui_ImplVulkan_LoadFunctions(VK_API_VERSION_1_3, [](const char* function_name, void* userdata) { + auto wsi = (Vulkan::WSI*)userdata; + return vkGetInstanceProcAddr(wsi->get_context().get_instance(), function_name); + }, &wsi); + + ImGui_ImplVulkan_InitInfo init_info = {}; + // Create Descriptor Pool + { + 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 * IM_ARRAYSIZE(pool_sizes); + pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + auto err = vkCreateDescriptorPool(wsi.get_context().get_device(), &pool_info, nullptr, &init_info.DescriptorPool); + check_vk_result(err); + } + + // Create the Render Pass + VkRenderPass renderPass; + { + VkAttachmentDescription attachment = {}; + attachment.format = wsi.get_device().get_swapchain_view().get_format(); + attachment.samples = VK_SAMPLE_COUNT_1_BIT; + attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + VkAttachmentReference color_attachment = {}; + color_attachment.attachment = 0; + color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + VkSubpassDescription subpass = {}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &color_attachment; + VkSubpassDependency dependency = {}; + dependency.srcSubpass = VK_SUBPASS_EXTERNAL; + dependency.dstSubpass = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.srcAccessMask = 0; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + VkRenderPassCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + info.attachmentCount = 1; + info.pAttachments = &attachment; + info.subpassCount = 1; + info.pSubpasses = &subpass; + info.dependencyCount = 1; + info.pDependencies = &dependency; + auto err = vkCreateRenderPass(wsi.get_context().get_device(), &info, nullptr, &renderPass); + check_vk_result(err); + } + + // Setup Platform/Renderer backends + ImGui_ImplSDL3_InitForVulkan(window.getHandle()); + init_info.Instance = wsi.get_context().get_instance(); + init_info.PhysicalDevice = wsi.get_context().get_gpu(); + init_info.Device = wsi.get_context().get_device(); + init_info.QueueFamily = wsi.get_context().get_queue_info().family_indices[Vulkan::QUEUE_INDEX_GRAPHICS]; + init_info.Queue = wsi.get_context().get_queue_info().queues[Vulkan::QUEUE_INDEX_GRAPHICS]; + init_info.PipelineCache = nullptr; + init_info.Allocator = nullptr; + init_info.MinImageCount = 2; + init_info.ImageCount = 2; + init_info.RenderPass = renderPass; + init_info.CheckVkResultFn = check_vk_result; + + ImGui_ImplVulkan_Init(&init_info); + + io.Fonts->AddFontDefault(); + { + ImGui_ImplVulkan_CreateFontsTexture(); + } +} KaizenGui::KaizenGui() noexcept : window("Kaizen", 1280, 720), core(std::make_shared()), vulkanWidget(core, window.getHandle()), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) { + core->parallel.Init(vulkanWidget.wsiPlatform, vulkanWidget.windowInfo, core->cpu->GetMem().GetRDRAMPtr()); + InitImGui(); + emuExitFunc = [&]() { quit = true; if (emuThread.isRunning) { diff --git a/src/frontend/KaizenGui.hpp b/src/frontend/KaizenGui.hpp index eb1b284b..0d7026ac 100644 --- a/src/frontend/KaizenGui.hpp +++ b/src/frontend/KaizenGui.hpp @@ -28,4 +28,5 @@ private: std::function emuExitFunc; gui::PopupWindow about{"About Kaizen"}; gui::StatusBar statusBar{}; + void InitImGui(); }; diff --git a/src/frontend/RenderWidget.cpp b/src/frontend/RenderWidget.cpp index 41272655..289cb8a8 100644 --- a/src/frontend/RenderWidget.cpp +++ b/src/frontend/RenderWidget.cpp @@ -7,6 +7,8 @@ RenderWidget::RenderWidget(const std::shared_ptr &core, SDL_Window* w if (!Vulkan::Context::init_loader(nullptr)) { Util::panic("Could not initialize Vulkan ICD"); } + + wsiPlatform = std::make_shared(core, window); } void ImGuiWSIPlatform::poll_input() {