From e697d9aa33700435a552af4a13c3e4b805573b10 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 30 Jan 2021 14:39:56 +1000 Subject: [PATCH] HostDisplay: Move imgui context creation to base class --- .../app/src/cpp/android_host_interface.cpp | 26 +++--- src/CMakeLists.txt | 2 + src/core/CMakeLists.txt | 5 +- src/core/host_display.h | 7 ++ src/duckstation-qt/duckstation-qt.vcxproj | 26 +++--- .../duckstation-qt.vcxproj.filters | 4 + src/duckstation-qt/qthostinterface.cpp | 5 +- src/duckstation-sdl/duckstation-sdl.vcxproj | 24 ++--- src/duckstation-sdl/imgui_impl_sdl.cpp | 25 +----- src/duckstation-sdl/imgui_impl_sdl.h | 4 +- src/duckstation-sdl/sdl_host_interface.cpp | 35 +++----- src/frontend-common/CMakeLists.txt | 1 - src/frontend-common/d3d11_host_display.cpp | 30 ++----- src/frontend-common/d3d11_host_display.h | 7 +- src/frontend-common/imgui_impl_dx11.cpp | 38 +++----- src/frontend-common/imgui_impl_dx11.h | 2 +- src/frontend-common/imgui_impl_opengl3.cpp | 4 +- src/frontend-common/imgui_impl_opengl3.h | 1 - src/frontend-common/imgui_impl_vulkan.cpp | 4 - src/frontend-common/imgui_impl_vulkan.h | 1 - src/frontend-common/opengl_host_display.cpp | 33 +++---- src/frontend-common/opengl_host_display.h | 7 +- src/frontend-common/vulkan_host_display.cpp | 87 +++++++++---------- src/frontend-common/vulkan_host_display.h | 7 +- 24 files changed, 155 insertions(+), 230 deletions(-) diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp index 5a96a4a47..2b952fb52 100644 --- a/android/app/src/cpp/android_host_interface.cpp +++ b/android/app/src/cpp/android_host_interface.cpp @@ -22,9 +22,9 @@ #include "scmversion/scmversion.h" #include #include -#include -#include #include +#include +#include Log_SetChannel(AndroidHostInterface); #ifdef USE_OPENSLES @@ -487,32 +487,32 @@ bool AndroidHostInterface::AcquireHostDisplay() wi.surface_width = ANativeWindow_getWidth(m_surface); wi.surface_height = ANativeWindow_getHeight(m_surface); - std::unique_ptr display; switch (g_settings.gpu_renderer) { case GPURenderer::HardwareVulkan: - display = std::make_unique(); + m_display = std::make_unique(); break; case GPURenderer::HardwareOpenGL: default: - display = std::make_unique(); + m_display = std::make_unique(); break; } - if (!display->CreateRenderDevice(wi, {}, g_settings.gpu_use_debug_device, g_settings.gpu_threaded_presentation) || - !display->InitializeRenderDevice(GetShaderCacheBasePath(), g_settings.gpu_use_debug_device, - g_settings.gpu_threaded_presentation)) + if (!m_display->CreateRenderDevice(wi, {}, g_settings.gpu_use_debug_device, g_settings.gpu_threaded_presentation) || + !m_display->InitializeRenderDevice(GetShaderCacheBasePath(), g_settings.gpu_use_debug_device, + g_settings.gpu_threaded_presentation) || + !m_display->CreateImGuiContext()) { - display->DestroyRenderDevice(); + m_display->DestroyRenderDevice(); + m_display.reset(); return false; } // The alignement was set prior to booting. - display->SetDisplayAlignment(m_display_alignment); - m_display = std::move(display); + m_display->SetDisplayAlignment(m_display_alignment); - if (!CreateHostDisplayResources()) + if (!m_display->UpdateImGuiFontTexture() || !CreateHostDisplayResources()) { ReportError("Failed to create host display resources"); ReleaseHostDisplay(); @@ -526,6 +526,7 @@ bool AndroidHostInterface::AcquireHostDisplay() void AndroidHostInterface::ReleaseHostDisplay() { ReleaseHostDisplayResources(); + m_display->DestroyImGuiContext(); m_display->DestroyRenderDevice(); m_display.reset(); } @@ -981,7 +982,6 @@ DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setThreadAffinity, jobject unu env->ReleaseIntArrayElements(cores, p_cores, 0); } - DEFINE_JNI_ARGS_METHOD(jobject, AndroidHostInterface_create, jobject unused, jobject context_object, jstring user_directory) { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3baa44a37..36bc23203 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,5 @@ +add_definitions("-DWITH_IMGUI=1") + add_subdirectory(common) add_subdirectory(core) add_subdirectory(scmversion) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 4ece26be9..59fc21613 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -115,10 +115,7 @@ set(RECOMPILER_SRCS target_include_directories(core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..") target_include_directories(core PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..") target_link_libraries(core PUBLIC Threads::Threads common zlib vulkan-loader) -target_link_libraries(core PRIVATE glad stb xxhash) - -target_compile_definitions(core PRIVATE "WITH_IMGUI=1") -target_link_libraries(core PRIVATE imgui) +target_link_libraries(core PRIVATE glad stb xxhash imgui) if(WIN32) target_sources(core PRIVATE diff --git a/src/core/host_display.h b/src/core/host_display.h index 9bbd0b406..4013586d0 100644 --- a/src/core/host_display.h +++ b/src/core/host_display.h @@ -108,6 +108,13 @@ public: virtual void SetVSync(bool enabled) = 0; +#ifdef WITH_IMGUI + /// ImGui context management, usually called by derived classes. + virtual bool CreateImGuiContext() = 0; + virtual void DestroyImGuiContext() = 0; + virtual bool UpdateImGuiFontTexture() = 0; +#endif + const s32 GetDisplayTopMargin() const { return m_display_top_margin; } const s32 GetDisplayWidth() const { return m_display_width; } const s32 GetDisplayHeight() const { return m_display_height; } diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj index 0f80f8689..b90bcd023 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj +++ b/src/duckstation-qt/duckstation-qt.vcxproj @@ -532,7 +532,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x86\include;%(AdditionalIncludeDirectories) @@ -554,7 +554,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) @@ -576,7 +576,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) @@ -598,7 +598,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x86\include;%(AdditionalIncludeDirectories) @@ -622,7 +622,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) @@ -646,7 +646,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) @@ -671,7 +671,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x86\include;%(AdditionalIncludeDirectories) true false @@ -695,7 +695,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x86\include;%(AdditionalIncludeDirectories) true true @@ -720,7 +720,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) true false @@ -744,7 +744,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) true false @@ -768,7 +768,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) true true @@ -793,7 +793,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;WITH_RECOMPILER=1;WITH_MMAP_FASTMEM=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\glad\Include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;$(SolutionDir)dep\msvc\qt5-x64\include;%(AdditionalIncludeDirectories) true true @@ -815,4 +815,4 @@ - + \ No newline at end of file diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters index 6466fe74a..2d6acace6 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj.filters +++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters @@ -75,6 +75,8 @@ + + @@ -126,6 +128,7 @@ + @@ -147,6 +150,7 @@ + diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 19194706a..4387f6ca9 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -506,8 +506,10 @@ bool QtHostInterface::AcquireHostDisplay() if (!m_display->MakeRenderContextCurrent() || !m_display->InitializeRenderDevice(GetShaderCacheBasePath(), g_settings.gpu_use_debug_device, g_settings.gpu_threaded_presentation) || - !CreateHostDisplayResources()) + !m_display->CreateImGuiContext() || !m_display->UpdateImGuiFontTexture() || !CreateHostDisplayResources()) { + ReleaseHostDisplayResources(); + m_display->DestroyImGuiContext(); destroyImGuiContext(); m_display->DestroyRenderDevice(); emit destroyDisplayRequested(); @@ -589,6 +591,7 @@ void QtHostInterface::ReleaseHostDisplay() Assert(m_display); ReleaseHostDisplayResources(); + m_display->DestroyImGuiContext(); m_display->DestroyRenderDevice(); destroyImGuiContext(); emit destroyDisplayRequested(); diff --git a/src/duckstation-sdl/duckstation-sdl.vcxproj b/src/duckstation-sdl/duckstation-sdl.vcxproj index 41511950d..a54a380d5 100644 --- a/src/duckstation-sdl/duckstation-sdl.vcxproj +++ b/src/duckstation-sdl/duckstation-sdl.vcxproj @@ -301,7 +301,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -323,7 +323,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -345,7 +345,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -367,7 +367,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -392,7 +392,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -417,7 +417,7 @@ Level4 Disabled - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_ITERATOR_DEBUG_LEVEL=1;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUGFAST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true ProgramDatabase $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) @@ -443,7 +443,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true false @@ -467,7 +467,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true true @@ -492,7 +492,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true false @@ -516,7 +516,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true false @@ -540,7 +540,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true true @@ -565,7 +565,7 @@ MaxSpeed true - WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + WITH_DISCORD_PRESENCE=1;WITH_SDL2=1;WITH_IMGUI=1;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) $(SolutionDir)dep\msvc\include;$(SolutionDir)dep\msvc\include\SDL;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\nativefiledialog\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)src;%(AdditionalIncludeDirectories) true true diff --git a/src/duckstation-sdl/imgui_impl_sdl.cpp b/src/duckstation-sdl/imgui_impl_sdl.cpp index d3bf510e4..13d987a7e 100644 --- a/src/duckstation-sdl/imgui_impl_sdl.cpp +++ b/src/duckstation-sdl/imgui_impl_sdl.cpp @@ -131,7 +131,7 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event) return false; } -static bool ImGui_ImplSDL2_Init(SDL_Window* window, void* sdl_gl_context) +bool ImGui_ImplSDL2_Init(SDL_Window* window) { g_Window = window; @@ -179,28 +179,6 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, void* sdl_gl_context) return true; } -bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context) -{ - (void)sdl_gl_context; // Viewport branch will need this. - return ImGui_ImplSDL2_Init(window, sdl_gl_context); -} - -bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window) -{ -#if !SDL_HAS_VULKAN - IM_ASSERT(0 && "Unsupported"); -#endif - return ImGui_ImplSDL2_Init(window, NULL); -} - -bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window) -{ -#if !defined(_WIN32) - IM_ASSERT(0 && "Unsupported"); -#endif - return ImGui_ImplSDL2_Init(window, NULL); -} - void ImGui_ImplSDL2_Shutdown() { g_Window = NULL; @@ -311,7 +289,6 @@ static void ImGui_ImplSDL2_UpdateGamepads() void ImGui_ImplSDL2_NewFrame(SDL_Window* window) { ImGuiIO& io = ImGui::GetIO(); - IM_ASSERT(io.Fonts->IsBuilt() && "Font atlas not built! It is generally built by the renderer back-end. Missing call to renderer _NewFrame() function? e.g. ImGui_ImplOpenGL3_NewFrame()."); // Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution) static Uint64 frequency = SDL_GetPerformanceFrequency(); diff --git a/src/duckstation-sdl/imgui_impl_sdl.h b/src/duckstation-sdl/imgui_impl_sdl.h index dce2b5451..ced2568da 100644 --- a/src/duckstation-sdl/imgui_impl_sdl.h +++ b/src/duckstation-sdl/imgui_impl_sdl.h @@ -22,9 +22,7 @@ struct SDL_Window; typedef union SDL_Event SDL_Event; -IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context); -IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window); -IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_Init(SDL_Window* window); IMGUI_IMPL_API void ImGui_ImplSDL2_Shutdown(); IMGUI_IMPL_API void ImGui_ImplSDL2_NewFrame(SDL_Window* window); IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event); diff --git a/src/duckstation-sdl/sdl_host_interface.cpp b/src/duckstation-sdl/sdl_host_interface.cpp index 046b47370..a7c7f0d0a 100644 --- a/src/duckstation-sdl/sdl_host_interface.cpp +++ b/src/duckstation-sdl/sdl_host_interface.cpp @@ -142,38 +142,24 @@ bool SDLHostInterface::CreateDisplay() return false; } - bool imgui_result; - switch (display->GetRenderAPI()) - { -#ifdef WIN32 - case HostDisplay::RenderAPI::D3D11: - imgui_result = ImGui_ImplSDL2_InitForD3D(m_window); - break; -#endif - - case HostDisplay::RenderAPI::Vulkan: - imgui_result = ImGui_ImplSDL2_InitForVulkan(m_window); - break; - - case HostDisplay::RenderAPI::OpenGL: - case HostDisplay::RenderAPI::OpenGLES: - imgui_result = ImGui_ImplSDL2_InitForOpenGL(m_window, nullptr); - break; - - default: - imgui_result = true; - break; - } - if (!imgui_result) + if (!ImGui_ImplSDL2_Init(m_window) || !display->CreateImGuiContext()) { ReportError("Failed to initialize ImGui SDL2 wrapper"); + ImGui_ImplSDL2_Shutdown(); + display->DestroyRenderDevice(); return false; } m_app_icon_texture = display->CreateTexture(APP_ICON_WIDTH, APP_ICON_HEIGHT, 1, 1, 1, HostDisplayPixelFormat::RGBA8, APP_ICON_DATA, APP_ICON_WIDTH * sizeof(u32)); - if (!m_app_icon_texture) + if (!display->UpdateImGuiFontTexture() || !m_app_icon_texture) + { + ReportError("Failed to upload textures"); + display->DestroyImGuiContext(); + ImGui_ImplSDL2_Shutdown(); + display->DestroyRenderDevice(); return false; + } display->SetDisplayTopMargin(m_fullscreen ? 0 : static_cast(20.0f * ImGui::GetIO().DisplayFramebufferScale.x)); m_display = std::move(display); @@ -183,6 +169,7 @@ bool SDLHostInterface::CreateDisplay() void SDLHostInterface::DestroyDisplay() { m_app_icon_texture.reset(); + m_display->DestroyImGuiContext(); m_display->DestroyRenderDevice(); m_display.reset(); } diff --git a/src/frontend-common/CMakeLists.txt b/src/frontend-common/CMakeLists.txt index c83ee4298..a13d148e9 100644 --- a/src/frontend-common/CMakeLists.txt +++ b/src/frontend-common/CMakeLists.txt @@ -33,7 +33,6 @@ add_library(frontend-common vulkan_host_display.h ) -target_compile_definitions(frontend-common PRIVATE "WITH_IMGUI=1") target_link_libraries(frontend-common PUBLIC core common glad vulkan-loader cubeb imgui simpleini tinyxml2 scmversion) if(WIN32) diff --git a/src/frontend-common/d3d11_host_display.cpp b/src/frontend-common/d3d11_host_display.cpp index 78ab38439..5c78d1821 100644 --- a/src/frontend-common/d3d11_host_display.cpp +++ b/src/frontend-common/d3d11_host_display.cpp @@ -359,21 +359,11 @@ bool D3D11HostDisplay::InitializeRenderDevice(std::string_view shader_cache_dire if (!CreateResources()) return false; -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext() && !CreateImGuiContext()) - return false; -#endif - return true; } void D3D11HostDisplay::DestroyRenderDevice() { -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - DestroyImGuiContext(); -#endif - DestroyResources(); DestroyRenderSurface(); m_context.Reset(); @@ -675,12 +665,10 @@ bool D3D11HostDisplay::CreateImGuiContext() #ifdef WITH_IMGUI ImGui::GetIO().DisplaySize.x = static_cast(m_window_info.surface_width); ImGui::GetIO().DisplaySize.y = static_cast(m_window_info.surface_height); - if (!ImGui_ImplDX11_Init(m_device.Get(), m_context.Get())) return false; - - ImGui_ImplDX11_NewFrame(); #endif + return true; } @@ -691,16 +679,21 @@ void D3D11HostDisplay::DestroyImGuiContext() #endif } +bool D3D11HostDisplay::UpdateImGuiFontTexture() +{ +#ifdef WITH_IMGUI + ImGui_ImplDX11_CreateFontsTexture(); +#endif + return true; +} + bool D3D11HostDisplay::Render() { if (ShouldSkipDisplayingFrame()) { #ifdef WITH_IMGUI if (ImGui::GetCurrentContext()) - { ImGui::Render(); - ImGui_ImplDX11_NewFrame(); - } #endif return false; @@ -724,11 +717,6 @@ bool D3D11HostDisplay::Render() else m_swap_chain->Present(BoolToUInt32(m_vsync), 0); -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - ImGui_ImplDX11_NewFrame(); -#endif - return true; } diff --git a/src/frontend-common/d3d11_host_display.h b/src/frontend-common/d3d11_host_display.h index d84f3907c..fceb62282 100644 --- a/src/frontend-common/d3d11_host_display.h +++ b/src/frontend-common/d3d11_host_display.h @@ -83,8 +83,11 @@ protected: virtual bool CreateResources() override; virtual void DestroyResources() override; - virtual bool CreateImGuiContext(); - virtual void DestroyImGuiContext(); +#ifdef WITH_IMGUI + virtual bool CreateImGuiContext() override; + virtual void DestroyImGuiContext() override; + virtual bool UpdateImGuiFontTexture() override; +#endif bool CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode); bool CreateSwapChainRTV(); diff --git a/src/frontend-common/imgui_impl_dx11.cpp b/src/frontend-common/imgui_impl_dx11.cpp index ffd7c50d7..e42e3005f 100644 --- a/src/frontend-common/imgui_impl_dx11.cpp +++ b/src/frontend-common/imgui_impl_dx11.cpp @@ -36,7 +36,6 @@ // DirectX data static ID3D11Device* g_pd3dDevice = NULL; static ID3D11DeviceContext* g_pd3dDeviceContext = NULL; -static IDXGIFactory* g_pFactory = NULL; static ID3D11Buffer* g_pVB = NULL; static ID3D11Buffer* g_pIB = NULL; static ID3D10Blob* g_pVertexShaderBlob = NULL; @@ -257,7 +256,7 @@ void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data) ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); } -static void ImGui_ImplDX11_CreateFontsTexture() +void ImGui_ImplDX11_CreateFontsTexture() { // Build texture atlas ImGuiIO& io = ImGui::GetIO(); @@ -266,6 +265,11 @@ static void ImGui_ImplDX11_CreateFontsTexture() io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Upload texture to graphics system + if (g_pFontTextureView) + { + g_pFontTextureView->Release(); + g_pFontTextureView = nullptr; + } { D3D11_TEXTURE2D_DESC desc; ZeroMemory(&desc, sizeof(desc)); @@ -301,6 +305,7 @@ static void ImGui_ImplDX11_CreateFontsTexture() io.Fonts->TexID = (ImTextureID)g_pFontTextureView; // Create texture sampler + if (!g_pFontSampler) { D3D11_SAMPLER_DESC desc; ZeroMemory(&desc, sizeof(desc)); @@ -455,8 +460,6 @@ bool ImGui_ImplDX11_CreateDeviceObjects() g_pd3dDevice->CreateDepthStencilState(&desc, &g_pDepthStencilState); } - ImGui_ImplDX11_CreateFontsTexture(); - return true; } @@ -486,36 +489,15 @@ bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_co // Setup back-end capabilities flags ImGuiIO& io = ImGui::GetIO(); io.BackendRendererName = "imgui_impl_dx11"; + g_pd3dDevice = device; + g_pd3dDeviceContext = device_context; - // Get factory from device - IDXGIDevice* pDXGIDevice = NULL; - IDXGIAdapter* pDXGIAdapter = NULL; - IDXGIFactory* pFactory = NULL; - - if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK) - if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK) - if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK) - { - g_pd3dDevice = device; - g_pd3dDeviceContext = device_context; - g_pFactory = pFactory; - } - if (pDXGIDevice) pDXGIDevice->Release(); - if (pDXGIAdapter) pDXGIAdapter->Release(); - - return true; + return ImGui_ImplDX11_CreateDeviceObjects(); } void ImGui_ImplDX11_Shutdown() { ImGui_ImplDX11_InvalidateDeviceObjects(); - if (g_pFactory) { g_pFactory->Release(); g_pFactory = NULL; } g_pd3dDevice = NULL; g_pd3dDeviceContext = NULL; } - -void ImGui_ImplDX11_NewFrame() -{ - if (!g_pFontSampler) - ImGui_ImplDX11_CreateDeviceObjects(); -} diff --git a/src/frontend-common/imgui_impl_dx11.h b/src/frontend-common/imgui_impl_dx11.h index 665cbc73f..757edde7d 100644 --- a/src/frontend-common/imgui_impl_dx11.h +++ b/src/frontend-common/imgui_impl_dx11.h @@ -16,9 +16,9 @@ struct ID3D11DeviceContext; IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context); IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame(); IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data); // Use if you want to reset your rendering device without losing ImGui state. IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects(); IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplDX11_CreateFontsTexture(); diff --git a/src/frontend-common/imgui_impl_opengl3.cpp b/src/frontend-common/imgui_impl_opengl3.cpp index c58b9b8ce..c7fdb4baa 100644 --- a/src/frontend-common/imgui_impl_opengl3.cpp +++ b/src/frontend-common/imgui_impl_opengl3.cpp @@ -128,7 +128,7 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version) IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersionString)); strcpy(g_GlslVersionString, glsl_version); strcat(g_GlslVersionString, "\n"); - return true; + return ImGui_ImplOpenGL3_CreateDeviceObjects(); } void ImGui_ImplOpenGL3_Shutdown() @@ -538,8 +538,6 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects() (GLvoid*)IM_OFFSETOF(ImDrawVert, col)); } - ImGui_ImplOpenGL3_CreateFontsTexture(); - // Restore modified GL state glBindTexture(GL_TEXTURE_2D, last_texture); glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); diff --git a/src/frontend-common/imgui_impl_opengl3.h b/src/frontend-common/imgui_impl_opengl3.h index 1b20187f3..f4a0c33b3 100644 --- a/src/frontend-common/imgui_impl_opengl3.h +++ b/src/frontend-common/imgui_impl_opengl3.h @@ -27,7 +27,6 @@ // Backend API IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL); IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame(); IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data); // (Optional) Called by Init/NewFrame/Shutdown diff --git a/src/frontend-common/imgui_impl_vulkan.cpp b/src/frontend-common/imgui_impl_vulkan.cpp index 4bed4d499..2cc441b0e 100644 --- a/src/frontend-common/imgui_impl_vulkan.cpp +++ b/src/frontend-common/imgui_impl_vulkan.cpp @@ -819,10 +819,6 @@ void ImGui_ImplVulkan_Shutdown() ImGui_ImplVulkan_DestroyDeviceObjects(); } -void ImGui_ImplVulkan_NewFrame() -{ -} - void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count) { IM_ASSERT(min_image_count >= 2); diff --git a/src/frontend-common/imgui_impl_vulkan.h b/src/frontend-common/imgui_impl_vulkan.h index 2f7bf16bc..747037b17 100644 --- a/src/frontend-common/imgui_impl_vulkan.h +++ b/src/frontend-common/imgui_impl_vulkan.h @@ -44,7 +44,6 @@ struct ImGui_ImplVulkan_InitInfo // Called by user code IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass); IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame(); IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer); IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer); IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontUploadObjects(); diff --git a/src/frontend-common/opengl_host_display.cpp b/src/frontend-common/opengl_host_display.cpp index 2fdc5e333..e2d65a786 100644 --- a/src/frontend-common/opengl_host_display.cpp +++ b/src/frontend-common/opengl_host_display.cpp @@ -361,11 +361,6 @@ bool OpenGLHostDisplay::InitializeRenderDevice(std::string_view shader_cache_dir if (!CreateResources()) return false; -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext() && !CreateImGuiContext()) - return false; -#endif - // Start with vsync on. SetVSync(true); @@ -393,11 +388,6 @@ void OpenGLHostDisplay::DestroyRenderDevice() if (!m_gl_context) return; -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - DestroyImGuiContext(); -#endif - DestroyResources(); m_gl_context->DoneCurrent(); @@ -477,12 +467,10 @@ bool OpenGLHostDisplay::CreateImGuiContext() #ifdef WITH_IMGUI ImGui::GetIO().DisplaySize.x = static_cast(m_window_info.surface_width); ImGui::GetIO().DisplaySize.y = static_cast(m_window_info.surface_height); - if (!ImGui_ImplOpenGL3_Init(GetGLSLVersionString())) return false; - - ImGui_ImplOpenGL3_NewFrame(); #endif + return true; } @@ -493,6 +481,16 @@ void OpenGLHostDisplay::DestroyImGuiContext() #endif } +bool OpenGLHostDisplay::UpdateImGuiFontTexture() +{ +#ifdef WITH_IMGUI + ImGui_ImplOpenGL3_DestroyFontsTexture(); + return ImGui_ImplOpenGL3_CreateFontsTexture(); +#else + return true; +#endif +} + bool OpenGLHostDisplay::CreateResources() { if (!m_use_gles2_draw_path) @@ -683,10 +681,7 @@ bool OpenGLHostDisplay::Render() { #ifdef WITH_IMGUI if (ImGui::GetCurrentContext()) - { ImGui::Render(); - ImGui_ImplOpenGL3_NewFrame(); - } #endif return false; @@ -707,12 +702,6 @@ bool OpenGLHostDisplay::Render() RenderSoftwareCursor(); m_gl_context->SwapBuffers(); - -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - ImGui_ImplOpenGL3_NewFrame(); -#endif - return true; } diff --git a/src/frontend-common/opengl_host_display.h b/src/frontend-common/opengl_host_display.h index 82ff57f97..842c9f44f 100644 --- a/src/frontend-common/opengl_host_display.h +++ b/src/frontend-common/opengl_host_display.h @@ -72,8 +72,11 @@ protected: virtual bool CreateResources() override; virtual void DestroyResources() override; - virtual bool CreateImGuiContext(); - virtual void DestroyImGuiContext(); +#ifdef WITH_IMGUI + virtual bool CreateImGuiContext() override; + virtual void DestroyImGuiContext() override; + virtual bool UpdateImGuiFontTexture() override; +#endif void RenderDisplay(); void RenderImGui(); diff --git a/src/frontend-common/vulkan_host_display.cpp b/src/frontend-common/vulkan_host_display.cpp index 18e32523b..fa6c819b2 100644 --- a/src/frontend-common/vulkan_host_display.cpp +++ b/src/frontend-common/vulkan_host_display.cpp @@ -343,11 +343,6 @@ bool VulkanHostDisplay::InitializeRenderDevice(std::string_view shader_cache_dir if (!CreateResources()) return false; -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext() && !CreateImGuiContext()) - return false; -#endif - return true; } @@ -528,13 +523,51 @@ void VulkanHostDisplay::DestroyResources() Vulkan::Util::SafeDestroySampler(m_linear_sampler); } -void VulkanHostDisplay::DestroyImGuiContext() +bool VulkanHostDisplay::CreateImGuiContext() { +#ifdef WITH_IMGUI + ImGui::GetIO().DisplaySize.x = static_cast(m_window_info.surface_width); + ImGui::GetIO().DisplaySize.y = static_cast(m_window_info.surface_height); + + ImGui_ImplVulkan_InitInfo vii = {}; + vii.Instance = g_vulkan_context->GetVulkanInstance(); + vii.PhysicalDevice = g_vulkan_context->GetPhysicalDevice(); + vii.Device = g_vulkan_context->GetDevice(); + vii.QueueFamily = g_vulkan_context->GetGraphicsQueueFamilyIndex(); + vii.Queue = g_vulkan_context->GetGraphicsQueue(); + vii.PipelineCache = g_vulkan_shader_cache->GetPipelineCache(); + vii.MinImageCount = m_swap_chain->GetImageCount(); + vii.ImageCount = m_swap_chain->GetImageCount(); + vii.MSAASamples = VK_SAMPLE_COUNT_1_BIT; + + if (!ImGui_ImplVulkan_Init(&vii, m_swap_chain->GetClearRenderPass())) + return false; +#endif + + return true; +} + +void VulkanHostDisplay::DestroyImGuiContext() +{ + g_vulkan_context->WaitForGPUIdle(); + #ifdef WITH_IMGUI ImGui_ImplVulkan_Shutdown(); #endif } +bool VulkanHostDisplay::UpdateImGuiFontTexture() +{ +#ifdef WITH_IMGUI + // Just in case we were drawing something. + g_vulkan_context->ExecuteCommandBuffer(true); + ImGui_ImplVulkan_DestroyFontUploadObjects(); + return ImGui_ImplVulkan_CreateFontsTexture(g_vulkan_context->GetCurrentCommandBuffer()); +#else + return true; +#endif +} + void VulkanHostDisplay::DestroyRenderDevice() { if (!g_vulkan_context) @@ -542,11 +575,6 @@ void VulkanHostDisplay::DestroyRenderDevice() g_vulkan_context->WaitForGPUIdle(); -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - DestroyImGuiContext(); -#endif - DestroyResources(); Vulkan::ShaderCache::Destroy(); @@ -564,45 +592,13 @@ bool VulkanHostDisplay::DoneRenderContextCurrent() return true; } -bool VulkanHostDisplay::CreateImGuiContext() -{ -#ifdef WITH_IMGUI - ImGui::GetIO().DisplaySize.x = static_cast(m_window_info.surface_width); - ImGui::GetIO().DisplaySize.y = static_cast(m_window_info.surface_height); - - ImGui_ImplVulkan_InitInfo vii = {}; - vii.Instance = g_vulkan_context->GetVulkanInstance(); - vii.PhysicalDevice = g_vulkan_context->GetPhysicalDevice(); - vii.Device = g_vulkan_context->GetDevice(); - vii.QueueFamily = g_vulkan_context->GetGraphicsQueueFamilyIndex(); - vii.Queue = g_vulkan_context->GetGraphicsQueue(); - vii.PipelineCache = g_vulkan_shader_cache->GetPipelineCache(); - vii.MinImageCount = m_swap_chain->GetImageCount(); - vii.ImageCount = m_swap_chain->GetImageCount(); - vii.MSAASamples = VK_SAMPLE_COUNT_1_BIT; - - if (!ImGui_ImplVulkan_Init(&vii, m_swap_chain->GetClearRenderPass()) || - !ImGui_ImplVulkan_CreateFontsTexture(g_vulkan_context->GetCurrentCommandBuffer())) - { - return false; - } - - ImGui_ImplVulkan_NewFrame(); -#endif - - return true; -} - bool VulkanHostDisplay::Render() { if (ShouldSkipDisplayingFrame()) { #ifdef WITH_IMGUI if (ImGui::GetCurrentContext()) - { ImGui::Render(); - ImGui_ImplVulkan_NewFrame(); - } #endif return false; @@ -656,11 +652,6 @@ bool VulkanHostDisplay::Render() m_swap_chain->GetCurrentImageIndex(), !m_swap_chain->IsVSyncEnabled()); g_vulkan_context->MoveToNextCommandBuffer(); -#ifdef WITH_IMGUI - if (ImGui::GetCurrentContext()) - ImGui_ImplVulkan_NewFrame(); -#endif - return true; } diff --git a/src/frontend-common/vulkan_host_display.h b/src/frontend-common/vulkan_host_display.h index 24f1c7edf..1a49119e2 100644 --- a/src/frontend-common/vulkan_host_display.h +++ b/src/frontend-common/vulkan_host_display.h @@ -98,8 +98,11 @@ protected: virtual bool CreateResources() override; virtual void DestroyResources() override; - virtual bool CreateImGuiContext(); - virtual void DestroyImGuiContext(); +#ifdef WITH_IMGUI + virtual bool CreateImGuiContext() override; + virtual void DestroyImGuiContext() override; + virtual bool UpdateImGuiFontTexture() override; +#endif void BeginSwapChainRenderPass(VkFramebuffer framebuffer); void RenderDisplay();