Browse Source

[REFACTOR] Use SDL's vulkan functionality. Refactor Buffer initializer. Update SDL2

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
36f98ba6a5

+ 13 - 0
src/anki/core/NativeWindowSdl.cpp

@@ -5,6 +5,9 @@
 
 
 #include <anki/core/NativeWindowSdl.h>
 #include <anki/core/NativeWindowSdl.h>
 #include <anki/util/Logger.h>
 #include <anki/util/Logger.h>
+#if ANKI_GR_BACKEND == ANKI_GR_BACKEND_VULKAN
+#include <SDL_vulkan.h>
+#endif
 
 
 namespace anki
 namespace anki
 {
 {
@@ -22,6 +25,14 @@ Error NativeWindow::init(NativeWindowInitInfo& init, HeapAllocator<U8>& alloc)
 		return Error::FUNCTION_FAILED;
 		return Error::FUNCTION_FAILED;
 	}
 	}
 
 
+#if ANKI_GR_BACKEND == ANKI_GR_BACKEND_VULKAN
+	if(SDL_Vulkan_LoadLibrary(nullptr))
+	{
+		ANKI_CORE_LOGE("SDL_Vulkan_LoadLibrary() failed");
+		return Error::FUNCTION_FAILED;
+	}
+#endif
+
 	//
 	//
 	// Set GL attributes
 	// Set GL attributes
 	//
 	//
@@ -47,6 +58,8 @@ Error NativeWindow::init(NativeWindowInitInfo& init, HeapAllocator<U8>& alloc)
 
 
 #if ANKI_GR_BACKEND == ANKI_GR_BACKEND_GL
 #if ANKI_GR_BACKEND == ANKI_GR_BACKEND_GL
 	flags |= SDL_WINDOW_OPENGL;
 	flags |= SDL_WINDOW_OPENGL;
+#elif ANKI_GR_BACKEND == ANKI_GR_BACKEND_VULKAN
+	flags |= SDL_WINDOW_VULKAN;
 #endif
 #endif
 
 
 	if(init.m_fullscreenDesktopRez)
 	if(init.m_fullscreenDesktopRez)

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

@@ -53,7 +53,8 @@ void StagingGpuMemoryManager::initBuffer(
 {
 {
 	auto& perframe = m_perFrameBuffers[type];
 	auto& perframe = m_perFrameBuffers[type];
 
 
-	perframe.m_buff = gr.newInstance<Buffer>(perframe.m_size, usage, BufferMapAccessBit::WRITE);
+	perframe.m_buff =
+		gr.newInstance<Buffer>(BufferInitInfo(perframe.m_size, usage, BufferMapAccessBit::WRITE, "Staging"));
 	perframe.m_alloc.init(perframe.m_size, alignment, maxAllocSize);
 	perframe.m_alloc.init(perframe.m_size, alignment, maxAllocSize);
 	perframe.m_mappedMem = static_cast<U8*>(perframe.m_buff->map(0, perframe.m_size, BufferMapAccessBit::WRITE));
 	perframe.m_mappedMem = static_cast<U8*>(perframe.m_buff->map(0, perframe.m_size, BufferMapAccessBit::WRITE));
 }
 }

+ 25 - 1
src/anki/gr/Buffer.h

@@ -13,6 +13,30 @@ namespace anki
 /// @addtogroup graphics
 /// @addtogroup graphics
 /// @{
 /// @{
 
 
+/// Buffer init info.
+class BufferInitInfo : public GrBaseInitInfo
+{
+public:
+	PtrSize m_size = 0;
+	BufferUsageBit m_usage = BufferUsageBit::NONE;
+	BufferMapAccessBit m_access = BufferMapAccessBit::NONE;
+
+	BufferInitInfo() = default;
+
+	BufferInitInfo(CString name)
+		: GrBaseInitInfo(name)
+	{
+	}
+
+	BufferInitInfo(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access, CString name = {})
+		: GrBaseInitInfo(name)
+		, m_size(size)
+		, m_usage(usage)
+		, m_access(access)
+	{
+	}
+};
+
 /// GPU buffer.
 /// GPU buffer.
 class Buffer final : public GrObject
 class Buffer final : public GrObject
 {
 {
@@ -37,7 +61,7 @@ anki_internal:
 	~Buffer();
 	~Buffer();
 
 
 	/// Allocate the buffer.
 	/// Allocate the buffer.
-	void init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access);
+	void init(const BufferInitInfo& init);
 };
 };
 /// @}
 /// @}
 
 

+ 2 - 1
src/anki/gr/Common.h

@@ -23,6 +23,7 @@ class TextureInitInfo;
 class SamplerInitInfo;
 class SamplerInitInfo;
 class GrManagerInitInfo;
 class GrManagerInitInfo;
 class FramebufferInitInfo;
 class FramebufferInitInfo;
+class BufferInitInfo;
 
 
 /// @addtogroup graphics
 /// @addtogroup graphics
 /// @{
 /// @{
@@ -234,7 +235,7 @@ public:
 		// Zero it because the derived classes may be hashed.
 		// Zero it because the derived classes may be hashed.
 		memset(&m_name[0], 0, sizeof(m_name));
 		memset(&m_name[0], 0, sizeof(m_name));
 
 
-		if(name)
+		if(name && name.getLength())
 		{
 		{
 			ANKI_ASSERT(name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
 			ANKI_ASSERT(name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
 			memcpy(&m_name[0], &name[0], name.getLength() + 1);
 			memcpy(&m_name[0], &name[0], name.getLength() + 1);

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

@@ -51,13 +51,13 @@ public:
 	}
 	}
 };
 };
 
 
-void Buffer::init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access)
+void Buffer::init(const BufferInitInfo& inf)
 {
 {
 	m_impl.reset(getAllocator().newInstance<BufferImpl>(&getManager()));
 	m_impl.reset(getAllocator().newInstance<BufferImpl>(&getManager()));
 
 
 	CommandBufferPtr cmdb = getManager().newInstance<CommandBuffer>(CommandBufferInitInfo());
 	CommandBufferPtr cmdb = getManager().newInstance<CommandBuffer>(CommandBufferInitInfo());
 
 
-	cmdb->m_impl->pushBackNewCommand<BufferCreateCommand>(this, size, usage, access);
+	cmdb->m_impl->pushBackNewCommand<BufferCreateCommand>(this, inf.m_size, inf.m_usage, inf.m_access);
 	cmdb->flush();
 	cmdb->flush();
 }
 }
 
 

+ 2 - 2
src/anki/gr/vulkan/Buffer.cpp

@@ -18,11 +18,11 @@ Buffer::~Buffer()
 {
 {
 }
 }
 
 
-void Buffer::init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access)
+void Buffer::init(const BufferInitInfo& inf)
 {
 {
 	m_impl.reset(getAllocator().newInstance<BufferImpl>(&getManager()));
 	m_impl.reset(getAllocator().newInstance<BufferImpl>(&getManager()));
 
 
-	if(m_impl->init(size, usage, access))
+	if(m_impl->init(inf))
 	{
 	{
 		ANKI_VK_LOGF("Cannot recover");
 		ANKI_VK_LOGF("Cannot recover");
 	}
 	}

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

@@ -24,9 +24,14 @@ BufferImpl::~BufferImpl()
 	}
 	}
 }
 }
 
 
-Error BufferImpl::init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access)
+Error BufferImpl::init(const BufferInitInfo& inf)
 {
 {
 	ANKI_ASSERT(!isCreated());
 	ANKI_ASSERT(!isCreated());
+
+	PtrSize size = inf.m_size;
+	BufferMapAccessBit access = inf.m_access;
+	BufferUsageBit usage = inf.m_usage;
+
 	ANKI_ASSERT(size > 0);
 	ANKI_ASSERT(size > 0);
 	ANKI_ASSERT(usage != BufferUsageBit::NONE);
 	ANKI_ASSERT(usage != BufferUsageBit::NONE);
 
 
@@ -43,6 +48,7 @@ Error BufferImpl::init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit ac
 	U32 queueIdx = getGrManagerImpl().getGraphicsQueueFamily();
 	U32 queueIdx = getGrManagerImpl().getGraphicsQueueFamily();
 	ci.pQueueFamilyIndices = &queueIdx;
 	ci.pQueueFamilyIndices = &queueIdx;
 	ANKI_VK_CHECK(vkCreateBuffer(getDevice(), &ci, nullptr, &m_handle));
 	ANKI_VK_CHECK(vkCreateBuffer(getDevice(), &ci, nullptr, &m_handle));
+	getGrManagerImpl().trySetVulkanHandleName(inf.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, m_handle);
 
 
 	// Get mem requirements
 	// Get mem requirements
 	VkMemoryRequirements req;
 	VkMemoryRequirements req;

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

@@ -25,7 +25,7 @@ public:
 
 
 	~BufferImpl();
 	~BufferImpl();
 
 
-	ANKI_USE_RESULT Error init(PtrSize size, BufferUsageBit usage, BufferMapAccessBit access);
+	ANKI_USE_RESULT Error init(const BufferInitInfo& inf);
 
 
 	ANKI_USE_RESULT void* map(PtrSize offset, PtrSize range, BufferMapAccessBit access);
 	ANKI_USE_RESULT void* map(PtrSize offset, PtrSize range, BufferMapAccessBit access);
 
 

+ 4 - 4
src/anki/gr/vulkan/CommandBufferImpl.cpp

@@ -667,8 +667,8 @@ void CommandBufferImpl::copyBufferToTextureSurface(
 		// Create a new shadow buffer
 		// Create a new shadow buffer
 		const PtrSize shadowSize =
 		const PtrSize shadowSize =
 			computeSurfaceSize(width, height, PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM));
 			computeSurfaceSize(width, height, PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM));
-		BufferPtr shadow =
-			getGrManager().newInstance<Buffer>(shadowSize, BufferUsageBit::TRANSFER_ALL, BufferMapAccessBit::NONE);
+		BufferPtr shadow = getGrManager().newInstance<Buffer>(
+			BufferInitInfo(shadowSize, BufferUsageBit::TRANSFER_ALL, BufferMapAccessBit::NONE, "Workaround"));
 		const VkBuffer shadowHandle = shadow->m_impl->getHandle();
 		const VkBuffer shadowHandle = shadow->m_impl->getHandle();
 		m_microCmdb->pushObjectRef(shadow);
 		m_microCmdb->pushObjectRef(shadow);
 
 
@@ -770,8 +770,8 @@ void CommandBufferImpl::copyBufferToTextureVolume(
 		// Create a new shadow buffer
 		// Create a new shadow buffer
 		const PtrSize shadowSize =
 		const PtrSize shadowSize =
 			computeVolumeSize(width, height, depth, PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM));
 			computeVolumeSize(width, height, depth, PixelFormat(ComponentFormat::R8G8B8A8, TransformFormat::UNORM));
-		BufferPtr shadow =
-			getGrManager().newInstance<Buffer>(shadowSize, BufferUsageBit::TRANSFER_ALL, BufferMapAccessBit::NONE);
+		BufferPtr shadow = getGrManager().newInstance<Buffer>(
+			BufferInitInfo(shadowSize, BufferUsageBit::TRANSFER_ALL, BufferMapAccessBit::NONE, "Workaround"));
 		const VkBuffer shadowHandle = shadow->m_impl->getHandle();
 		const VkBuffer shadowHandle = shadow->m_impl->getHandle();
 		m_microCmdb->pushObjectRef(shadow);
 		m_microCmdb->pushObjectRef(shadow);
 
 

+ 8 - 0
src/anki/gr/vulkan/FramebufferImpl.cpp

@@ -39,10 +39,13 @@ FramebufferImpl::~FramebufferImpl()
 Error FramebufferImpl::init(const FramebufferInitInfo& init)
 Error FramebufferImpl::init(const FramebufferInitInfo& init)
 {
 {
 	m_defaultFb = init.refersToDefaultFramebuffer();
 	m_defaultFb = init.refersToDefaultFramebuffer();
+	strcpy(&m_name[0], (init.getName()) ? init.getName().cstr() : "");
 
 
 	// Create a renderpass.
 	// Create a renderpass.
 	initRpassCreateInfo(init);
 	initRpassCreateInfo(init);
 	ANKI_VK_CHECK(vkCreateRenderPass(getDevice(), &m_rpassCi, nullptr, &m_compatibleOrDefaultRpass));
 	ANKI_VK_CHECK(vkCreateRenderPass(getDevice(), &m_rpassCi, nullptr, &m_compatibleOrDefaultRpass));
+	getGrManagerImpl().trySetVulkanHandleName(
+		init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, m_compatibleOrDefaultRpass);
 
 
 	// Create the FBs
 	// Create the FBs
 	ANKI_CHECK(initFbs(init));
 	ANKI_CHECK(initFbs(init));
@@ -112,6 +115,8 @@ Error FramebufferImpl::initFbs(const FramebufferInitInfo& init)
 			ci.height = m_height;
 			ci.height = m_height;
 
 
 			ANKI_VK_CHECK(vkCreateFramebuffer(getDevice(), &ci, nullptr, &m_fbs[i]));
 			ANKI_VK_CHECK(vkCreateFramebuffer(getDevice(), &ci, nullptr, &m_fbs[i]));
+			getGrManagerImpl().trySetVulkanHandleName(
+				init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, m_fbs[i]);
 		}
 		}
 
 
 		m_colorAttachmentMask.set(0);
 		m_colorAttachmentMask.set(0);
@@ -185,6 +190,8 @@ Error FramebufferImpl::initFbs(const FramebufferInitInfo& init)
 		ANKI_ASSERT(count == ci.attachmentCount);
 		ANKI_ASSERT(count == ci.attachmentCount);
 
 
 		ANKI_VK_CHECK(vkCreateFramebuffer(getDevice(), &ci, nullptr, &m_fbs[0]));
 		ANKI_VK_CHECK(vkCreateFramebuffer(getDevice(), &ci, nullptr, &m_fbs[0]));
+		getGrManagerImpl().trySetVulkanHandleName(
+			init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, m_fbs[0]);
 	}
 	}
 
 
 	return Error::NONE;
 	return Error::NONE;
@@ -320,6 +327,7 @@ VkRenderPass FramebufferImpl::getRenderPassHandle(
 			}
 			}
 
 
 			ANKI_VK_CHECKF(vkCreateRenderPass(getDevice(), &ci, nullptr, &out));
 			ANKI_VK_CHECKF(vkCreateRenderPass(getDevice(), &ci, nullptr, &out));
+			getGrManagerImpl().trySetVulkanHandleName(&m_name[0], VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, out);
 
 
 			m_rpasses.emplace(getAllocator(), hash, out);
 			m_rpasses.emplace(getAllocator(), hash, out);
 		}
 		}

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

@@ -132,6 +132,8 @@ private:
 	Mutex m_rpassesMtx;
 	Mutex m_rpassesMtx;
 	Array<VkFramebuffer, MAX_FRAMES_IN_FLIGHT> m_fbs = {};
 	Array<VkFramebuffer, MAX_FRAMES_IN_FLIGHT> m_fbs = {};
 
 
+	Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> m_name;
+
 	// Methods
 	// Methods
 	ANKI_USE_RESULT Error initFbs(const FramebufferInitInfo& init);
 	ANKI_USE_RESULT Error initFbs(const FramebufferInitInfo& init);
 	void initRpassCreateInfo(const FramebufferInitInfo& init);
 	void initRpassCreateInfo(const FramebufferInitInfo& init);

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

@@ -902,7 +902,7 @@ void GrManagerImpl::flushCommandBuffer(CommandBufferPtr cmdb, FencePtr* outFence
 
 
 void GrManagerImpl::trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const
 void GrManagerImpl::trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const
 {
 {
-	if(name)
+	if(name && name.getLength())
 	{
 	{
 		if(m_pfnDebugMarkerSetObjectNameEXT)
 		if(m_pfnDebugMarkerSetObjectNameEXT)
 		{
 		{

+ 5 - 0
src/anki/gr/vulkan/GrManagerImpl.h

@@ -193,6 +193,11 @@ public:
 
 
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const;
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const;
 
 
+	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, void* handle) const
+	{
+		trySetVulkanHandleName(name, type, U64(ptrToNumber(handle)));
+	}
+
 private:
 private:
 	GrManager* m_manager = nullptr;
 	GrManager* m_manager = nullptr;
 
 

+ 8 - 8
src/anki/gr/vulkan/GrManagerImplSdl.cpp

@@ -8,6 +8,7 @@
 #include <anki/core/NativeWindow.h>
 #include <anki/core/NativeWindow.h>
 #include <anki/core/NativeWindowSdl.h>
 #include <anki/core/NativeWindowSdl.h>
 #include <SDL_syswm.h>
 #include <SDL_syswm.h>
+#include <SDL_vulkan.h>
 #if ANKI_OS == ANKI_OS_LINUX
 #if ANKI_OS == ANKI_OS_LINUX
 #include <X11/Xlib-xcb.h>
 #include <X11/Xlib-xcb.h>
 #elif ANKI_OS == ANKI_OS_WINDOWS
 #elif ANKI_OS == ANKI_OS_WINDOWS
@@ -21,6 +22,13 @@ namespace anki
 
 
 Error GrManagerImpl::initSurface(const GrManagerInitInfo& init)
 Error GrManagerImpl::initSurface(const GrManagerInitInfo& init)
 {
 {
+#if ANKI_OS == ANKI_OS_LINUX
+	if(!SDL_Vulkan_CreateSurface(init.m_window->getNative().m_window, m_instance, &m_surface))
+	{
+		ANKI_VK_LOGE("SDL_Vulkan_CreateSurface() failed");
+		return Error::FUNCTION_FAILED;
+	}
+#elif ANKI_OS == ANKI_OS_WINDOWS
 	SDL_SysWMinfo wminfo;
 	SDL_SysWMinfo wminfo;
 	SDL_VERSION(&wminfo.version);
 	SDL_VERSION(&wminfo.version);
 	if(!SDL_GetWindowWMInfo(init.m_window->getNative().m_window, &wminfo))
 	if(!SDL_GetWindowWMInfo(init.m_window->getNative().m_window, &wminfo))
@@ -29,14 +37,6 @@ Error GrManagerImpl::initSurface(const GrManagerInitInfo& init)
 		return Error::NONE;
 		return Error::NONE;
 	}
 	}
 
 
-#if ANKI_OS == ANKI_OS_LINUX
-	VkXcbSurfaceCreateInfoKHR ci = {};
-	ci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
-	ci.connection = XGetXCBConnection(wminfo.info.x11.display);
-	ci.window = wminfo.info.x11.window;
-
-	ANKI_VK_CHECK(vkCreateXcbSurfaceKHR(m_instance, &ci, nullptr, &m_surface));
-#elif ANKI_OS == ANKI_OS_WINDOWS
 	Array<TCHAR, 512> className;
 	Array<TCHAR, 512> className;
 	GetClassName(wminfo.info.win.window, &className[0], className.getSize());
 	GetClassName(wminfo.info.win.window, &className[0], className.getSize());
 
 

+ 2 - 0
src/anki/gr/vulkan/SamplerImpl.cpp

@@ -5,6 +5,7 @@
 
 
 #include <anki/gr/vulkan/SamplerImpl.h>
 #include <anki/gr/vulkan/SamplerImpl.h>
 #include <anki/gr/Texture.h>
 #include <anki/gr/Texture.h>
+#include <anki/gr/vulkan/GrManagerImpl.h>
 #include <cstring>
 #include <cstring>
 
 
 namespace anki
 namespace anki
@@ -75,6 +76,7 @@ Error SamplerImpl::init(const SamplerInitInfo& ii)
 
 
 	// Create
 	// Create
 	ANKI_VK_CHECK(vkCreateSampler(getDevice(), &ci, nullptr, &m_handle));
 	ANKI_VK_CHECK(vkCreateSampler(getDevice(), &ci, nullptr, &m_handle));
+	getGrManagerImpl().trySetVulkanHandleName(ii.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, m_handle);
 
 
 	return Error::NONE;
 	return Error::NONE;
 }
 }

+ 13 - 2
src/anki/gr/vulkan/TextureImpl.cpp

@@ -52,6 +52,7 @@ TextureImpl::~TextureImpl()
 Error TextureImpl::init(const TextureInitInfo& init_, Texture* tex)
 Error TextureImpl::init(const TextureInitInfo& init_, Texture* tex)
 {
 {
 	TextureInitInfo init = init_;
 	TextureInitInfo init = init_;
+	init.m_sampling.setName(init.getName());
 	ANKI_ASSERT(textureInitInfoValid(init));
 	ANKI_ASSERT(textureInitInfoValid(init));
 	m_sampler = getGrManagerImpl().getSamplerCache().newInstance<Sampler>(init.m_sampling);
 	m_sampler = getGrManagerImpl().getSamplerCache().newInstance<Sampler>(init.m_sampling);
 
 
@@ -60,6 +61,14 @@ Error TextureImpl::init(const TextureInitInfo& init_, Texture* tex)
 	m_height = init.m_height;
 	m_height = init.m_height;
 	m_depth = init.m_depth;
 	m_depth = init.m_depth;
 	m_type = init.m_type;
 	m_type = init.m_type;
+	if(init.getName())
+	{
+		strcpy(&m_name[0], init.getName().cstr());
+	}
+	else
+	{
+		m_name[0] = '\0';
+	}
 
 
 	if(m_type == TextureType::_3D)
 	if(m_type == TextureType::_3D)
 	{
 	{
@@ -318,8 +327,7 @@ Error TextureImpl::initImage(const TextureInitInfo& init_)
 	}
 	}
 
 
 	ANKI_VK_CHECK(vkCreateImage(getDevice(), &ci, nullptr, &m_imageHandle));
 	ANKI_VK_CHECK(vkCreateImage(getDevice(), &ci, nullptr, &m_imageHandle));
-	getGrManagerImpl().trySetVulkanHandleName(
-		init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, ptrToNumber(m_imageHandle));
+	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, m_imageHandle);
 
 
 	// Allocate memory
 	// Allocate memory
 	//
 	//
@@ -708,6 +716,9 @@ VkImageView TextureImpl::getOrCreateView(const VkImageViewCreateInfo& ci)
 	{
 	{
 		VkImageView view = VK_NULL_HANDLE;
 		VkImageView view = VK_NULL_HANDLE;
 		ANKI_VK_CHECKF(vkCreateImageView(getDevice(), &ci, nullptr, &view));
 		ANKI_VK_CHECKF(vkCreateImageView(getDevice(), &ci, nullptr, &view));
+		getGrManagerImpl().trySetVulkanHandleName(
+			(m_name[0]) ? &m_name[0] : CString(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, ptrToNumber(view));
+
 		m_viewsMap.emplace(getAllocator(), ci, view);
 		m_viewsMap.emplace(getAllocator(), ci, view);
 
 
 		return view;
 		return view;

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

@@ -138,6 +138,8 @@ private:
 
 
 	VkDeviceMemory m_dedicatedMem = VK_NULL_HANDLE;
 	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 VkFormatFeatureFlags calcFeatures(const TextureInitInfo& init);
 
 
 	ANKI_USE_RESULT static VkImageCreateFlags calcCreateFlags(const TextureInitInfo& init);
 	ANKI_USE_RESULT static VkImageCreateFlags calcCreateFlags(const TextureInitInfo& init);

+ 2 - 2
src/anki/renderer/DebugDrawer.cpp

@@ -39,8 +39,8 @@ Error DebugDrawer::init(Renderer* r)
 	// Create the vert buffs
 	// Create the vert buffs
 	for(BufferPtr& v : m_vertBuff)
 	for(BufferPtr& v : m_vertBuff)
 	{
 	{
-		v = gr.newInstance<Buffer>(
-			sizeof(Vertex) * MAX_VERTS_PER_FRAME, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE);
+		v = gr.newInstance<Buffer>(BufferInitInfo(
+			sizeof(Vertex) * MAX_VERTS_PER_FRAME, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE, "DbgDrawer"));
 	}
 	}
 
 
 	m_mMat.setIdentity();
 	m_mMat.setIdentity();

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

@@ -65,7 +65,8 @@ Error DepthDownscale::initQuarter(const ConfigSet&)
 	m_quarter.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
 	m_quarter.m_colorRtDescr = m_r->create2DRenderTargetDescription(width,
 		height,
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
+		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT
+			| TextureUsageBit::SAMPLED_COMPUTE,
 		SamplingFilter::LINEAR,
 		SamplingFilter::LINEAR,
 		"quarterdepth");
 		"quarterdepth");
 	m_quarter.m_colorRtDescr.bake();
 	m_quarter.m_colorRtDescr.bake();

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

@@ -92,12 +92,15 @@ Error Indirect::loadMesh(CString fname, BufferPtr& vert, BufferPtr& idx, U32& id
 	ANKI_CHECK(loader.load(fname));
 	ANKI_CHECK(loader.load(fname));
 
 
 	PtrSize vertBuffSize = loader.getHeader().m_totalVerticesCount * sizeof(Vec3);
 	PtrSize vertBuffSize = loader.getHeader().m_totalVerticesCount * sizeof(Vec3);
-	vert = getGrManager().newInstance<Buffer>(
-		vertBuffSize, BufferUsageBit::VERTEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION, BufferMapAccessBit::NONE);
+	vert = getGrManager().newInstance<Buffer>(BufferInitInfo(vertBuffSize,
+		BufferUsageBit::VERTEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
+		BufferMapAccessBit::NONE,
+		"IndirectMesh"));
 
 
-	idx = getGrManager().newInstance<Buffer>(loader.getIndexDataSize(),
+	idx = getGrManager().newInstance<Buffer>(BufferInitInfo(loader.getIndexDataSize(),
 		BufferUsageBit::INDEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
 		BufferUsageBit::INDEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
-		BufferMapAccessBit::NONE);
+		BufferMapAccessBit::NONE,
+		"IndirectMesh"));
 
 
 	// Upload data
 	// Upload data
 	CommandBufferInitInfo init;
 	CommandBufferInitInfo init;

+ 3 - 2
src/anki/renderer/LensFlare.cpp

@@ -76,9 +76,10 @@ Error LensFlare::initOcclusion(const ConfigSet& config)
 {
 {
 	GrManager& gr = getGrManager();
 	GrManager& gr = getGrManager();
 
 
-	m_indirectBuff = gr.newInstance<Buffer>(m_maxFlares * sizeof(DrawArraysIndirectInfo),
+	m_indirectBuff = gr.newInstance<Buffer>(BufferInitInfo(m_maxFlares * sizeof(DrawArraysIndirectInfo),
 		BufferUsageBit::INDIRECT | BufferUsageBit::STORAGE_COMPUTE_WRITE,
 		BufferUsageBit::INDIRECT | BufferUsageBit::STORAGE_COMPUTE_WRITE,
-		BufferMapAccessBit::NONE);
+		BufferMapAccessBit::NONE,
+		"LensFlares"));
 
 
 	ANKI_CHECK(
 	ANKI_CHECK(
 		getResourceManager().loadResource("programs/LensFlareUpdateIndirectInfo.ankiprog", m_updateIndirectBuffProg));
 		getResourceManager().loadResource("programs/LensFlareUpdateIndirectInfo.ankiprog", m_updateIndirectBuffProg));

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

@@ -97,8 +97,10 @@ Error Renderer::initInternal(const ConfigSet& config)
 		m_dummyTex = getGrManager().newInstance<Texture>(texinit);
 		m_dummyTex = getGrManager().newInstance<Texture>(texinit);
 	}
 	}
 
 
-	m_dummyBuff = getGrManager().newInstance<Buffer>(
-		getDummyBufferSize(), BufferUsageBit::UNIFORM_ALL | BufferUsageBit::STORAGE_ALL, BufferMapAccessBit::NONE);
+	m_dummyBuff = getGrManager().newInstance<Buffer>(BufferInitInfo(getDummyBufferSize(),
+		BufferUsageBit::UNIFORM_ALL | BufferUsageBit::STORAGE_ALL,
+		BufferMapAccessBit::NONE,
+		"Dummy"));
 
 
 	// Init the stages. Careful with the order!!!!!!!!!!
 	// Init the stages. Careful with the order!!!!!!!!!!
 	m_indirect.reset(m_alloc.newInstance<Indirect>(this));
 	m_indirect.reset(m_alloc.newInstance<Indirect>(this));

+ 3 - 2
src/anki/renderer/Tonemapping.cpp

@@ -38,9 +38,10 @@ Error Tonemapping::initInternal(const ConfigSet& initializer)
 	m_grProg = variant->getProgram();
 	m_grProg = variant->getProgram();
 
 
 	// Create buffer
 	// Create buffer
-	m_luminanceBuff = getGrManager().newInstance<Buffer>(sizeof(Vec4),
+	m_luminanceBuff = getGrManager().newInstance<Buffer>(BufferInitInfo(sizeof(Vec4),
 		BufferUsageBit::STORAGE_ALL | BufferUsageBit::UNIFORM_ALL | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
 		BufferUsageBit::STORAGE_ALL | BufferUsageBit::UNIFORM_ALL | BufferUsageBit::BUFFER_UPLOAD_DESTINATION,
-		BufferMapAccessBit::NONE);
+		BufferMapAccessBit::NONE,
+		"AvgLum"));
 
 
 	CommandBufferInitInfo cmdbinit;
 	CommandBufferInitInfo cmdbinit;
 	cmdbinit.m_flags = CommandBufferFlag::SMALL_BATCH | CommandBufferFlag::TRANSFER_WORK;
 	cmdbinit.m_flags = CommandBufferFlag::SMALL_BATCH | CommandBufferFlag::TRANSFER_WORK;

+ 6 - 4
src/anki/resource/Mesh.cpp

@@ -102,13 +102,15 @@ Error Mesh::load(const ResourceFilename& filename, Bool async)
 	// Allocate the buffers
 	// Allocate the buffers
 	GrManager& gr = getManager().getGrManager();
 	GrManager& gr = getManager().getGrManager();
 
 
-	m_vertBuff = gr.newInstance<Buffer>(loader.getVertexDataSize(),
+	m_vertBuff = gr.newInstance<Buffer>(BufferInitInfo(loader.getVertexDataSize(),
 		BufferUsageBit::VERTEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION | BufferUsageBit::FILL,
 		BufferUsageBit::VERTEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION | BufferUsageBit::FILL,
-		BufferMapAccessBit::NONE);
+		BufferMapAccessBit::NONE,
+		"MeshVert"));
 
 
-	m_indicesBuff = gr.newInstance<Buffer>(loader.getIndexDataSize(),
+	m_indicesBuff = gr.newInstance<Buffer>(BufferInitInfo(loader.getIndexDataSize(),
 		BufferUsageBit::INDEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION | BufferUsageBit::FILL,
 		BufferUsageBit::INDEX | BufferUsageBit::BUFFER_UPLOAD_DESTINATION | BufferUsageBit::FILL,
-		BufferMapAccessBit::NONE);
+		BufferMapAccessBit::NONE,
+		"MeshIdx"));
 
 
 	// Clear them
 	// Clear them
 	CommandBufferInitInfo cmdbinit;
 	CommandBufferInitInfo cmdbinit;

+ 2 - 1
src/anki/resource/TransferGpuAllocator.cpp

@@ -34,7 +34,8 @@ public:
 	{
 	{
 		TransferGpuAllocator::Memory* mm = m_alloc.newInstance<TransferGpuAllocator::Memory>();
 		TransferGpuAllocator::Memory* mm = m_alloc.newInstance<TransferGpuAllocator::Memory>();
 
 
-		mm->m_buffer = m_gr->newInstance<Buffer>(size, BufferUsageBit::BUFFER_UPLOAD_SOURCE, BufferMapAccessBit::WRITE);
+		mm->m_buffer = m_gr->newInstance<Buffer>(
+			BufferInitInfo(size, BufferUsageBit::BUFFER_UPLOAD_SOURCE, BufferMapAccessBit::WRITE, "Transfer"));
 		mm->m_mappedMemory = mm->m_buffer->map(0, size, BufferMapAccessBit::WRITE);
 		mm->m_mappedMemory = mm->m_buffer->map(0, size, BufferMapAccessBit::WRITE);
 
 
 		mem = mm;
 		mem = mm;

+ 1 - 1
src/anki/ui/Font.cpp

@@ -71,7 +71,7 @@ void Font::createTexture(const void* data, U32 width, U32 height)
 	// Create and populate the buffer
 	// Create and populate the buffer
 	PtrSize buffSize = width * height * 4;
 	PtrSize buffSize = width * height * 4;
 	BufferPtr buff = m_manager->getGrManager().newInstance<Buffer>(
 	BufferPtr buff = m_manager->getGrManager().newInstance<Buffer>(
-		buffSize, BufferUsageBit::BUFFER_UPLOAD_DESTINATION, BufferMapAccessBit::WRITE);
+		BufferInitInfo(buffSize, BufferUsageBit::BUFFER_UPLOAD_DESTINATION, BufferMapAccessBit::WRITE, "UI"));
 	void* mapped = buff->map(0, buffSize, BufferMapAccessBit::WRITE);
 	void* mapped = buff->map(0, buffSize, BufferMapAccessBit::WRITE);
 	memcpy(mapped, data, buffSize);
 	memcpy(mapped, data, buffSize);
 	buff->unmap();
 	buff->unmap();

+ 11 - 8
tests/gr/Gr.cpp

@@ -374,13 +374,13 @@ static void createCube(GrManager& gr, BufferPtr& verts, BufferPtr& indices)
 	static const Array<U16, 6 * 2 * 3> idx = {
 	static const Array<U16, 6 * 2 * 3> idx = {
 		{0, 1, 3, 3, 1, 2, 1, 5, 6, 1, 6, 2, 7, 4, 0, 7, 0, 3, 6, 5, 7, 7, 5, 4, 0, 4, 5, 0, 5, 1, 3, 2, 6, 3, 6, 7}};
 		{0, 1, 3, 3, 1, 2, 1, 5, 6, 1, 6, 2, 7, 4, 0, 7, 0, 3, 6, 5, 7, 7, 5, 4, 0, 4, 5, 0, 5, 1, 3, 2, 6, 3, 6, 7}};
 
 
-	verts = gr.newInstance<Buffer>(sizeof(pos), BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE);
+	verts = gr.newInstance<Buffer>(BufferInitInfo(sizeof(pos), BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE));
 
 
 	void* mapped = verts->map(0, sizeof(pos), BufferMapAccessBit::WRITE);
 	void* mapped = verts->map(0, sizeof(pos), BufferMapAccessBit::WRITE);
 	memcpy(mapped, &pos[0], sizeof(pos));
 	memcpy(mapped, &pos[0], sizeof(pos));
 	verts->unmap();
 	verts->unmap();
 
 
-	indices = gr.newInstance<Buffer>(sizeof(idx), BufferUsageBit::INDEX, BufferMapAccessBit::WRITE);
+	indices = gr.newInstance<Buffer>(BufferInitInfo(sizeof(idx), BufferUsageBit::INDEX, BufferMapAccessBit::WRITE));
 	mapped = indices->map(0, sizeof(idx), BufferMapAccessBit::WRITE);
 	mapped = indices->map(0, sizeof(idx), BufferMapAccessBit::WRITE);
 	memcpy(mapped, &idx[0], sizeof(idx));
 	memcpy(mapped, &idx[0], sizeof(idx));
 	indices->unmap();
 	indices->unmap();
@@ -683,10 +683,10 @@ ANKI_TEST(Gr, Buffer)
 {
 {
 	COMMON_BEGIN()
 	COMMON_BEGIN()
 
 
-	BufferPtr a = gr->newInstance<Buffer>(512, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::NONE);
+	BufferPtr a = gr->newInstance<Buffer>(BufferInitInfo(512, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::NONE));
 
 
-	BufferPtr b =
-		gr->newInstance<Buffer>(64, BufferUsageBit::STORAGE_ALL, BufferMapAccessBit::WRITE | BufferMapAccessBit::READ);
+	BufferPtr b = gr->newInstance<Buffer>(
+		BufferInitInfo(64, BufferUsageBit::STORAGE_ALL, BufferMapAccessBit::WRITE | BufferMapAccessBit::READ));
 
 
 	void* ptr = b->map(0, 64, BufferMapAccessBit::WRITE);
 	void* ptr = b->map(0, 64, BufferMapAccessBit::WRITE);
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
@@ -708,7 +708,8 @@ ANKI_TEST(Gr, DrawWithUniforms)
 	COMMON_BEGIN()
 	COMMON_BEGIN()
 
 
 	// A non-uploaded buffer
 	// A non-uploaded buffer
-	BufferPtr b = gr->newInstance<Buffer>(sizeof(Vec4) * 3, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::WRITE);
+	BufferPtr b = gr->newInstance<Buffer>(
+		BufferInitInfo(sizeof(Vec4) * 3, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::WRITE));
 
 
 	Vec4* ptr = static_cast<Vec4*>(b->map(0, sizeof(Vec4) * 3, BufferMapAccessBit::WRITE));
 	Vec4* ptr = static_cast<Vec4*>(b->map(0, sizeof(Vec4) * 3, BufferMapAccessBit::WRITE));
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
@@ -778,7 +779,8 @@ ANKI_TEST(Gr, DrawWithVertex)
 	};
 	};
 	static_assert(sizeof(Vert) == sizeof(Vec4), "See file");
 	static_assert(sizeof(Vert) == sizeof(Vec4), "See file");
 
 
-	BufferPtr b = gr->newInstance<Buffer>(sizeof(Vert) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE);
+	BufferPtr b =
+		gr->newInstance<Buffer>(BufferInitInfo(sizeof(Vert) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE));
 
 
 	Vert* ptr = static_cast<Vert*>(b->map(0, sizeof(Vert) * 3, BufferMapAccessBit::WRITE));
 	Vert* ptr = static_cast<Vert*>(b->map(0, sizeof(Vert) * 3, BufferMapAccessBit::WRITE));
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
 	ANKI_TEST_EXPECT_NEQ(ptr, nullptr);
@@ -792,7 +794,8 @@ ANKI_TEST(Gr, DrawWithVertex)
 	ptr[2].m_color = {{0, 0, 255}};
 	ptr[2].m_color = {{0, 0, 255}};
 	b->unmap();
 	b->unmap();
 
 
-	BufferPtr c = gr->newInstance<Buffer>(sizeof(Vec3) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE);
+	BufferPtr c =
+		gr->newInstance<Buffer>(BufferInitInfo(sizeof(Vec3) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE));
 
 
 	Vec3* otherColor = static_cast<Vec3*>(c->map(0, sizeof(Vec3) * 3, BufferMapAccessBit::WRITE));
 	Vec3* otherColor = static_cast<Vec3*>(c->map(0, sizeof(Vec3) * 3, BufferMapAccessBit::WRITE));
 
 

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit 4d5b02c0dd3eb0660b6dd9be5bf127e0b13d48de
+Subproject commit 39ffb4afb7b2671baccac854dd248b05927043ab