Sfoglia il codice sorgente

GL refactoring. Done

Panagiotis Christopoulos Charitos 10 anni fa
parent
commit
71e79a51e9

+ 1 - 1
include/anki/gr/GrHandle.h

@@ -127,7 +127,7 @@ public:
 			if(cb != nullptr)
 			if(cb != nullptr)
 			{
 			{
 				cb->m_del = del;
 				cb->m_del = del;
-				cb->getRefcount().store(1);
+				ptr->GrObject::getRefcount().store(1);
 				cb->m_ptr = ptr;
 				cb->m_ptr = ptr;
 
 
 				m_cb = cb;
 				m_cb = cb;

+ 19 - 6
src/gr/gl/BufferHandle.cpp

@@ -16,7 +16,7 @@ namespace anki {
 
 
 //==============================================================================
 //==============================================================================
 /// Create buffer command
 /// Create buffer command
-class BufferCreateCommand: public GlCommand
+class BufferCreateCommand final: public GlCommand
 {
 {
 public:
 public:
 	BufferHandle m_buff;
 	BufferHandle m_buff;
@@ -24,18 +24,20 @@ public:
 	const void* m_data;
 	const void* m_data;
 	PtrSize m_size;
 	PtrSize m_size;
 	GLbitfield m_flags;
 	GLbitfield m_flags;
+	Bool8 m_cleanup;
 
 
 	BufferCreateCommand(
 	BufferCreateCommand(
 		BufferHandle buff, GLenum target, const void* data, PtrSize size,
 		BufferHandle buff, GLenum target, const void* data, PtrSize size,
-		GLenum flags)
+		GLenum flags, Bool cleanup)
 	:	m_buff(buff), 
 	:	m_buff(buff), 
 		m_target(target), 
 		m_target(target), 
 		m_data(data), 
 		m_data(data), 
 		m_size(size),
 		m_size(size),
-		m_flags(flags)
+		m_flags(flags),
+		m_cleanup(cleanup)
 	{}
 	{}
 
 
-	Error operator()(CommandBufferImpl*) final
+	Error operator()(CommandBufferImpl* cmdb)
 	{
 	{
 		Error err = ErrorCode::NONE;
 		Error err = ErrorCode::NONE;
 
 
@@ -47,6 +49,12 @@ public:
 		(void)oldState;
 		(void)oldState;
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 
 
+		if(m_cleanup)
+		{
+			cmdb->getInternalAllocator().deallocate(
+				const_cast<void*>(m_data), 1);
+		}
+
 		return err;
 		return err;
 	}
 	}
 };
 };
@@ -72,7 +80,7 @@ public:
 		m_size(size)
 		m_size(size)
 	{}
 	{}
 
 
-	Error operator()(CommandBufferImpl*) final
+	Error operator()(CommandBufferImpl* cmdb) final
 	{
 	{
 		ANKI_ASSERT(m_readOffset + m_size <= m_dataSize);
 		ANKI_ASSERT(m_readOffset + m_size <= m_dataSize);
 
 
@@ -81,6 +89,9 @@ public:
 			m_writeOffset, 
 			m_writeOffset, 
 			m_size);
 			m_size);
 
 
+		ANKI_ASSERT(cmdb);
+		cmdb->getInternalAllocator().deallocate(const_cast<void*>(m_data), 1);
+
 		return ErrorCode::NONE;
 		return ErrorCode::NONE;
 	}
 	}
 };
 };
@@ -208,17 +219,19 @@ Error BufferHandle::create(CommandBufferHandle& commands,
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 
 
 		// Allocate temp memory for the data
 		// Allocate temp memory for the data
+		Bool cleanup = false;
 		if(data)
 		if(data)
 		{
 		{
 			void* newData = 
 			void* newData = 
 				commands.get().getInternalAllocator().allocate(size);
 				commands.get().getInternalAllocator().allocate(size);
 			memcpy(newData, data, size);
 			memcpy(newData, data, size);
 			data = newData;
 			data = newData;
+			cleanup = true;
 		}
 		}
 
 
 		// Fire the command
 		// Fire the command
 		commands.get().pushBackNewCommand<BufferCreateCommand>(
 		commands.get().pushBackNewCommand<BufferCreateCommand>(
-			*this, target, data, size, flags);
+			*this, target, data, size, flags, cleanup);
 	}
 	}
 
 
 	return err;
 	return err;

+ 1 - 1
src/gr/gl/FramebufferImpl.cpp

@@ -42,7 +42,7 @@ Error FramebufferImpl::create(Initializer& init)
 		layers[MAX_COLOR_ATTACHMENTS] = 
 		layers[MAX_COLOR_ATTACHMENTS] = 
 			init.m_depthStencilAttachment.m_layer;
 			init.m_depthStencilAttachment.m_layer;
 
 
-		depthStencilBindingPoint = GL_DEPTH_STENCIL_ATTACHMENT;
+		depthStencilBindingPoint = GL_DEPTH_ATTACHMENT;
 	}
 	}
 
 
 	// Now create the FBO
 	// Now create the FBO

+ 8 - 6
src/gr/gl/ShaderHandle.cpp

@@ -20,16 +20,16 @@ class ShaderCreateCommand final: public GlCommand
 public:
 public:
 	ShaderHandle m_shader;
 	ShaderHandle m_shader;
 	GLenum m_type;
 	GLenum m_type;
-	const char* m_source;
+	char* m_source;
 
 
 	ShaderCreateCommand(ShaderHandle shader, 
 	ShaderCreateCommand(ShaderHandle shader, 
-		GLenum type, const char* source)
+		GLenum type, char* source)
 	:	m_shader(shader), 
 	:	m_shader(shader), 
 		m_type(type), 
 		m_type(type), 
 		m_source(source)
 		m_source(source)
 	{}
 	{}
 
 
-	Error operator()(CommandBufferImpl* commands)
+	Error operator()(CommandBufferImpl* cmdb)
 	{
 	{
 		Error err = m_shader.get().create(m_type, 
 		Error err = m_shader.get().create(m_type, 
 			static_cast<const char*>(m_source));
 			static_cast<const char*>(m_source));
@@ -39,6 +39,9 @@ public:
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		(void)oldState;
 		(void)oldState;
 
 
+		// Delete source
+		cmdb->getInternalAllocator().deallocate(m_source, 1);
+
 		return err;
 		return err;
 	}
 	}
 };
 };
@@ -59,7 +62,7 @@ ShaderHandle::~ShaderHandle()
 Error ShaderHandle::create(CommandBufferHandle& commands, 
 Error ShaderHandle::create(CommandBufferHandle& commands, 
 	GLenum type, const void* source, PtrSize sourceSize)
 	GLenum type, const void* source, PtrSize sourceSize)
 {
 {
-	ANKI_ASSERT(strlen(static_cast<const char*>(source)) == sourceSize + 1);
+	ANKI_ASSERT(strlen(static_cast<const char*>(source)) == sourceSize - 1);
 	using DeleteCommand = DeleteObjectCommand<ShaderImpl>;
 	using DeleteCommand = DeleteObjectCommand<ShaderImpl>;
 	using Deleter = DeferredDeleter<ShaderImpl, DeleteCommand>;
 	using Deleter = DeferredDeleter<ShaderImpl, DeleteCommand>;
 
 
@@ -69,8 +72,7 @@ Error ShaderHandle::create(CommandBufferHandle& commands,
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 
 
 		// Copy source to the command buffer
 		// Copy source to the command buffer
-		void* src = commands.get().getInternalAllocator().newArray<char>(
-			sourceSize);
+		void* src = commands.get().getInternalAllocator().allocate(sourceSize);
 		memcpy(src, source, sourceSize);
 		memcpy(src, source, sourceSize);
 
 
 		commands.get().pushBackNewCommand<ShaderCreateCommand>(
 		commands.get().pushBackNewCommand<ShaderCreateCommand>(

+ 25 - 5
src/gr/gl/TextureHandle.cpp

@@ -20,17 +20,20 @@ class CreateTextureCommand: public GlCommand
 public:
 public:
 	TextureHandle m_tex;
 	TextureHandle m_tex;
 	TextureHandle::Initializer m_init;
 	TextureHandle::Initializer m_init;
+	Bool8 m_cleanup = false;
 
 
 	CreateTextureCommand(
 	CreateTextureCommand(
 		TextureHandle tex, 
 		TextureHandle tex, 
-		const TextureHandle::Initializer& init)
+		const TextureHandle::Initializer& init,
+		Bool cleanup)
 	:	m_tex(tex), 
 	:	m_tex(tex), 
-		m_init(init)
+		m_init(init),
+		m_cleanup(cleanup)
 	{}
 	{}
 
 
-	Error operator()(CommandBufferImpl* commands)
+	Error operator()(CommandBufferImpl* cmdb)
 	{
 	{
-		ANKI_ASSERT(commands);
+		ANKI_ASSERT(cmdb);
 
 
 		Error err = m_tex.get().create(m_init);
 		Error err = m_tex.get().create(m_init);
 
 
@@ -39,6 +42,22 @@ public:
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		(void)oldState;
 		(void)oldState;
 
 
+		if(m_cleanup)
+		{
+			for(U layer = 0; layer < MAX_TEXTURE_LAYERS; ++layer)
+			{
+				for(U level = 0; level < MAX_MIPMAPS; ++level)
+				{
+					SurfaceData& surf = m_init.m_data[level][layer];
+					if(surf.m_ptr)
+					{
+						cmdb->getInternalAllocator().deallocate(
+							const_cast<void*>(surf.m_ptr), 1);
+					}
+				}
+			}
+		}
+
 		return err;
 		return err;
 	}
 	}
 };
 };
@@ -168,7 +187,8 @@ Error TextureHandle::create(
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 
 
 		// Fire the command
 		// Fire the command
-		commands.get().pushBackNewCommand<CreateTextureCommand>(*this, init);
+		commands.get().pushBackNewCommand<CreateTextureCommand>(
+			*this, init, init.m_copyDataBeforeReturn);
 	}
 	}
 
 
 	return err;
 	return err;

+ 1 - 2
src/renderer/Dp.cpp

@@ -26,8 +26,7 @@ Error Dp::init(const ConfigSet& config)
 	m_smallDepthRt.setFilter(cmdb, TextureHandle::Filter::LINEAR);
 	m_smallDepthRt.setFilter(cmdb, TextureHandle::Filter::LINEAR);
 
 
 	FramebufferHandle::Initializer fbInit;
 	FramebufferHandle::Initializer fbInit;
-	fbInit.m_colorAttachmentsCount = 1;
-	fbInit.m_colorAttachments[0].m_texture = m_smallDepthRt;
+	fbInit.m_depthStencilAttachment.m_texture = m_smallDepthRt;
 	ANKI_CHECK(m_smallDepthFb.create(cmdb, fbInit));
 	ANKI_CHECK(m_smallDepthFb.create(cmdb, fbInit));
 
 
 	cmdb.finish();
 	cmdb.finish();

+ 2 - 0
src/renderer/Fs.cpp

@@ -26,6 +26,8 @@ Error Fs::init(const ConfigSet&)
 	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs()._getDepthRt();
 	fbInit.m_depthStencilAttachment.m_texture = m_r->getMs()._getDepthRt();
 	ANKI_CHECK(m_fb.create(cmdb,fbInit));
 	ANKI_CHECK(m_fb.create(cmdb,fbInit));
 
 
+	cmdb.flush();
+
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }