mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2026-04-27 12:51:42 +00:00
Fix ImGui callbacks leaking memory.
This commit is contained in:
parent
e4621247f2
commit
754736f6d7
6 changed files with 35 additions and 23 deletions
|
|
@ -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"
|
||||
|
|
|
|||
22
UnleashedRecomp/gpu/imgui_common.cpp
Normal file
22
UnleashedRecomp/gpu/imgui_common.cpp
Normal 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;
|
||||
}
|
||||
|
|
@ -41,4 +41,8 @@ union ImGuiCallbackData
|
|||
} setScale;
|
||||
};
|
||||
|
||||
extern ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback);
|
||||
|
||||
extern void ResetImGuiCallbacks();
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue