Panagiotis Christopoulos Charitos пре 10 година
родитељ
комит
b8f7937e5e
3 измењених фајлова са 56 додато и 40 уклоњено
  1. 7 1
      include/anki/gr/Common.h
  2. 0 4
      include/anki/gr/Enums.h
  3. 49 35
      src/gr/gl/TextureHandle.cpp

+ 7 - 1
include/anki/gr/Common.h

@@ -66,6 +66,12 @@ using GrAllocator = HeapAllocator<T>;
 /// @addtogroup graphics
 /// @{
 
+// Some constants
+const U MAX_VERTEX_ATTRIBUTES = 16;
+const U MAX_COLOR_ATTACHMENTS = 4;
+const U MAX_MIPMAPS = 16;
+const U MAX_TEXTURE_LAYERS = 32;
+
 /// GL generic callback
 using SwapBuffersCallback = void(*)(void*);
 using MakeCurrentCallback = void(*)(void*, void*);
@@ -106,7 +112,7 @@ struct TextureInitializer
 	U32 m_samples = 1;
 
 	/// [level][slice]
-	SArray<SArray<SurfaceData>> m_data;
+	Array2d<SurfaceData, MAX_MIPMAPS, MAX_TEXTURE_LAYERS> m_data;
 };
 
 struct Attachment

+ 0 - 4
include/anki/gr/Enums.h

@@ -14,10 +14,6 @@ namespace anki {
 /// @addtogroup graphics
 /// @{
 
-// Some constants
-const U MAX_VERTEX_ATTRIBUTES = 16;
-const U MAX_COLOR_ATTACHMENTS = 4;
-
 // Enums
 enum PrimitiveTopology: U8
 {

+ 49 - 35
src/gr/gl/TextureHandle.cpp

@@ -31,33 +31,10 @@ public:
 	Error operator()(CommandBufferImpl* commands)
 	{
 		ANKI_ASSERT(commands);
-		TextureImpl::Initializer init;
-
-		static_cast<GlTextureInitializerBase&>(init) = m_init;
-
-		U layers = 0;
-		switch(m_init.m_target)
-		{
-		case GL_TEXTURE_CUBE_MAP:
-			layers = 6;
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-		case GL_TEXTURE_3D:
-			layers = m_init.m_depth;
-			break;
-		case GL_TEXTURE_2D:
-		case GL_TEXTURE_2D_MULTISAMPLE:
-			layers = 1;
-			break;
-		default:
-			ANKI_ASSERT(0);
-		}
-
-		auto alloc = commands->getAllocator();
-
-		Error err = m_tex.get().create(init);
-
-		GlHandleState oldState = m_tex.get().setStateAtomically(
+
+		Error err = m_tex.get().create(m_init);
+
+		GlObject::State oldState = m_tex.get().setStateAtomically(
 			(err) ? GlObject::State::ERROR : GlObject::State::CREATED);
 		ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
 		(void)oldState;
@@ -125,6 +102,23 @@ public:
 	}
 };
 
+//==============================================================================
+class GenMipmapsCommand: public GlCommand
+{
+public:
+	TextureHandle m_tex;
+
+	GenMipmapsCommand(TextureHandle& tex)
+	:	m_tex(tex)
+	{}
+
+	Error operator()(CommandBufferImpl*)
+	{
+		m_tex.get().generateMipmaps();
+		return ErrorCode::NONE;
+	}
+};
+
 //==============================================================================
 // TextureHandle                                                               =
 //==============================================================================
@@ -147,7 +141,7 @@ Error TextureHandle::create(
 
 	using Deleter = DeferredDeleter<TextureImpl, DeleteCommand>;
 
-	Error err = Base::(&commands.get().getManager(), Deleter());
+	Error err = Base::create(commands.get().getManager(), Deleter());
 	if(!err)
 	{
 		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
@@ -170,14 +164,14 @@ void TextureHandle::bind(CommandBufferHandle& commands, U32 unit)
 void TextureHandle::setFilter(CommandBufferHandle& commands, Filter filter)
 {
 	ANKI_ASSERT(isCreated());
-	commands._pushBackNewCommand<Command>(*this, filter);
+	commands.get().pushBackNewCommand<SetFilterCommand>(*this, filter);
 }
 
 //==============================================================================
 void TextureHandle::generateMipmaps(CommandBufferHandle& commands)
 {
 	ANKI_ASSERT(isCreated());
-	commands.get().pushBackNewCommand<SetFilterCommand>(*this);
+	commands.get().pushBackNewCommand<GenMipmapsCommand>(*this);
 }
 
 //==============================================================================
@@ -275,6 +269,26 @@ public:
 	}
 };
 
+//==============================================================================
+class SetSamplerFilterCommand: public GlCommand
+{
+public:
+	SamplerHandle m_sampler;
+	SamplerHandle::Filter m_filter;
+
+	SetSamplerFilterCommand(const SamplerHandle& sampler, 
+		SamplerHandle::Filter filter)
+	:	m_sampler(sampler), 
+		m_filter(filter)
+	{}
+
+	Error operator()(CommandBufferImpl*)
+	{
+		m_sampler.get().setFilter(m_filter);
+		return ErrorCode::NONE;
+	}
+};
+
 //==============================================================================
 // SamplerHandle                                                               =
 //==============================================================================
@@ -293,10 +307,10 @@ Error SamplerHandle::create(CommandBufferHandle& commands)
 	using DeleteCommand = DeleteObjectCommand<SamplerImpl>;
 	using Deleter = DeferredDeleter<SamplerImpl, DeleteCommand>;
 
-	Error err = Base::create(commands.getManager(), Deleter());
+	Error err = Base::create(commands.get().getManager(), Deleter());
 	if(!err)
 	{
-		get().setStateAtomically(GlHandleState::TO_BE_CREATED);
+		get().setStateAtomically(GlObject::State::TO_BE_CREATED);
 		commands.get().pushBackNewCommand<CreateSamplerCommand>(*this);
 	}
 
@@ -307,14 +321,14 @@ Error SamplerHandle::create(CommandBufferHandle& commands)
 void SamplerHandle::bind(CommandBufferHandle& commands, U32 unit)
 {
 	ANKI_ASSERT(isCreated());
-	commands._pushBackNewCommand<Command>(*this, unit);
+	commands.get().pushBackNewCommand<BindSamplerCommand>(*this, unit);
 }
 
 //==============================================================================
 void SamplerHandle::setFilter(CommandBufferHandle& commands, Filter filter)
 {
 	ANKI_ASSERT(isCreated());
-	commands.get().pushBackNewCommand<BindSamplerCommand>(*this, filter);
+	commands.get().pushBackNewCommand<SetSamplerFilterCommand>(*this, filter);
 }
 
 //==============================================================================
@@ -329,7 +343,7 @@ void SamplerHandle::setParameter(
 //==============================================================================
 void SamplerHandle::bindDefault(CommandBufferHandle& commands, U32 unit)
 {
-	commands.pushBackNewCommand<BindDefaultSamplerCommand>(unit);
+	commands.get().pushBackNewCommand<BindDefaultSamplerCommand>(unit);
 }
 
 } // end namespace anki