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
|
set(SWA_GPU_CXX_SOURCES
|
||||||
"gpu/video.cpp"
|
"gpu/video.cpp"
|
||||||
|
"gpu/imgui_common.cpp"
|
||||||
"gpu/imgui_snapshot.cpp"
|
"gpu/imgui_snapshot.cpp"
|
||||||
"gpu/rhi/plume_d3d12.cpp"
|
"gpu/rhi/plume_d3d12.cpp"
|
||||||
"gpu/rhi/plume_vulkan.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;
|
} setScale;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback);
|
||||||
|
|
||||||
|
extern void ResetImGuiCallbacks();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1774,6 +1774,8 @@ static void DrawImGui()
|
||||||
ImGui_ImplSDL2_NewFrame();
|
ImGui_ImplSDL2_NewFrame();
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
ResetImGuiCallbacks();
|
||||||
|
|
||||||
#ifdef ASYNC_PSO_DEBUG
|
#ifdef ASYNC_PSO_DEBUG
|
||||||
if (ImGui::Begin("Async PSO Stats"))
|
if (ImGui::Begin("Async PSO Stats"))
|
||||||
{
|
{
|
||||||
|
|
@ -1789,6 +1791,7 @@ static void DrawImGui()
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
AchievementMenu::Draw();
|
AchievementMenu::Draw();
|
||||||
OptionsMenu::Draw();
|
OptionsMenu::Draw();
|
||||||
AchievementOverlay::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_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
|
#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)
|
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[0] = min.x;
|
||||||
callbackData->setGradient.gradientMin[1] = min.y;
|
callbackData->setGradient.gradientMin[1] = min.y;
|
||||||
callbackData->setGradient.gradientMax[0] = max.x;
|
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()
|
static void ResetGradient()
|
||||||
{
|
{
|
||||||
auto callbackData = AddCallback(ImGuiCallback::SetGradient);
|
auto callbackData = AddImGuiCallback(ImGuiCallback::SetGradient);
|
||||||
memset(&callbackData->setGradient, 0, sizeof(callbackData->setGradient));
|
memset(&callbackData->setGradient, 0, sizeof(callbackData->setGradient));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetShaderModifier(uint32_t shaderModifier)
|
static void SetShaderModifier(uint32_t shaderModifier)
|
||||||
{
|
{
|
||||||
auto callbackData = AddCallback(ImGuiCallback::SetShaderModifier);
|
auto callbackData = AddImGuiCallback(ImGuiCallback::SetShaderModifier);
|
||||||
callbackData->setShaderModifier.shaderModifier = shaderModifier;
|
callbackData->setShaderModifier.shaderModifier = shaderModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetOrigin(ImVec2 origin)
|
static void SetOrigin(ImVec2 origin)
|
||||||
{
|
{
|
||||||
auto callbackData = AddCallback(ImGuiCallback::SetOrigin);
|
auto callbackData = AddImGuiCallback(ImGuiCallback::SetOrigin);
|
||||||
callbackData->setOrigin.origin[0] = origin.x;
|
callbackData->setOrigin.origin[0] = origin.x;
|
||||||
callbackData->setOrigin.origin[1] = origin.y;
|
callbackData->setOrigin.origin[1] = origin.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetScale(ImVec2 scale)
|
static void SetScale(ImVec2 scale)
|
||||||
{
|
{
|
||||||
auto callbackData = AddCallback(ImGuiCallback::SetScale);
|
auto callbackData = AddImGuiCallback(ImGuiCallback::SetScale);
|
||||||
callbackData->setScale.scale[0] = scale.x;
|
callbackData->setScale.scale[0] = scale.x;
|
||||||
callbackData->setScale.scale[1] = scale.y;
|
callbackData->setScale.scale[1] = scale.y;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -996,8 +996,6 @@ void OptionsMenu::Draw()
|
||||||
auto pInputState = SWA::CInputState::GetInstance();
|
auto pInputState = SWA::CInputState::GetInstance();
|
||||||
if (pInputState->GetPadState().IsReleased(SWA::eKeyState_A))
|
if (pInputState->GetPadState().IsReleased(SWA::eKeyState_A))
|
||||||
g_isEnterKeyBuffered = false;
|
g_isEnterKeyBuffered = false;
|
||||||
|
|
||||||
g_callbackDataIndex = 0;
|
|
||||||
|
|
||||||
auto& res = ImGui::GetIO().DisplaySize;
|
auto& res = ImGui::GetIO().DisplaySize;
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetForegroundDrawList();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue