fixed leak
This commit is contained in:
parent
b6fafb5cf9
commit
9c2a2fb39d
5 changed files with 23 additions and 5 deletions
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include "profiler_ui.h"
|
||||
#include "engine/crt.h"
|
||||
#include "engine/debug.h"
|
||||
#include "engine/engine.h"
|
||||
#include "engine/fibers.h"
|
||||
#include "engine/file_system.h"
|
||||
#include "engine/job_system.h"
|
||||
|
@ -9,11 +11,10 @@
|
|||
#include "engine/math.h"
|
||||
#include "engine/mt/atomic.h"
|
||||
#include "engine/os.h"
|
||||
#include "engine/page_allocator.h"
|
||||
#include "engine/profiler.h"
|
||||
#include "engine/resource.h"
|
||||
#include "engine/resource_manager.h"
|
||||
#include "engine/debug.h"
|
||||
#include "engine/engine.h"
|
||||
#include "utils.h"
|
||||
|
||||
|
||||
|
@ -418,6 +419,9 @@ void ProfilerUIImpl::onGUIMemoryProfiler()
|
|||
m_main_allocator.checkGuards();
|
||||
}
|
||||
ImGui::Text("Total size: %.3fMB", (m_main_allocator.getTotalSize() / 1024) / 1024.0f);
|
||||
const PageAllocator& page_allocator = m_engine.getPageAllocator();
|
||||
const float reserved_pages_size = (page_allocator.getReservedCount() * PageAllocator::PAGE_SIZE) / (1024.f * 1024.f);
|
||||
ImGui::Text("Page allocator: %.3fMB", reserved_pages_size);
|
||||
|
||||
ImGui::Columns(2, "memc");
|
||||
for (auto* child : m_allocation_root->m_children)
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace Lumix
|
|||
|
||||
PageAllocator::~PageAllocator()
|
||||
{
|
||||
ASSERT(allocated_count == 0);
|
||||
void* p = free_pages;
|
||||
while (p) {
|
||||
void* tmp = p;
|
||||
|
@ -34,12 +35,14 @@ void PageAllocator::unlock()
|
|||
void* PageAllocator::allocate(bool lock)
|
||||
{
|
||||
if (lock) mutex.enter();
|
||||
++allocated_count;
|
||||
if (free_pages) {
|
||||
void* tmp = free_pages;
|
||||
memcpy(&free_pages, free_pages, sizeof(free_pages));
|
||||
if (lock) mutex.exit();
|
||||
return tmp;
|
||||
}
|
||||
++reserved_count;
|
||||
if (lock) mutex.exit();
|
||||
return VirtualAlloc(nullptr, PAGE_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||
}
|
||||
|
@ -48,6 +51,7 @@ void* PageAllocator::allocate(bool lock)
|
|||
void PageAllocator::deallocate(void* mem, bool lock)
|
||||
{
|
||||
if (lock) mutex.enter();
|
||||
--allocated_count;
|
||||
memcpy(mem, &free_pages, sizeof(free_pages));
|
||||
free_pages = mem;
|
||||
if (lock) mutex.exit();
|
||||
|
|
|
@ -18,11 +18,15 @@ public:
|
|||
|
||||
void* allocate(bool lock);
|
||||
void deallocate(void* mem, bool lock);
|
||||
u32 getAllocatedCount() const { return allocated_count; }
|
||||
u32 getReservedCount() const { return reserved_count; }
|
||||
|
||||
void lock();
|
||||
void unlock();
|
||||
|
||||
private:
|
||||
u32 allocated_count = 0;
|
||||
u32 reserved_count = 0;
|
||||
void* free_pages = nullptr;
|
||||
MT::CriticalSection mutex;
|
||||
};
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace Lumix
|
|||
LuaScriptManager& getScriptManager() { return m_script_manager; }
|
||||
|
||||
Engine& m_engine;
|
||||
Debug::Allocator m_allocator;
|
||||
IAllocator& m_allocator;
|
||||
LuaScriptManager m_script_manager;
|
||||
};
|
||||
|
||||
|
|
|
@ -2109,7 +2109,10 @@ struct PipelineImpl final : Pipeline
|
|||
do {} while(false)
|
||||
|
||||
PROFILE_FUNCTION();
|
||||
if(m_cmds->header.size == 0 && m_cmds->header.next == nullptr) return;
|
||||
if(m_cmds->header.size == 0 && m_cmds->header.next == nullptr) {
|
||||
m_pipeline->m_renderer.getEngine().getPageAllocator().deallocate(m_cmds, true);
|
||||
return;
|
||||
}
|
||||
|
||||
const u64 blend_state = gpu::getBlendStateBits(gpu::BlendFactors::ONE, gpu::BlendFactors::ONE, gpu::BlendFactors::ONE, gpu::BlendFactors::ONE);
|
||||
CmdPage* page = m_cmds;
|
||||
|
@ -2237,7 +2240,10 @@ struct PipelineImpl final : Pipeline
|
|||
cmd += sizeof(T); \
|
||||
do {} while(false)
|
||||
PROFILE_FUNCTION();
|
||||
if(m_cmds->header.size == 0 && !m_cmds->header.next) return;
|
||||
if(m_cmds->header.size == 0 && !m_cmds->header.next) {
|
||||
m_pipeline->m_renderer.getEngine().getPageAllocator().deallocate(m_cmds, true);
|
||||
return;
|
||||
}
|
||||
|
||||
Renderer& renderer = m_pipeline->m_renderer;
|
||||
|
||||
|
|
Loading…
Reference in a new issue