Fix ImGui callbacks leaking memory.

This commit is contained in:
Skyth 2024-12-06 18:09:29 +03:00
parent e4621247f2
commit 754736f6d7
6 changed files with 35 additions and 23 deletions

View file

@ -74,6 +74,7 @@ set(SWA_CPU_CXX_SOURCES
set(SWA_GPU_CXX_SOURCES
"gpu/video.cpp"
"gpu/imgui_common.cpp"
"gpu/imgui_snapshot.cpp"
"gpu/rhi/plume_d3d12.cpp"
"gpu/rhi/plume_vulkan.cpp"

View file

@ -0,0 +1,22 @@
#include "imgui_common.h"
static std::vector<std::unique_ptr<ImGuiCallbackData>> g_callbackData;
static uint32_t g_callbackDataIndex = 0;
ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback)
{
if (g_callbackDataIndex >= g_callbackData.size())
g_callbackData.emplace_back(std::make_unique<ImGuiCallbackData>());
auto& callbackData = g_callbackData[g_callbackDataIndex];
++g_callbackDataIndex;
ImGui::GetForegroundDrawList()->AddCallback(reinterpret_cast<ImDrawCallback>(callback), callbackData.get());
return callbackData.get();
}
void ResetImGuiCallbacks()
{
g_callbackDataIndex = 0;
}

View file

@ -41,4 +41,8 @@ union ImGuiCallbackData
} setScale;
};
extern ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback);
extern void ResetImGuiCallbacks();
#endif

View file

@ -1774,6 +1774,8 @@ static void DrawImGui()
ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame();
ResetImGuiCallbacks();
#ifdef ASYNC_PSO_DEBUG
if (ImGui::Begin("Async PSO Stats"))
{
@ -1789,6 +1791,7 @@ static void DrawImGui()
}
ImGui::End();
#endif
AchievementMenu::Draw();
OptionsMenu::Draw();
AchievementOverlay::Draw();

View file

@ -13,25 +13,9 @@
#define CENTRE_TEXT_HORZ(min, max, textSize) min.x + ((max.x - min.x) - textSize.x) / 2
#define CENTRE_TEXT_VERT(min, max, textSize) min.y + ((max.y - min.y) - textSize.y) / 2
static std::vector<std::unique_ptr<ImGuiCallbackData>> g_callbackData;
static uint32_t g_callbackDataIndex = 0;
static ImGuiCallbackData* AddCallback(ImGuiCallback callback)
{
if (g_callbackDataIndex >= g_callbackData.size())
g_callbackData.emplace_back(std::make_unique<ImGuiCallbackData>());
auto& callbackData = g_callbackData[g_callbackDataIndex];
++g_callbackDataIndex;
ImGui::GetForegroundDrawList()->AddCallback(reinterpret_cast<ImDrawCallback>(callback), callbackData.get());
return callbackData.get();
}
static void SetGradient(const ImVec2& min, const ImVec2& max, ImU32 top, ImU32 bottom)
{
auto callbackData = AddCallback(ImGuiCallback::SetGradient);
auto callbackData = AddImGuiCallback(ImGuiCallback::SetGradient);
callbackData->setGradient.gradientMin[0] = min.x;
callbackData->setGradient.gradientMin[1] = min.y;
callbackData->setGradient.gradientMax[0] = max.x;
@ -42,26 +26,26 @@ static void SetGradient(const ImVec2& min, const ImVec2& max, ImU32 top, ImU32 b
static void ResetGradient()
{
auto callbackData = AddCallback(ImGuiCallback::SetGradient);
auto callbackData = AddImGuiCallback(ImGuiCallback::SetGradient);
memset(&callbackData->setGradient, 0, sizeof(callbackData->setGradient));
}
static void SetShaderModifier(uint32_t shaderModifier)
{
auto callbackData = AddCallback(ImGuiCallback::SetShaderModifier);
auto callbackData = AddImGuiCallback(ImGuiCallback::SetShaderModifier);
callbackData->setShaderModifier.shaderModifier = shaderModifier;
}
static void SetOrigin(ImVec2 origin)
{
auto callbackData = AddCallback(ImGuiCallback::SetOrigin);
auto callbackData = AddImGuiCallback(ImGuiCallback::SetOrigin);
callbackData->setOrigin.origin[0] = origin.x;
callbackData->setOrigin.origin[1] = origin.y;
}
static void SetScale(ImVec2 scale)
{
auto callbackData = AddCallback(ImGuiCallback::SetScale);
auto callbackData = AddImGuiCallback(ImGuiCallback::SetScale);
callbackData->setScale.scale[0] = scale.x;
callbackData->setScale.scale[1] = scale.y;
}

View file

@ -996,8 +996,6 @@ void OptionsMenu::Draw()
auto pInputState = SWA::CInputState::GetInstance();
if (pInputState->GetPadState().IsReleased(SWA::eKeyState_A))
g_isEnterKeyBuffered = false;
g_callbackDataIndex = 0;
auto& res = ImGui::GetIO().DisplaySize;
auto drawList = ImGui::GetForegroundDrawList();