|
|
@@ -5,11 +5,126 @@
|
|
|
|
|
|
#include "anki/gr/TextureHandle.h"
|
|
|
#include "anki/gr/gl/TextureImpl.h"
|
|
|
-#include "anki/gr/GlDevice.h"
|
|
|
-#include "anki/gr/GlHandleDeferredDeleter.h"
|
|
|
+#include "anki/gr/GrManager.h"
|
|
|
+#include "anki/gr/gl/DeferredDeleter.h"
|
|
|
|
|
|
namespace anki {
|
|
|
|
|
|
+//==============================================================================
|
|
|
+// Texture commands =
|
|
|
+//==============================================================================
|
|
|
+
|
|
|
+//==============================================================================
|
|
|
+class CreateTextureCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ TextureHandle m_tex;
|
|
|
+ TextureHandle::Initializer m_init;
|
|
|
+
|
|
|
+ CreateTextureCommand(
|
|
|
+ TextureHandle tex,
|
|
|
+ const TextureHandle::Initializer& init)
|
|
|
+ : m_tex(tex),
|
|
|
+ m_init(init)
|
|
|
+ {}
|
|
|
+
|
|
|
+ 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(
|
|
|
+ (err) ? GlObject::State::ERROR : GlObject::State::CREATED);
|
|
|
+ ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
|
|
|
+ (void)oldState;
|
|
|
+
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+//==============================================================================
|
|
|
+class BindTextureCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ TextureHandle m_tex;
|
|
|
+ U32 m_unit;
|
|
|
+
|
|
|
+ BindTextureCommand(TextureHandle& tex, U32 unit)
|
|
|
+ : m_tex(tex),
|
|
|
+ m_unit(unit)
|
|
|
+ {}
|
|
|
+
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ m_tex.get().bind(m_unit);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+//==============================================================================
|
|
|
+class SetFilterCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ TextureHandle m_tex;
|
|
|
+ TextureImpl::Filter m_filter;
|
|
|
+
|
|
|
+ SetFilterCommand(TextureHandle tex, TextureImpl::Filter filter)
|
|
|
+ : m_tex(tex),
|
|
|
+ m_filter(filter)
|
|
|
+ {}
|
|
|
+
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ m_tex.get().setFilter(m_filter);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+//==============================================================================
|
|
|
+class SetParameterCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ TextureHandle m_tex;
|
|
|
+ GLenum m_param;
|
|
|
+ GLint m_value;
|
|
|
+
|
|
|
+ SetParameterCommand(TextureHandle& tex, GLenum param, GLint value)
|
|
|
+ : m_tex(tex),
|
|
|
+ m_param(param),
|
|
|
+ m_value(value)
|
|
|
+ {}
|
|
|
+
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ m_tex.get().setParameter(m_param, m_value);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
//==============================================================================
|
|
|
// TextureHandle =
|
|
|
//==============================================================================
|
|
|
@@ -26,97 +141,19 @@ TextureHandle::~TextureHandle()
|
|
|
Error TextureHandle::create(
|
|
|
CommandBufferHandle& commands, const Initializer& init)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- TextureHandle m_tex;
|
|
|
- TextureHandle::Initializer m_init;
|
|
|
-
|
|
|
- Command(
|
|
|
- TextureHandle tex,
|
|
|
- const TextureHandle::Initializer& init)
|
|
|
- : m_tex(tex),
|
|
|
- m_init(init)
|
|
|
- {}
|
|
|
-
|
|
|
- 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);
|
|
|
- }
|
|
|
-
|
|
|
- for(U level = 0; level < m_init.m_mipmapsCount; level++)
|
|
|
- {
|
|
|
- for(U layer = 0; layer < layers; ++layer)
|
|
|
- {
|
|
|
- auto& buff = m_init.m_data[level][layer];
|
|
|
- auto& initBuff = init.m_data[level][layer];
|
|
|
-
|
|
|
- if(buff.isCreated())
|
|
|
- {
|
|
|
- initBuff.m_ptr = buff.getBaseAddress();
|
|
|
- initBuff.m_size = buff.getSize();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- initBuff.m_ptr = nullptr;
|
|
|
- initBuff.m_size = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- auto alloc = commands->getGlobalAllocator();
|
|
|
-
|
|
|
- Error err = m_tex._get().create(init, alloc);
|
|
|
-
|
|
|
- GlHandleState oldState = m_tex._setState(
|
|
|
- (err) ? GlHandleState::ERROR : GlHandleState::CREATED);
|
|
|
- ANKI_ASSERT(oldState == GlHandleState::TO_BE_CREATED);
|
|
|
- (void)oldState;
|
|
|
-
|
|
|
- return err;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(!isCreated());
|
|
|
|
|
|
- using Alloc = GlAllocator<TextureImpl>;
|
|
|
-
|
|
|
- using DeleteCommand =
|
|
|
- GlDeleteObjectCommand<TextureImpl, Alloc>;
|
|
|
-
|
|
|
- using Deleter = GlHandleDeferredDeleter<TextureImpl, Alloc, DeleteCommand>;
|
|
|
+ using DeleteCommand = DeleteObjectCommand<TextureImpl>;
|
|
|
|
|
|
- Error err = _createAdvanced(
|
|
|
- &commands._getRenderingThread().getDevice(),
|
|
|
- commands._getRenderingThread().getDevice()._getAllocator(),
|
|
|
- Deleter());
|
|
|
+ using Deleter = DeferredDeleter<TextureImpl, DeleteCommand>;
|
|
|
|
|
|
+ Error err = Base::(&commands.get().getManager(), Deleter());
|
|
|
if(!err)
|
|
|
{
|
|
|
- _setState(GlHandleState::TO_BE_CREATED);
|
|
|
+ get().setStateAtomically(GlObject::State::TO_BE_CREATED);
|
|
|
|
|
|
// Fire the command
|
|
|
- commands._pushBackNewCommand<Command>(*this, init);
|
|
|
+ commands.get().pushBackNewCommand<CreateTextureCommand>(*this, init);
|
|
|
}
|
|
|
|
|
|
return err;
|
|
|
@@ -125,49 +162,13 @@ Error TextureHandle::create(
|
|
|
//==============================================================================
|
|
|
void TextureHandle::bind(CommandBufferHandle& commands, U32 unit)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- TextureHandle m_tex;
|
|
|
- U32 m_unit;
|
|
|
-
|
|
|
- Command(TextureHandle& tex, U32 unit)
|
|
|
- : m_tex(tex),
|
|
|
- m_unit(unit)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_tex._get().bind(m_unit);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
- commands._pushBackNewCommand<Command>(*this, unit);
|
|
|
+ commands.get().pushBackNewCommand<BindTextureCommand>(*this, unit);
|
|
|
}
|
|
|
|
|
|
//==============================================================================
|
|
|
void TextureHandle::setFilter(CommandBufferHandle& commands, Filter filter)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- TextureHandle m_tex;
|
|
|
- TextureImpl::Filter m_filter;
|
|
|
-
|
|
|
- Command(TextureHandle tex, TextureImpl::Filter filter)
|
|
|
- : m_tex(tex),
|
|
|
- m_filter(filter)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_tex._get().setFilter(m_filter);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
commands._pushBackNewCommand<Command>(*this, filter);
|
|
|
}
|
|
|
@@ -175,24 +176,8 @@ void TextureHandle::setFilter(CommandBufferHandle& commands, Filter filter)
|
|
|
//==============================================================================
|
|
|
void TextureHandle::generateMipmaps(CommandBufferHandle& commands)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- TextureHandle m_tex;
|
|
|
-
|
|
|
- Command(TextureHandle tex)
|
|
|
- : m_tex(tex)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_tex._get().generateMipmaps();
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
- commands._pushBackNewCommand<Command>(*this);
|
|
|
+ commands.get().pushBackNewCommand<SetFilterCommand>(*this);
|
|
|
}
|
|
|
|
|
|
//==============================================================================
|
|
|
@@ -200,85 +185,119 @@ void TextureHandle::setParameter(CommandBufferHandle& commands,
|
|
|
GLenum param, GLint value)
|
|
|
{
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
-
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- TextureHandle m_tex;
|
|
|
- GLenum m_param;
|
|
|
- GLint m_value;
|
|
|
-
|
|
|
- Command(TextureHandle& tex, GLenum param, GLint value)
|
|
|
- : m_tex(tex),
|
|
|
- m_param(param),
|
|
|
- m_value(value)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_tex._get().setParameter(m_param, m_value);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- ANKI_ASSERT(isCreated());
|
|
|
- commands._pushBackNewCommand<Command>(*this, param, value);
|
|
|
+ commands.get().pushBackNewCommand<SetParameterCommand>(*this, param, value);
|
|
|
}
|
|
|
|
|
|
//==============================================================================
|
|
|
-// SamplerHandle =
|
|
|
+// SamplerCommands =
|
|
|
//==============================================================================
|
|
|
|
|
|
//==============================================================================
|
|
|
-SamplerHandle::SamplerHandle()
|
|
|
-{}
|
|
|
+class CreateSamplerCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ SamplerHandle m_sampler;
|
|
|
|
|
|
-//==============================================================================
|
|
|
-SamplerHandle::~SamplerHandle()
|
|
|
-{}
|
|
|
+ CreateSamplerCommand(const SamplerHandle& sampler)
|
|
|
+ : m_sampler(sampler)
|
|
|
+ {}
|
|
|
+
|
|
|
+ Error operator()(CommandBufferImpl* commands)
|
|
|
+ {
|
|
|
+ ANKI_ASSERT(commands);
|
|
|
+
|
|
|
+ Error err = m_sampler.get().create();
|
|
|
+
|
|
|
+ GlObject::State oldState = m_sampler.get().setStateAtomically(
|
|
|
+ (err) ? GlObject::State::ERROR : GlObject::State::CREATED);
|
|
|
+ ANKI_ASSERT(oldState == GlObject::State::TO_BE_CREATED);
|
|
|
+ (void)oldState;
|
|
|
+
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
//==============================================================================
|
|
|
-Error SamplerHandle::create(CommandBufferHandle& commands)
|
|
|
+class BindSamplerCommand: public GlCommand
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- SamplerHandle m_sampler;
|
|
|
+public:
|
|
|
+ SamplerHandle m_sampler;
|
|
|
+ U32 m_unit;
|
|
|
|
|
|
- Command(const SamplerHandle& sampler)
|
|
|
- : m_sampler(sampler)
|
|
|
- {}
|
|
|
+ BindSamplerCommand(SamplerHandle& sampler, U32 unit)
|
|
|
+ : m_sampler(sampler),
|
|
|
+ m_unit(unit)
|
|
|
+ {}
|
|
|
|
|
|
- Error operator()(CommandBufferImpl* commands)
|
|
|
- {
|
|
|
- ANKI_ASSERT(commands);
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ m_sampler.get().bind(m_unit);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+//==============================================================================
|
|
|
+class SetSamplerParameterCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ SamplerHandle m_sampler;
|
|
|
+ GLenum m_param;
|
|
|
+ GLint m_value;
|
|
|
+
|
|
|
+ SetSamplerParameterCommand(SamplerHandle& sampler,
|
|
|
+ GLenum param, GLint value)
|
|
|
+ : m_sampler(sampler),
|
|
|
+ m_param(param),
|
|
|
+ m_value(value)
|
|
|
+ {}
|
|
|
+
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ m_sampler.get().setParameter(m_param, m_value);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
- Error err = m_sampler._get().create();
|
|
|
+//==============================================================================
|
|
|
+class BindDefaultSamplerCommand: public GlCommand
|
|
|
+{
|
|
|
+public:
|
|
|
+ U32 m_unit;
|
|
|
|
|
|
- GlHandleState oldState = m_sampler._setState(
|
|
|
- (err) ? GlHandleState::ERROR : GlHandleState::CREATED);
|
|
|
- ANKI_ASSERT(oldState == GlHandleState::TO_BE_CREATED);
|
|
|
- (void)oldState;
|
|
|
+ BindDefaultSamplerCommand(U32 unit)
|
|
|
+ : m_unit(unit)
|
|
|
+ {}
|
|
|
|
|
|
- return err;
|
|
|
- }
|
|
|
- };
|
|
|
+ Error operator()(CommandBufferImpl*)
|
|
|
+ {
|
|
|
+ SamplerImpl::unbind(m_unit);
|
|
|
+ return ErrorCode::NONE;
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
- using Alloc = GlAllocator<SamplerImpl>;
|
|
|
+//==============================================================================
|
|
|
+// SamplerHandle =
|
|
|
+//==============================================================================
|
|
|
|
|
|
- using DeleteCommand = GlDeleteObjectCommand<SamplerImpl, Alloc>;
|
|
|
+//==============================================================================
|
|
|
+SamplerHandle::SamplerHandle()
|
|
|
+{}
|
|
|
|
|
|
- using Deleter = GlHandleDeferredDeleter<SamplerImpl, Alloc, DeleteCommand>;
|
|
|
+//==============================================================================
|
|
|
+SamplerHandle::~SamplerHandle()
|
|
|
+{}
|
|
|
|
|
|
- Error err = _createAdvanced(
|
|
|
- &commands._getRenderingThread().getDevice(),
|
|
|
- commands._getRenderingThread().getDevice()._getAllocator(),
|
|
|
- Deleter());
|
|
|
+//==============================================================================
|
|
|
+Error SamplerHandle::create(CommandBufferHandle& commands)
|
|
|
+{
|
|
|
+ using DeleteCommand = DeleteObjectCommand<SamplerImpl>;
|
|
|
+ using Deleter = DeferredDeleter<SamplerImpl, DeleteCommand>;
|
|
|
|
|
|
+ Error err = Base::create(commands.getManager(), Deleter());
|
|
|
if(!err)
|
|
|
{
|
|
|
- _setState(GlHandleState::TO_BE_CREATED);
|
|
|
- commands._pushBackNewCommand<Command>(*this);
|
|
|
+ get().setStateAtomically(GlHandleState::TO_BE_CREATED);
|
|
|
+ commands.get().pushBackNewCommand<CreateSamplerCommand>(*this);
|
|
|
}
|
|
|
|
|
|
return err;
|
|
|
@@ -287,24 +306,6 @@ Error SamplerHandle::create(CommandBufferHandle& commands)
|
|
|
//==============================================================================
|
|
|
void SamplerHandle::bind(CommandBufferHandle& commands, U32 unit)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- SamplerHandle m_sampler;
|
|
|
- U32 m_unit;
|
|
|
-
|
|
|
- Command(SamplerHandle& sampler, U32 unit)
|
|
|
- : m_sampler(sampler),
|
|
|
- m_unit(unit)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_sampler._get().bind(m_unit);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
commands._pushBackNewCommand<Command>(*this, unit);
|
|
|
}
|
|
|
@@ -312,76 +313,23 @@ void SamplerHandle::bind(CommandBufferHandle& commands, U32 unit)
|
|
|
//==============================================================================
|
|
|
void SamplerHandle::setFilter(CommandBufferHandle& commands, Filter filter)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- SamplerHandle m_sampler;
|
|
|
- SamplerHandle::Filter m_filter;
|
|
|
-
|
|
|
- Command(const SamplerHandle& sampler, SamplerHandle::Filter filter)
|
|
|
- : m_sampler(sampler),
|
|
|
- m_filter(filter)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_sampler._get().setFilter(m_filter);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
- commands._pushBackNewCommand<Command>(*this, filter);
|
|
|
+ commands.get().pushBackNewCommand<BindSamplerCommand>(*this, filter);
|
|
|
}
|
|
|
|
|
|
//==============================================================================
|
|
|
void SamplerHandle::setParameter(
|
|
|
CommandBufferHandle& commands, GLenum param, GLint value)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- SamplerHandle m_sampler;
|
|
|
- GLenum m_param;
|
|
|
- GLint m_value;
|
|
|
-
|
|
|
- Command(SamplerHandle& sampler, GLenum param, GLint value)
|
|
|
- : m_sampler(sampler),
|
|
|
- m_param(param),
|
|
|
- m_value(value)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- m_sampler._get().setParameter(m_param, m_value);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
ANKI_ASSERT(isCreated());
|
|
|
- commands._pushBackNewCommand<Command>(*this, param, value);
|
|
|
+ commands.get().pushBackNewCommand<SetSamplerParameterCommand>(
|
|
|
+ *this, param, value);
|
|
|
}
|
|
|
|
|
|
//==============================================================================
|
|
|
void SamplerHandle::bindDefault(CommandBufferHandle& commands, U32 unit)
|
|
|
{
|
|
|
- class Command: public GlCommand
|
|
|
- {
|
|
|
- public:
|
|
|
- U32 m_unit;
|
|
|
-
|
|
|
- Command(U32 unit)
|
|
|
- : m_unit(unit)
|
|
|
- {}
|
|
|
-
|
|
|
- Error operator()(CommandBufferImpl*)
|
|
|
- {
|
|
|
- SamplerImpl::unbind(m_unit);
|
|
|
- return ErrorCode::NONE;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- commands._pushBackNewCommand<Command>(unit);
|
|
|
+ commands.pushBackNewCommand<BindDefaultSamplerCommand>(unit);
|
|
|
}
|
|
|
|
|
|
} // end namespace anki
|