Browse Source

Add some bits in the global vertex/index memory pool

Panagiotis Christopoulos Charitos 4 years ago
parent
commit
e27e413651

+ 1 - 1
AnKi/Core/App.cpp

@@ -24,7 +24,7 @@
 #include <AnKi/Script/ScriptManager.h>
 #include <AnKi/Resource/ResourceFilesystem.h>
 #include <AnKi/Resource/AsyncLoader.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Ui/UiManager.h>
 #include <AnKi/Ui/Canvas.h>
 #include <csignal>

+ 1 - 1
AnKi/Core/CMakeLists.txt

@@ -1,4 +1,4 @@
-set(SOURCES App.cpp ConfigSet.cpp StagingGpuMemoryManager.cpp DeveloperConsole.cpp CoreTracer.cpp)
+set(SOURCES App.cpp ConfigSet.cpp GpuMemoryManager.cpp DeveloperConsole.cpp CoreTracer.cpp)
 file(GLOB HEADERS *.h)
 
 if(SDL)

+ 42 - 1
AnKi/Core/StagingGpuMemoryManager.cpp → AnKi/Core/GpuMemoryManager.cpp

@@ -3,13 +3,54 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Core/ConfigSet.h>
 #include <AnKi/Gr/GrManager.h>
 #include <AnKi/Util/Tracer.h>
 
 namespace anki {
 
+VertexGpuMemoryManager::~VertexGpuMemoryManager()
+{
+	// Do nothing
+}
+
+Error VertexGpuMemoryManager::init(GenericMemoryPoolAllocator<U8> alloc, GrManager* gr, const ConfigSet& cfg)
+{
+	m_gr = gr;
+
+	// Create the GPU buffer.
+	BufferInitInfo bufferInit("Global vertex & index");
+	bufferInit.m_size = cfg.getNumberU64("core_globalVertexMemorySize");
+	if(!isPowerOfTwo(bufferInit.m_size))
+	{
+		ANKI_CORE_LOGE("core_globalVertexMemorySize should be a power of two (because of the buddy allocator");
+		return Error::USER_DATA;
+	}
+	bufferInit.m_usage = BufferUsageBit::VERTEX | BufferUsageBit::INDEX;
+	m_vertBuffer = gr->newBuffer(bufferInit);
+
+	// Init the rest
+	m_buddyAllocator.init(alloc, __builtin_ctzll(bufferInit.m_size));
+
+	return Error::NONE;
+}
+
+ANKI_USE_RESULT Error VertexGpuMemoryManager::allocate(PtrSize size, PtrSize& offset)
+{
+	U32 offset32;
+	ANKI_CHECK(m_buddyAllocator.allocate(size, offset32));
+
+	offset = offset32;
+
+	return Error::NONE;
+}
+
+void VertexGpuMemoryManager::free(PtrSize size, PtrSize offset)
+{
+	m_buddyAllocator.free(U32(offset), size);
+}
+
 StagingGpuMemoryManager::~StagingGpuMemoryManager()
 {
 	m_gr->finish();

+ 30 - 0
AnKi/Core/StagingGpuMemoryManager.h → AnKi/Core/GpuMemoryManager.h

@@ -8,6 +8,7 @@
 #include <AnKi/Core/Common.h>
 #include <AnKi/Gr/Buffer.h>
 #include <AnKi/Gr/Utils/FrameGpuAllocator.h>
+#include <AnKi/Util/BuddyAllocator.h>
 
 namespace anki {
 
@@ -17,6 +18,35 @@ class ConfigSet;
 /// @addtogroup core
 /// @{
 
+/// Manages vertex and index memory for the whole application.
+class VertexGpuMemoryManager
+{
+public:
+	VertexGpuMemoryManager() = default;
+
+	VertexGpuMemoryManager(const VertexGpuMemoryManager&) = delete; // Non-copyable
+
+	~VertexGpuMemoryManager();
+
+	VertexGpuMemoryManager& operator=(const VertexGpuMemoryManager&) = delete; // Non-copyable
+
+	ANKI_USE_RESULT Error init(GenericMemoryPoolAllocator<U8> alloc, GrManager* gr, const ConfigSet& cfg);
+
+	ANKI_USE_RESULT Error allocate(PtrSize size, PtrSize& offset);
+
+	void free(PtrSize size, PtrSize offset);
+
+	BufferPtr getVertexBuffer() const
+	{
+		return m_vertBuffer;
+	}
+
+private:
+	GrManager* m_gr = nullptr;
+	BufferPtr m_vertBuffer;
+	BuddyAllocator<> m_buddyAllocator;
+};
+
 enum class StagingGpuMemoryType : U8
 {
 	UNIFORM,

+ 1 - 1
AnKi/Renderer/Common.h

@@ -6,7 +6,7 @@
 #pragma once
 
 #include <AnKi/Gr.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Util/Ptr.h>
 #include <AnKi/Shaders/Include/Evsm.h>
 #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>

+ 1 - 1
AnKi/Renderer/Renderer.h

@@ -10,7 +10,7 @@
 #include <AnKi/Math.h>
 #include <AnKi/Gr.h>
 #include <AnKi/Resource/Forward.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Collision/Forward.h>
 
 namespace anki {

+ 1 - 1
AnKi/Renderer/RendererObject.h

@@ -10,7 +10,7 @@
 #include <AnKi/Gr.h>
 #include <AnKi/Resource/ResourceManager.h>
 #include <AnKi/Resource/ShaderProgramResource.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 
 namespace anki {
 

+ 1 - 1
AnKi/Scene/Components/RenderComponent.h

@@ -7,7 +7,7 @@
 
 #include <AnKi/Scene/Components/SceneComponent.h>
 #include <AnKi/Resource/MaterialResource.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Renderer/RenderQueue.h>
 
 namespace anki {

+ 1 - 1
AnKi/Scene/DebugDrawer.cpp

@@ -6,7 +6,7 @@
 #include <AnKi/Scene/DebugDrawer.h>
 #include <AnKi/Resource/ResourceManager.h>
 #include <AnKi/Renderer/RenderQueue.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Physics/PhysicsWorld.h>
 #include <AnKi/Gr/Buffer.h>
 #include <AnKi/Collision.h>

+ 1 - 1
AnKi/Ui/Canvas.cpp

@@ -7,7 +7,7 @@
 #include <AnKi/Ui/Font.h>
 #include <AnKi/Ui/UiManager.h>
 #include <AnKi/Resource/ResourceManager.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Input/Input.h>
 #include <AnKi/Gr/Sampler.h>
 #include <AnKi/Gr/GrManager.h>

+ 1 - 1
Tests/Gr/Gr.cpp

@@ -10,7 +10,7 @@
 #include <AnKi/Input/Input.h>
 #include <AnKi/Core/ConfigSet.h>
 #include <AnKi/Util/HighRezTimer.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 #include <AnKi/Resource/TransferGpuAllocator.h>
 #include <AnKi/ShaderCompiler/Glslang.h>
 #include <AnKi/ShaderCompiler/ShaderProgramParser.h>

+ 1 - 1
Tests/Ui/Ui.cpp

@@ -8,7 +8,7 @@
 #include <AnKi/Util/HighRezTimer.h>
 #include <AnKi/Ui.h>
 #include <AnKi/Input.h>
-#include <AnKi/Core/StagingGpuMemoryManager.h>
+#include <AnKi/Core/GpuMemoryManager.h>
 
 namespace anki {