ソースを参照

Some refactoring and some vulkan fixes

Panagiotis Christopoulos Charitos 7 年 前
コミット
b9c6cdf467
64 ファイル変更179 行追加147 行削除
  1. 1 1
      src/anki/core/StagingGpuMemoryManager.cpp
  2. 2 2
      src/anki/gr/Buffer.h
  3. 8 3
      src/anki/gr/CommandBuffer.h
  4. 2 2
      src/anki/gr/Fence.h
  5. 2 2
      src/anki/gr/Framebuffer.h
  6. 10 1
      src/anki/gr/GrObject.cpp
  7. 8 1
      src/anki/gr/GrObject.h
  8. 2 2
      src/anki/gr/OcclusionQuery.h
  9. 3 3
      src/anki/gr/RenderGraph.cpp
  10. 1 1
      src/anki/gr/RenderGraph.h
  11. 2 2
      src/anki/gr/Sampler.h
  12. 2 2
      src/anki/gr/Shader.h
  13. 3 3
      src/anki/gr/ShaderProgram.h
  14. 2 2
      src/anki/gr/Texture.h
  15. 2 2
      src/anki/gr/TextureView.h
  16. 1 1
      src/anki/gr/gl/Buffer.cpp
  17. 2 2
      src/anki/gr/gl/BufferImpl.h
  18. 1 1
      src/anki/gr/gl/CommandBuffer.cpp
  19. 2 2
      src/anki/gr/gl/CommandBufferImpl.h
  20. 2 2
      src/anki/gr/gl/FenceImpl.h
  21. 1 1
      src/anki/gr/gl/Framebuffer.cpp
  22. 2 2
      src/anki/gr/gl/FramebufferImpl.h
  23. 1 1
      src/anki/gr/gl/OcclusionQuery.cpp
  24. 2 2
      src/anki/gr/gl/OcclusionQueryImpl.h
  25. 1 1
      src/anki/gr/gl/RenderingThread.cpp
  26. 1 1
      src/anki/gr/gl/Sampler.cpp
  27. 2 2
      src/anki/gr/gl/SamplerImpl.h
  28. 1 1
      src/anki/gr/gl/Shader.cpp
  29. 2 2
      src/anki/gr/gl/ShaderImpl.h
  30. 1 1
      src/anki/gr/gl/ShaderProgram.cpp
  31. 2 2
      src/anki/gr/gl/ShaderProgramImpl.h
  32. 1 1
      src/anki/gr/gl/Texture.cpp
  33. 2 2
      src/anki/gr/gl/TextureImpl.h
  34. 1 1
      src/anki/gr/gl/TextureView.cpp
  35. 2 2
      src/anki/gr/gl/TextureViewImpl.h
  36. 7 1
      src/anki/gr/vulkan/Buffer.cpp
  37. 2 2
      src/anki/gr/vulkan/BufferImpl.h
  38. 7 1
      src/anki/gr/vulkan/CommandBuffer.cpp
  39. 2 2
      src/anki/gr/vulkan/CommandBufferImpl.h
  40. 1 1
      src/anki/gr/vulkan/Fence.cpp
  41. 2 2
      src/anki/gr/vulkan/FenceImpl.h
  42. 7 1
      src/anki/gr/vulkan/Framebuffer.cpp
  43. 1 2
      src/anki/gr/vulkan/FramebufferImpl.cpp
  44. 2 4
      src/anki/gr/vulkan/FramebufferImpl.h
  45. 1 1
      src/anki/gr/vulkan/GrManagerImpl.cpp
  46. 7 1
      src/anki/gr/vulkan/OcclusionQuery.cpp
  47. 2 2
      src/anki/gr/vulkan/OcclusionQueryImpl.h
  48. 7 1
      src/anki/gr/vulkan/Sampler.cpp
  49. 2 2
      src/anki/gr/vulkan/SamplerImpl.h
  50. 7 1
      src/anki/gr/vulkan/Shader.cpp
  51. 2 2
      src/anki/gr/vulkan/ShaderImpl.h
  52. 7 1
      src/anki/gr/vulkan/ShaderProgram.cpp
  53. 2 2
      src/anki/gr/vulkan/ShaderProgramImpl.h
  54. 7 1
      src/anki/gr/vulkan/Texture.cpp
  55. 1 9
      src/anki/gr/vulkan/TextureImpl.cpp
  56. 2 4
      src/anki/gr/vulkan/TextureImpl.h
  57. 7 1
      src/anki/gr/vulkan/TextureView.cpp
  58. 2 2
      src/anki/gr/vulkan/TextureViewImpl.h
  59. 0 6
      src/anki/gr/vulkan/VulkanObject.h
  60. 0 27
      src/anki/gr/vulkan/VulkanObject.inl.h
  61. 2 1
      src/anki/renderer/DepthDownscale.cpp
  62. 4 2
      src/anki/renderer/GBuffer.cpp
  63. 4 3
      src/anki/renderer/Indirect.cpp
  64. 2 3
      src/anki/resource/TextureResource.cpp

+ 1 - 1
src/anki/core/StagingGpuMemoryManager.cpp

@@ -40,7 +40,7 @@ Error StagingGpuMemoryManager::init(GrManager* gr, const ConfigSet& cfg)
 	gr->getStorageBufferInfo(alignment, maxSize);
 	initBuffer(StagingGpuMemoryType::STORAGE, alignment, maxSize, BufferUsageBit::STORAGE_ALL, *gr);
 
-	initBuffer(StagingGpuMemoryType::VERTEX, 16, MAX_U32, BufferUsageBit::VERTEX, *gr);
+	initBuffer(StagingGpuMemoryType::VERTEX, 16, MAX_U32, BufferUsageBit::VERTEX | BufferUsageBit::INDEX, *gr);
 
 	gr->getTextureBufferInfo(alignment, maxSize);
 	initBuffer(StagingGpuMemoryType::TEXTURE, alignment, maxSize, BufferUsageBit::TEXTURE_ALL, *gr);

+ 2 - 2
src/anki/gr/Buffer.h

@@ -80,8 +80,8 @@ protected:
 	BufferMapAccessBit m_access = BufferMapAccessBit::NONE;
 
 	/// Construct.
-	Buffer(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Buffer(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 8 - 3
src/anki/gr/CommandBuffer.h

@@ -114,7 +114,7 @@ enum class CommandBufferFlag : U8
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(CommandBufferFlag, inline)
 
 /// Command buffer init info.
-class CommandBufferInitInfo
+class CommandBufferInitInfo : public GrBaseInitInfo
 {
 public:
 	FramebufferPtr m_framebuffer; ///< For second level command buffers.
@@ -123,6 +123,11 @@ public:
 	CommandBufferInitHints m_hints;
 
 	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
+
+	CommandBufferInitInfo(CString name = {})
+		: GrBaseInitInfo(name)
+	{
+	}
 };
 
 /// Command buffer.
@@ -377,8 +382,8 @@ public:
 
 protected:
 	/// Construct.
-	CommandBuffer(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	CommandBuffer(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/Fence.h

@@ -28,8 +28,8 @@ public:
 
 protected:
 	/// Construct.
-	Fence(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Fence(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/Framebuffer.h

@@ -91,8 +91,8 @@ public:
 
 protected:
 	/// Construct.
-	Framebuffer(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Framebuffer(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 10 - 1
src/anki/gr/GrObject.cpp

@@ -9,12 +9,21 @@
 namespace anki
 {
 
-GrObject::GrObject(GrManager* manager, GrObjectType type)
+GrObject::GrObject(GrManager* manager, GrObjectType type, CString name)
 	: m_refcount(0)
 	, m_manager(manager)
 	, m_uuid(m_manager->getUuidIndex()++)
 	, m_type(type)
 {
+	if(name && name.getLength())
+	{
+		ANKI_ASSERT(name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
+		memcpy(&m_name[0], &name[0], name.getLength() + 1);
+	}
+	else
+	{
+		m_name[0] = '\0';
+	}
 }
 
 GrObject::~GrObject()

+ 8 - 1
src/anki/gr/GrObject.h

@@ -36,7 +36,7 @@ enum GrObjectType : U16
 class GrObject : public NonCopyable
 {
 public:
-	GrObject(GrManager* manager, GrObjectType type);
+	GrObject(GrManager* manager, GrObjectType type, CString name);
 
 	virtual ~GrObject();
 
@@ -68,11 +68,18 @@ public:
 		return m_uuid;
 	}
 
+	/// Get its name.
+	CString getName() const
+	{
+		return &m_name[0];
+	}
+
 private:
 	Atomic<I32> m_refcount;
 	GrManager* m_manager;
 	U64 m_uuid;
 	GrObjectType m_type;
+	Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> m_name;
 };
 /// @}
 

+ 2 - 2
src/anki/gr/OcclusionQuery.h

@@ -23,8 +23,8 @@ public:
 
 protected:
 	/// Construct.
-	OcclusionQuery(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	OcclusionQuery(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 3 - 3
src/anki/gr/RenderGraph.cpp

@@ -217,8 +217,8 @@ void FramebufferDescription::bake()
 	ANKI_ASSERT(m_hash != 0 && m_hash != 1);
 }
 
-RenderGraph::RenderGraph(GrManager* manager)
-	: GrObject(manager, CLASS_TYPE)
+RenderGraph::RenderGraph(GrManager* manager, CString name)
+	: GrObject(manager, CLASS_TYPE, name)
 {
 	ANKI_ASSERT(manager);
 }
@@ -240,7 +240,7 @@ RenderGraph::~RenderGraph()
 
 RenderGraph* RenderGraph::newInstance(GrManager* manager)
 {
-	return manager->getAllocator().newInstance<RenderGraph>(manager);
+	return manager->getAllocator().newInstance<RenderGraph>(manager, "N/A");
 }
 
 void RenderGraph::reset()

+ 1 - 1
src/anki/gr/RenderGraph.h

@@ -643,7 +643,7 @@ private:
 	BakeContext* m_ctx = nullptr;
 	U64 m_version = 0;
 
-	RenderGraph(GrManager* manager);
+	RenderGraph(GrManager* manager, CString name);
 
 	~RenderGraph();
 

+ 2 - 2
src/anki/gr/Sampler.h

@@ -55,8 +55,8 @@ public:
 
 protected:
 	/// Construct.
-	Sampler(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Sampler(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/Shader.h

@@ -144,8 +144,8 @@ protected:
 	ShaderType m_shaderType = ShaderType::COUNT;
 
 	/// Construct.
-	Shader(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Shader(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 3 - 3
src/anki/gr/ShaderProgram.h

@@ -15,7 +15,7 @@ namespace anki
 /// @{
 
 /// ShaderProgram init info.
-class ShaderProgramInitInfo : GrBaseInitInfo
+class ShaderProgramInitInfo : public GrBaseInitInfo
 {
 public:
 	Array<ShaderPtr, U(ShaderType::COUNT)> m_shaders = {};
@@ -72,8 +72,8 @@ public:
 
 protected:
 	/// Construct.
-	ShaderProgram(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	ShaderProgram(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/Texture.h

@@ -255,8 +255,8 @@ protected:
 	DepthStencilAspectBit m_aspect = DepthStencilAspectBit::NONE;
 
 	/// Construct.
-	Texture(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	Texture(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/TextureView.h

@@ -100,8 +100,8 @@ protected:
 	TextureSubresourceInfo m_subresource;
 
 	/// Construct.
-	TextureView(GrManager* manager)
-		: GrObject(manager, CLASS_TYPE)
+	TextureView(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
 	{
 		m_subresource.m_depthStencilAspect = DepthStencilAspectBit::NONE;
 

+ 1 - 1
src/anki/gr/gl/Buffer.cpp

@@ -37,7 +37,7 @@ Buffer* Buffer::newInstance(GrManager* manager, const BufferInitInfo& inf)
 		}
 	};
 
-	BufferImpl* impl = manager->getAllocator().newInstance<BufferImpl>(manager);
+	BufferImpl* impl = manager->getAllocator().newInstance<BufferImpl>(manager, inf.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	impl->preInit(inf);

+ 2 - 2
src/anki/gr/gl/BufferImpl.h

@@ -18,8 +18,8 @@ namespace anki
 class BufferImpl final : public Buffer, public GlObject
 {
 public:
-	BufferImpl(GrManager* manager)
-		: Buffer(manager)
+	BufferImpl(GrManager* manager, CString name)
+		: Buffer(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/CommandBuffer.cpp

@@ -25,7 +25,7 @@ namespace anki
 
 CommandBuffer* CommandBuffer::newInstance(GrManager* manager, const CommandBufferInitInfo& inf)
 {
-	CommandBufferImpl* impl = manager->getAllocator().newInstance<CommandBufferImpl>(manager);
+	CommandBufferImpl* impl = manager->getAllocator().newInstance<CommandBufferImpl>(manager, inf.getName());
 	impl->init(inf);
 	return impl;
 }

+ 2 - 2
src/anki/gr/gl/CommandBufferImpl.h

@@ -55,8 +55,8 @@ public:
 	StateTracker m_state;
 
 	/// Default constructor
-	CommandBufferImpl(GrManager* manager)
-		: CommandBuffer(manager)
+	CommandBufferImpl(GrManager* manager, CString name)
+		: CommandBuffer(manager, name)
 	{
 	}
 

+ 2 - 2
src/anki/gr/gl/FenceImpl.h

@@ -21,8 +21,8 @@ public:
 	GLsync m_fence = nullptr;
 	Atomic<Bool> m_signaled = {false};
 
-	FenceImpl(GrManager* gr)
-		: Fence(gr)
+	FenceImpl(GrManager* gr, CString name)
+		: Fence(gr, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/Framebuffer.cpp

@@ -39,7 +39,7 @@ Framebuffer* Framebuffer::newInstance(GrManager* manager, const FramebufferInitI
 		}
 	};
 
-	FramebufferImpl* impl = manager->getAllocator().newInstance<FramebufferImpl>(manager);
+	FramebufferImpl* impl = manager->getAllocator().newInstance<FramebufferImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());

+ 2 - 2
src/anki/gr/gl/FramebufferImpl.h

@@ -18,8 +18,8 @@ namespace anki
 class FramebufferImpl final : public Framebuffer, public GlObject
 {
 public:
-	FramebufferImpl(GrManager* manager)
-		: Framebuffer(manager)
+	FramebufferImpl(GrManager* manager, CString name)
+		: Framebuffer(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/OcclusionQuery.cpp

@@ -38,7 +38,7 @@ OcclusionQuery* OcclusionQuery::newInstance(GrManager* manager)
 		}
 	};
 
-	OcclusionQueryImpl* impl = manager->getAllocator().newInstance<OcclusionQueryImpl>(manager);
+	OcclusionQueryImpl* impl = manager->getAllocator().newInstance<OcclusionQueryImpl>(manager, "N/A");
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());

+ 2 - 2
src/anki/gr/gl/OcclusionQueryImpl.h

@@ -18,8 +18,8 @@ namespace anki
 class OcclusionQueryImpl final : public OcclusionQuery, public GlObject
 {
 public:
-	OcclusionQueryImpl(GrManager* manager)
-		: OcclusionQuery(manager)
+	OcclusionQueryImpl(GrManager* manager, CString name)
+		: OcclusionQuery(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/RenderingThread.cpp

@@ -87,7 +87,7 @@ void RenderingThread::flushCommandBuffer(CommandBufferPtr cmdb, FencePtr* fence)
 	if(fence)
 	{
 		FencePtr& f = *fence;
-		FenceImpl* fenceImpl = m_manager->getAllocator().newInstance<FenceImpl>(m_manager.get());
+		FenceImpl* fenceImpl = m_manager->getAllocator().newInstance<FenceImpl>(m_manager.get(), "N/A");
 		f.reset(fenceImpl);
 
 		class CreateFenceCmd final : public GlCommand

+ 1 - 1
src/anki/gr/gl/Sampler.cpp

@@ -39,7 +39,7 @@ Sampler* Sampler::newInstance(GrManager* manager, const SamplerInitInfo& init)
 		}
 	};
 
-	SamplerImpl* impl = manager->getAllocator().newInstance<SamplerImpl>(manager);
+	SamplerImpl* impl = manager->getAllocator().newInstance<SamplerImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());

+ 2 - 2
src/anki/gr/gl/SamplerImpl.h

@@ -18,8 +18,8 @@ namespace anki
 class SamplerImpl final : public Sampler, public GlObject
 {
 public:
-	SamplerImpl(GrManager* manager)
-		: Sampler(manager)
+	SamplerImpl(GrManager* manager, CString name)
+		: Sampler(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/Shader.cpp

@@ -54,7 +54,7 @@ Shader* Shader::newInstance(GrManager* manager, const ShaderInitInfo& init)
 
 	ANKI_ASSERT(!init.m_binary.isEmpty());
 
-	ShaderImpl* impl = manager->getAllocator().newInstance<ShaderImpl>(manager);
+	ShaderImpl* impl = manager->getAllocator().newInstance<ShaderImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	// Need to pre-init because some funcs ask for members and we don't want to serialize

+ 2 - 2
src/anki/gr/gl/ShaderImpl.h

@@ -23,8 +23,8 @@ class ShaderImpl final : public Shader, public GlObject
 public:
 	GLenum m_glType = 0;
 
-	ShaderImpl(GrManager* manager)
-		: Shader(manager)
+	ShaderImpl(GrManager* manager, CString name)
+		: Shader(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/ShaderProgram.cpp

@@ -57,7 +57,7 @@ ShaderProgram* ShaderProgram::newInstance(GrManager* manager, const ShaderProgra
 
 	ANKI_ASSERT(init.isValid());
 
-	ShaderProgramImpl* impl = manager->getAllocator().newInstance<ShaderProgramImpl>(manager);
+	ShaderProgramImpl* impl = manager->getAllocator().newInstance<ShaderProgramImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	CommandBufferPtr cmdb = manager->newCommandBuffer(CommandBufferInitInfo());

+ 2 - 2
src/anki/gr/gl/ShaderProgramImpl.h

@@ -18,8 +18,8 @@ namespace anki
 class ShaderProgramImpl final : public ShaderProgram, public GlObject
 {
 public:
-	ShaderProgramImpl(GrManager* manager)
-		: ShaderProgram(manager)
+	ShaderProgramImpl(GrManager* manager, CString name)
+		: ShaderProgram(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/Texture.cpp

@@ -39,7 +39,7 @@ Texture* Texture::newInstance(GrManager* manager, const TextureInitInfo& init)
 		}
 	};
 
-	TextureImpl* impl = manager->getAllocator().newInstance<TextureImpl>(manager);
+	TextureImpl* impl = manager->getAllocator().newInstance<TextureImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	// Need to pre-init because some funcs ask for members and we don't want to serialize

+ 2 - 2
src/anki/gr/gl/TextureImpl.h

@@ -35,8 +35,8 @@ public:
 	U8 m_faceCount = 0; ///< 6 for cubes and 1 for the rest.
 	Bool8 m_compressed = false;
 
-	TextureImpl(GrManager* manager)
-		: Texture(manager)
+	TextureImpl(GrManager* manager, CString name)
+		: Texture(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/gl/TextureView.cpp

@@ -37,7 +37,7 @@ TextureView* TextureView::newInstance(GrManager* manager, const TextureViewInitI
 		}
 	};
 
-	TextureViewImpl* impl = manager->getAllocator().newInstance<TextureViewImpl>(manager);
+	TextureViewImpl* impl = manager->getAllocator().newInstance<TextureViewImpl>(manager, init.getName());
 	impl->getRefcount().fetchAdd(1); // Hold a reference in case the command finishes and deletes quickly
 
 	// Need to pre-init because some funcs ask for members and we don't want to serialize

+ 2 - 2
src/anki/gr/gl/TextureViewImpl.h

@@ -22,8 +22,8 @@ public:
 	MicroTextureView m_view = {};
 	TexturePtr m_tex; ///< Hold a reference.
 
-	TextureViewImpl(GrManager* manager)
-		: TextureView(manager)
+	TextureViewImpl(GrManager* manager, CString name)
+		: TextureView(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/Buffer.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 Buffer* Buffer::newInstance(GrManager* manager, const BufferInitInfo& init)
 {
-	return BufferImpl::newInstanceHelper(manager, init);
+	BufferImpl* impl = manager->getAllocator().newInstance<BufferImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 void* Buffer::map(PtrSize offset, PtrSize range, BufferMapAccessBit access)

+ 2 - 2
src/anki/gr/vulkan/BufferImpl.h

@@ -19,8 +19,8 @@ namespace anki
 class BufferImpl final : public Buffer, public VulkanObject<Buffer, BufferImpl>
 {
 public:
-	BufferImpl(GrManager* manager)
-		: Buffer(manager)
+	BufferImpl(GrManager* manager, CString name)
+		: Buffer(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/CommandBuffer.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 CommandBuffer* CommandBuffer::newInstance(GrManager* manager, const CommandBufferInitInfo& init)
 {
-	return CommandBufferImpl::newInstanceHelper(manager, init);
+	CommandBufferImpl* impl = manager->getAllocator().newInstance<CommandBufferImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 CommandBufferInitHints CommandBuffer::computeInitHints() const

+ 2 - 2
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -47,8 +47,8 @@ class CommandBufferImpl final : public CommandBuffer, public VulkanObject<Comman
 {
 public:
 	/// Default constructor
-	CommandBufferImpl(GrManager* manager)
-		: CommandBuffer(manager)
+	CommandBufferImpl(GrManager* manager, CString name)
+		: CommandBuffer(manager, name)
 	{
 	}
 

+ 1 - 1
src/anki/gr/vulkan/Fence.cpp

@@ -12,7 +12,7 @@ namespace anki
 
 Fence* Fence::newInstance(GrManager* manager)
 {
-	return manager->getAllocator().newInstance<FenceImpl>(manager);
+	return manager->getAllocator().newInstance<FenceImpl>(manager, "N/A");
 }
 
 Bool Fence::clientWait(Second seconds)

+ 2 - 2
src/anki/gr/vulkan/FenceImpl.h

@@ -21,8 +21,8 @@ class FenceImpl final : public Fence, public VulkanObject<Fence, FenceImpl>
 public:
 	MicroFencePtr m_fence;
 
-	FenceImpl(GrManager* manager)
-		: Fence(manager)
+	FenceImpl(GrManager* manager, CString name)
+		: Fence(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/Framebuffer.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 Framebuffer* Framebuffer::newInstance(GrManager* manager, const FramebufferInitInfo& init)
 {
-	return FramebufferImpl::newInstanceHelper(manager, init);
+	FramebufferImpl* impl = manager->getAllocator().newInstance<FramebufferImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 1 - 2
src/anki/gr/vulkan/FramebufferImpl.cpp

@@ -39,7 +39,6 @@ Error FramebufferImpl::init(const FramebufferInitInfo& init)
 
 	// Init common
 	m_defaultFb = init.refersToDefaultFramebuffer();
-	strcpy(&m_name[0], (init.getName()) ? init.getName().cstr() : "");
 
 	for(U i = 0; i < init.m_colorAttachmentCount; ++i)
 	{
@@ -294,7 +293,7 @@ VkRenderPass FramebufferImpl::getRenderPassHandle(
 			}
 
 			ANKI_VK_CHECKF(vkCreateRenderPass(getDevice(), &ci, nullptr, &out));
-			getGrManagerImpl().trySetVulkanHandleName(&m_name[0], VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, out);
+			getGrManagerImpl().trySetVulkanHandleName(getName(), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, out);
 
 			m_noDflt.m_rpasses.emplace(getAllocator(), hash, out);
 		}

+ 2 - 4
src/anki/gr/vulkan/FramebufferImpl.h

@@ -24,8 +24,8 @@ class FramebufferAttachmentInfo;
 class FramebufferImpl final : public Framebuffer, public VulkanObject<Framebuffer, FramebufferImpl>
 {
 public:
-	FramebufferImpl(GrManager* manager)
-		: Framebuffer(manager)
+	FramebufferImpl(GrManager* manager, CString name)
+		: Framebuffer(manager, name)
 	{
 	}
 
@@ -134,8 +134,6 @@ public:
 	}
 
 private:
-	Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> m_name;
-
 	Bool8 m_defaultFb = false;
 
 	BitSet<MAX_COLOR_ATTACHMENTS, U8> m_colorAttachmentMask = {false};

+ 1 - 1
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -722,7 +722,7 @@ void GrManagerImpl::flushCommandBuffer(CommandBufferPtr cmdb, FencePtr* outFence
 	// Create fence
 	if(outFence)
 	{
-		outFence->reset(getAllocator().newInstance<FenceImpl>(this));
+		outFence->reset(getAllocator().newInstance<FenceImpl>(this, "Flush"));
 		static_cast<FenceImpl&>(**outFence).m_fence = fence;
 	}
 

+ 7 - 1
src/anki/gr/vulkan/OcclusionQuery.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 OcclusionQuery* OcclusionQuery::newInstance(GrManager* manager)
 {
-	return OcclusionQueryImpl::newInstanceHelper(manager);
+	OcclusionQueryImpl* impl = manager->getAllocator().newInstance<OcclusionQueryImpl>(manager, "N/A");
+	Error err = impl->init();
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 2 - 2
src/anki/gr/vulkan/OcclusionQueryImpl.h

@@ -21,8 +21,8 @@ class OcclusionQueryImpl final : public OcclusionQuery, public VulkanObject<Occl
 public:
 	QueryAllocationHandle m_handle = {};
 
-	OcclusionQueryImpl(GrManager* manager)
-		: OcclusionQuery(manager)
+	OcclusionQueryImpl(GrManager* manager, CString name)
+		: OcclusionQuery(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/Sampler.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 Sampler* Sampler::newInstance(GrManager* manager, const SamplerInitInfo& init)
 {
-	return SamplerImpl::newInstanceHelper(manager, init);
+	SamplerImpl* impl = manager->getAllocator().newInstance<SamplerImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 2 - 2
src/anki/gr/vulkan/SamplerImpl.h

@@ -21,8 +21,8 @@ class SamplerImpl final : public Sampler, public VulkanObject<Sampler, SamplerIm
 public:
 	MicroSamplerPtr m_sampler;
 
-	SamplerImpl(GrManager* manager)
-		: Sampler(manager)
+	SamplerImpl(GrManager* manager, CString name)
+		: Sampler(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/Shader.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 Shader* Shader::newInstance(GrManager* manager, const ShaderInitInfo& init)
 {
-	return ShaderImpl::newInstanceHelper(manager, init);
+	ShaderImpl* impl = manager->getAllocator().newInstance<ShaderImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 2 - 2
src/anki/gr/vulkan/ShaderImpl.h

@@ -28,8 +28,8 @@ public:
 	BitSet<MAX_DESCRIPTOR_SETS, U8> m_descriptorSetMask = {false};
 	Array<BitSet<MAX_BINDINGS_PER_DESCRIPTOR_SET, U8>, MAX_DESCRIPTOR_SETS> m_activeBindingMask = {{{false}, {false}}};
 
-	ShaderImpl(GrManager* manager)
-		: Shader(manager)
+	ShaderImpl(GrManager* manager, CString name)
+		: Shader(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/ShaderProgram.cpp

@@ -13,7 +13,13 @@ namespace anki
 
 ShaderProgram* ShaderProgram::newInstance(GrManager* manager, const ShaderProgramInitInfo& init)
 {
-	return ShaderProgramImpl::newInstanceHelper(manager, init);
+	ShaderProgramImpl* impl = manager->getAllocator().newInstance<ShaderProgramImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 2 - 2
src/anki/gr/vulkan/ShaderProgramImpl.h

@@ -31,8 +31,8 @@ public:
 class ShaderProgramImpl final : public ShaderProgram, public VulkanObject<ShaderProgram, ShaderProgramImpl>
 {
 public:
-	ShaderProgramImpl(GrManager* manager)
-		: ShaderProgram(manager)
+	ShaderProgramImpl(GrManager* manager, CString name)
+		: ShaderProgram(manager, name)
 	{
 	}
 

+ 7 - 1
src/anki/gr/vulkan/Texture.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 Texture* Texture::newInstance(GrManager* manager, const TextureInitInfo& init)
 {
-	return TextureImpl::newInstanceHelper(manager, init);
+	TextureImpl* impl = manager->getAllocator().newInstance<TextureImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 1 - 9
src/anki/gr/vulkan/TextureImpl.cpp

@@ -52,14 +52,6 @@ Error TextureImpl::init(const TextureInitInfo& init_)
 	m_height = init.m_height;
 	m_depth = init.m_depth;
 	m_texType = init.m_type;
-	if(init.getName())
-	{
-		strcpy(&m_name[0], init.getName().cstr());
-	}
-	else
-	{
-		m_name[0] = '\0';
-	}
 
 	if(m_texType == TextureType::_3D)
 	{
@@ -676,7 +668,7 @@ VkImageView TextureImpl::getOrCreateView(const TextureSubresourceInfo& subresour
 		VkImageView view = VK_NULL_HANDLE;
 		ANKI_VK_CHECKF(vkCreateImageView(getDevice(), &viewCi, nullptr, &view));
 		getGrManagerImpl().trySetVulkanHandleName(
-			(m_name[0]) ? &m_name[0] : CString(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, ptrToNumber(view));
+			getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, ptrToNumber(view));
 
 		m_viewsMap.emplace(getAllocator(), subresource, view);
 

+ 2 - 4
src/anki/gr/vulkan/TextureImpl.h

@@ -46,8 +46,8 @@ public:
 
 	VkImageViewCreateInfo m_viewCreateInfoTemplate;
 
-	TextureImpl(GrManager* manager)
-		: Texture(manager)
+	TextureImpl(GrManager* manager, CString name)
+		: Texture(manager, name)
 	{
 	}
 
@@ -146,8 +146,6 @@ private:
 
 	VkDeviceMemory m_dedicatedMem = VK_NULL_HANDLE;
 
-	Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> m_name;
-
 	ANKI_USE_RESULT static VkFormatFeatureFlags calcFeatures(const TextureInitInfo& init);
 
 	ANKI_USE_RESULT static VkImageCreateFlags calcCreateFlags(const TextureInitInfo& init);

+ 7 - 1
src/anki/gr/vulkan/TextureView.cpp

@@ -12,7 +12,13 @@ namespace anki
 
 TextureView* TextureView::newInstance(GrManager* manager, const TextureViewInitInfo& init)
 {
-	return TextureViewImpl::newInstanceHelper(manager, init);
+	TextureViewImpl* impl = manager->getAllocator().newInstance<TextureViewImpl>(manager, init.getName());
+	Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+	}
+	return impl;
 }
 
 } // end namespace anki

+ 2 - 2
src/anki/gr/vulkan/TextureViewImpl.h

@@ -26,8 +26,8 @@ public:
 	/// TextureView::m_uuid since it creates less unique IDs.
 	U64 m_hash = 0;
 
-	TextureViewImpl(GrManager* manager)
-		: TextureView(manager)
+	TextureViewImpl(GrManager* manager, CString name)
+		: TextureView(manager, name)
 	{
 	}
 

+ 0 - 6
src/anki/gr/vulkan/VulkanObject.h

@@ -23,10 +23,6 @@ public:
 	GrManagerImpl& getGrManagerImpl();
 
 	const GrManagerImpl& getGrManagerImpl() const;
-
-	/// Convenience method to allocate and initialize an XXXImpl.
-	template<typename TGrManager, typename... TArgs>
-	static ANKI_USE_RESULT TBaseClass* newInstanceHelper(TGrManager* manager, TArgs&&... args);
 };
 
 // Do this trick to avoid including heavy headers
@@ -44,5 +40,3 @@ public:
 /// @}
 
 } // end namespace anki
-
-#include <anki/gr/vulkan/VulkanObject.inl.h>

+ 0 - 27
src/anki/gr/vulkan/VulkanObject.inl.h

@@ -1,27 +0,0 @@
-// Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
-// All rights reserved.
-// Code licensed under the BSD License.
-// http://www.anki3d.org/LICENSE
-
-#include <anki/gr/vulkan/VulkanObject.h>
-
-namespace anki
-{
-
-template<typename TBaseClass, typename TImplClass>
-template<typename TGrManager, typename... TArgs>
-inline TBaseClass* VulkanObject<TBaseClass, TImplClass>::newInstanceHelper(TGrManager* manager, TArgs&&... args)
-{
-	TImplClass* impl = manager->getAllocator().template newInstance<TImplClass>(manager);
-	Error err = impl->init(std::forward<TArgs>(args)...);
-	if(err)
-	{
-		manager->getAllocator().deleteInstance(impl);
-		impl = nullptr;
-		ANKI_VK_LOGF("Error while creating an instance. Will not try to recover");
-	}
-
-	return impl;
-}
-
-} // end namespace anki

+ 2 - 1
src/anki/renderer/DepthDownscale.cpp

@@ -30,7 +30,8 @@ Error DepthDownscale::initInternal(const ConfigSet&)
 	m_hizRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT
+			| TextureUsageBit::SAMPLED_COMPUTE,
 		"HiZ");
 	m_hizRtDescr.m_mipmapCount = HIERARCHICAL_Z_MIPMAP_COUNT;
 	m_hizRtDescr.bake();

+ 4 - 2
src/anki/renderer/GBuffer.cpp

@@ -38,7 +38,8 @@ Error GBuffer::initInternal(const ConfigSet& initializer)
 	m_depthRtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
 		m_r->getHeight(),
 		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
+			| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		"GBuffer depth");
 	m_depthRtDescr.bake();
 
@@ -48,7 +49,8 @@ Error GBuffer::initInternal(const ConfigSet& initializer)
 		m_colorRtDescrs[i] = m_r->create2DRenderTargetDescription(m_r->getWidth(),
 			m_r->getHeight(),
 			MS_COLOR_ATTACHMENT_PIXEL_FORMATS[i],
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
+				| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 			rtNames[i]);
 		m_colorRtDescrs[i].bake();
 	}

+ 4 - 3
src/anki/renderer/Indirect.cpp

@@ -199,8 +199,8 @@ Error Indirect::initLightShading(const ConfigSet& config)
 		TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(m_lightShading.m_tileSize,
 			m_lightShading.m_tileSize,
 			LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
-				| TextureUsageBit::GENERATE_MIPMAPS,
+			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
+				| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::GENERATE_MIPMAPS,
 			"GI refl");
 		texinit.m_mipmapCount = m_lightShading.m_mipCount;
 		texinit.m_type = TextureType::CUBE_ARRAY;
@@ -250,7 +250,8 @@ Error Indirect::initIrradiance(const ConfigSet& config)
 		TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(m_irradiance.m_tileSize,
 			m_irradiance.m_tileSize,
 			LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
+				| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
 			"GI irr");
 
 		texinit.m_layerCount = m_cacheEntries.getSize();

+ 2 - 3
src/anki/resource/TextureResource.cpp

@@ -68,9 +68,8 @@ Error TextureResource::load(const ResourceFilename& filename, Bool async)
 	ImageLoader& loader = ctx->m_loader;
 
 	TextureInitInfo init("RsrcTex");
-	init.m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_TESSELLATION_EVALUATION
-				   | TextureUsageBit::TRANSFER_DESTINATION;
-	init.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_TESSELLATION_EVALUATION;
+	init.m_usage = TextureUsageBit::SAMPLED_ALL | TextureUsageBit::TRANSFER_DESTINATION;
+	init.m_initialUsage = TextureUsageBit::SAMPLED_ALL;
 	U faces = 0;
 
 	ResourceFilePtr file;