Browse Source

Replace the deprecated VK_EXT_debug_marker with VK_EXT_debug_utils

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
66ee3a9250

+ 5 - 5
AnKi/Gr/RenderGraph.cpp

@@ -449,6 +449,10 @@ FramebufferPtr RenderGraph::getOrCreateFramebuffer(const FramebufferDescription&
 
 	hash = appendHash(&uuids[0], sizeof(U64) * count, hash);
 
+	// Hash the name of the pass. If you don't the code bellow may fetch an FB with some another name and that will
+	// cause problems with tools. The FB name is used as a debug marker
+	hash = appendHash(name.cstr(), name.getLength(), hash);
+
 	FramebufferPtr fb;
 	auto it = m_fbCache.find(hash);
 	if(it != m_fbCache.getEnd())
@@ -508,11 +512,7 @@ FramebufferPtr RenderGraph::getOrCreateFramebuffer(const FramebufferDescription&
 		}
 
 		// Set FB name
-		Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> cutName;
-		const U cutNameLen = min<U>(name.getLength(), MAX_GR_OBJECT_NAME_LENGTH);
-		memcpy(&cutName[0], &name[0], cutNameLen);
-		cutName[cutNameLen] = '\0';
-		fbInit.setName(&cutName[0]);
+		fbInit.setName(name);
 
 		// Create
 		fb = getManager().newFramebuffer(fbInit);

+ 1 - 1
AnKi/Gr/Vulkan/BufferImpl.cpp

@@ -64,7 +64,7 @@ Error BufferImpl::init(const BufferInitInfo& inf)
 	ci.pQueueFamilyIndices = &getGrManagerImpl().getQueueFamilies()[0];
 	ci.sharingMode = (ci.queueFamilyIndexCount > 1) ? VK_SHARING_MODE_CONCURRENT : VK_SHARING_MODE_EXCLUSIVE;
 	ANKI_VK_CHECK(vkCreateBuffer(getDevice(), &ci, nullptr, &m_handle));
-	getGrManagerImpl().trySetVulkanHandleName(inf.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, m_handle);
+	getGrManagerImpl().trySetVulkanHandleName(inf.getName(), VK_OBJECT_TYPE_BUFFER, m_handle);
 
 	// Get mem requirements
 	VkMemoryRequirements req;

+ 20 - 20
AnKi/Gr/Vulkan/CommandBufferImpl.cpp

@@ -162,20 +162,7 @@ void CommandBufferImpl::beginRenderPassInternal()
 {
 	FramebufferImpl& impl = static_cast<FramebufferImpl&>(*m_activeFb);
 
-#if !ANKI_PLATFORM_MOBILE
-	// nVidia SRI cache workaround
-	if(impl.hasSri())
-	{
-		VkMemoryBarrier memBarrier = {};
-		memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
-		memBarrier.dstAccessMask = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR;
-
-		const VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
-		const VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
-
-		vkCmdPipelineBarrier(m_handle, srcStages, dstStages, 0, 1, &memBarrier, 0, nullptr, 0, nullptr);
-	}
-#endif
+	flushBatches(CommandBufferCommandType::ANY_OTHER_COMMAND); // Flush before the marker
 
 	m_state.beginRenderPass(&impl);
 
@@ -219,18 +206,30 @@ void CommandBufferImpl::beginRenderPassInternal()
 	bi.renderArea.extent.width = m_renderArea[2];
 	bi.renderArea.extent.height = m_renderArea[3];
 
-	getGrManagerImpl().beginMarker(m_handle, impl.getName());
+	getGrManagerImpl().beginMarker(m_handle, impl.getName(), Vec3(0.0f, 1.0f, 0.0f));
+
+#if !ANKI_PLATFORM_MOBILE
+	// nVidia SRI cache workaround
+	if(impl.hasSri())
+	{
+		VkMemoryBarrier memBarrier = {};
+		memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+		memBarrier.dstAccessMask = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR;
+
+		const VkPipelineStageFlags srcStages = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
+		const VkPipelineStageFlags dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
+
+		vkCmdPipelineBarrier(m_handle, srcStages, dstStages, 0, 1, &memBarrier, 0, nullptr, 0, nullptr);
+	}
+#endif
 
 	VkSubpassBeginInfo subpassBeginInfo = {};
 	subpassBeginInfo.sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
 	subpassBeginInfo.contents = m_subpassContents;
 
-	ANKI_CMD(vkCmdBeginRenderPass2KHR(m_handle, &bi, &subpassBeginInfo), ANY_OTHER_COMMAND);
+	vkCmdBeginRenderPass2KHR(m_handle, &bi, &subpassBeginInfo);
 
-	if(impl.hasPresentableTexture())
-	{
-		m_renderedToDefaultFb = true;
-	}
+	m_renderedToDefaultFb = m_renderedToDefaultFb || impl.hasPresentableTexture();
 }
 
 void CommandBufferImpl::endRenderPassInternal()
@@ -239,6 +238,7 @@ void CommandBufferImpl::endRenderPassInternal()
 	ANKI_ASSERT(insideRenderPass());
 	if(m_rpCommandCount == 0)
 	{
+		// Empty pass
 		m_subpassContents = VK_SUBPASS_CONTENTS_INLINE;
 		beginRenderPassInternal();
 	}

+ 8 - 5
AnKi/Gr/Vulkan/CommandBufferImpl.inl.h

@@ -342,7 +342,9 @@ inline void CommandBufferImpl::dispatchComputeInternal(U32 groupCountX, U32 grou
 
 	commandCommon();
 
-	getGrManagerImpl().beginMarker(m_handle, m_computeProg->getName());
+	flushBatches(CommandBufferCommandType::ANY_OTHER_COMMAND); // Do that before setting the markers
+
+	getGrManagerImpl().beginMarker(m_handle, m_computeProg->getName(), Vec3(1.0f, 1.0f, 0.0f));
 
 	// Bind descriptors
 	for(U32 i = 0; i < MAX_DESCRIPTOR_SETS; ++i)
@@ -378,7 +380,7 @@ inline void CommandBufferImpl::dispatchComputeInternal(U32 groupCountX, U32 grou
 		}
 	}
 
-	ANKI_CMD(vkCmdDispatch(m_handle, groupCountX, groupCountY, groupCountZ), ANY_OTHER_COMMAND);
+	vkCmdDispatch(m_handle, groupCountX, groupCountY, groupCountZ);
 
 	getGrManagerImpl().endMarker(m_handle);
 }
@@ -405,7 +407,9 @@ inline void CommandBufferImpl::traceRaysInternal(const BufferPtr& sbtBuffer, Ptr
 
 	commandCommon();
 
-	getGrManagerImpl().beginMarker(m_handle, m_rtProg->getName());
+	flushBatches(CommandBufferCommandType::ANY_OTHER_COMMAND); // Do that before setting the markers
+
+	getGrManagerImpl().beginMarker(m_handle, m_rtProg->getName(), Vec3(0.0f, 0.0f, 1.0f));
 
 	// Bind descriptors
 	for(U32 i = 0; i < MAX_DESCRIPTOR_SETS; ++i)
@@ -463,8 +467,7 @@ inline void CommandBufferImpl::traceRaysInternal(const BufferPtr& sbtBuffer, Ptr
 	// Callable, nothing for now
 	regions[3] = VkStridedDeviceAddressRegionKHR();
 
-	ANKI_CMD(vkCmdTraceRaysKHR(m_handle, &regions[0], &regions[1], &regions[2], &regions[3], width, height, depth),
-			 ANY_OTHER_COMMAND);
+	vkCmdTraceRaysKHR(m_handle, &regions[0], &regions[1], &regions[2], &regions[3], width, height, depth);
 
 	getGrManagerImpl().endMarker(m_handle);
 }

+ 18 - 19
AnKi/Gr/Vulkan/Common.h

@@ -69,25 +69,24 @@ enum class VulkanExtensions : U32
 	EXT_HEADLESS_SURFACE = 1 << 5,
 	KHR_SWAPCHAIN = 1 << 6,
 	KHR_SURFACE = 1 << 7,
-	EXT_DEBUG_MARKER = 1 << 8,
-	EXT_DEBUG_REPORT = 1 << 9,
-	AMD_SHADER_INFO = 1 << 10,
-	AMD_RASTERIZATION_ORDER = 1 << 11,
-	KHR_RAY_TRACING = 1 << 12,
-	KHR_PIPELINE_EXECUTABLE_PROPERTIES = 1 << 13,
-	EXT_DESCRIPTOR_INDEXING = 1 << 14,
-	KHR_BUFFER_DEVICE_ADDRESS = 1 << 15,
-	EXT_SCALAR_BLOCK_LAYOUT = 1 << 16,
-	KHR_TIMELINE_SEMAPHORE = 1 << 17,
-	KHR_SHADER_FLOAT16_INT8 = 1 << 18,
-	KHR_SHADER_ATOMIC_INT64 = 1 << 19,
-	KHR_SPIRV_1_4 = 1 << 20,
-	KHR_SHADER_FLOAT_CONTROLS = 1 << 21,
-	EXT_SAMPLER_FILTER_MIN_MAX = 1 << 22,
-	KHR_CREATE_RENDERPASS_2 = 1 << 23,
-	KHR_FRAGMENT_SHADING_RATE = 1 << 24,
-	EXT_ASTC_DECODE_MODE = 1 << 25,
-	EXT_TEXTURE_COMPRESSION_ASTC_HDR = 1 << 26,
+	EXT_DEBUG_UTILS = 1 << 8,
+	AMD_SHADER_INFO = 1 << 9,
+	AMD_RASTERIZATION_ORDER = 1 << 10,
+	KHR_RAY_TRACING = 1 << 11,
+	KHR_PIPELINE_EXECUTABLE_PROPERTIES = 1 << 12,
+	EXT_DESCRIPTOR_INDEXING = 1 << 13,
+	KHR_BUFFER_DEVICE_ADDRESS = 1 << 14,
+	EXT_SCALAR_BLOCK_LAYOUT = 1 << 15,
+	KHR_TIMELINE_SEMAPHORE = 1 << 16,
+	KHR_SHADER_FLOAT16_INT8 = 1 << 17,
+	KHR_SHADER_ATOMIC_INT64 = 1 << 18,
+	KHR_SPIRV_1_4 = 1 << 19,
+	KHR_SHADER_FLOAT_CONTROLS = 1 << 20,
+	EXT_SAMPLER_FILTER_MIN_MAX = 1 << 21,
+	KHR_CREATE_RENDERPASS_2 = 1 << 22,
+	KHR_FRAGMENT_SHADING_RATE = 1 << 23,
+	EXT_ASTC_DECODE_MODE = 1 << 24,
+	EXT_TEXTURE_COMPRESSION_ASTC_HDR = 1 << 25,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
 

+ 3 - 4
AnKi/Gr/Vulkan/FramebufferImpl.cpp

@@ -55,8 +55,7 @@ Error FramebufferImpl::init(const FramebufferInitInfo& init)
 	// Create a renderpass.
 	initRpassCreateInfo(init);
 	ANKI_VK_CHECK(vkCreateRenderPass2KHR(getDevice(), &m_rpassCi, nullptr, &m_compatibleRenderpassHandle));
-	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
-											  m_compatibleRenderpassHandle);
+	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_OBJECT_TYPE_RENDER_PASS, m_compatibleRenderpassHandle);
 
 	// Create the FB
 	ANKI_CHECK(initFbs(init));
@@ -177,7 +176,7 @@ Error FramebufferImpl::initFbs(const FramebufferInitInfo& init)
 	ANKI_ASSERT(count == ci.attachmentCount);
 
 	ANKI_VK_CHECK(vkCreateFramebuffer(getDevice(), &ci, nullptr, &m_fbHandle));
-	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, m_fbHandle);
+	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_OBJECT_TYPE_FRAMEBUFFER, m_fbHandle);
 
 	return Error::NONE;
 }
@@ -375,7 +374,7 @@ VkRenderPass FramebufferImpl::getRenderPassHandle(const Array<VkImageLayout, MAX
 			}
 
 			ANKI_VK_CHECKF(vkCreateRenderPass2KHR(getDevice(), &ci, nullptr, &out));
-			getGrManagerImpl().trySetVulkanHandleName(getName(), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, out);
+			getGrManagerImpl().trySetVulkanHandleName(getName(), VK_OBJECT_TYPE_RENDER_PASS, out);
 
 			m_renderpassHandles.emplace(getAllocator(), hash, out);
 		}

+ 57 - 103
AnKi/Gr/Vulkan/GrManagerImpl.cpp

@@ -79,9 +79,9 @@ GrManagerImpl::~GrManagerImpl()
 		vkDestroySurfaceKHR(m_instance, m_surface, nullptr);
 	}
 
-	if(m_debugCallback)
+	if(m_debugUtilsMessager)
 	{
-		vkDestroyDebugReportCallbackEXT(m_instance, m_debugCallback, nullptr);
+		vkDestroyDebugUtilsMessengerEXT(m_instance, m_debugUtilsMessager, nullptr);
 	}
 
 	if(m_instance)
@@ -95,8 +95,6 @@ GrManagerImpl::~GrManagerImpl()
 		vkDestroyInstance(m_instance, pallocCbs);
 	}
 
-	m_vkHandleToName.destroy(getAllocator());
-
 #if ANKI_PLATFORM_MOBILE
 	m_alloc.deleteInstance(m_globalCreatePipelineMtx);
 #endif
@@ -315,31 +313,33 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 
 		for(U32 i = 0; i < extCount; ++i)
 		{
+			const CString extensionName = instExtensionInf[i].extensionName;
+
 #if ANKI_WINDOWING_SYSTEM_HEADLESS
-			if(CString(instExtensionInf[i].extensionName) == VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME)
+			if(extensionName == VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::EXT_HEADLESS_SURFACE;
 				instExtensions[instExtensionCount++] = VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME;
 			}
 #elif ANKI_OS_LINUX
-			if(CString(instExtensionInf[i].extensionName) == VK_KHR_XCB_SURFACE_EXTENSION_NAME)
+			if(extensionName == VK_KHR_XCB_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::KHR_XCB_SURFACE;
 				instExtensions[instExtensionCount++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME;
 			}
-			else if(CString(instExtensionInf[i].extensionName) == VK_KHR_XLIB_SURFACE_EXTENSION_NAME)
+			else if(extensionName == VK_KHR_XLIB_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::KHR_XLIB_SURFACE;
 				instExtensions[instExtensionCount++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
 			}
 #elif ANKI_OS_WINDOWS
-			if(CString(instExtensionInf[i].extensionName) == VK_KHR_WIN32_SURFACE_EXTENSION_NAME)
+			if(extensionName == VK_KHR_WIN32_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::KHR_WIN32_SURFACE;
 				instExtensions[instExtensionCount++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
 			}
 #elif ANKI_OS_ANDROID
-			if(CString(instExtensionInf[i].extensionName) == VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)
+			if(extensionName == VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::KHR_ANDROID_SURFACE;
 				instExtensions[instExtensionCount++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;
@@ -347,16 +347,16 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 #else
 #	error Not implemented
 #endif
-			else if(CString(instExtensionInf[i].extensionName) == VK_KHR_SURFACE_EXTENSION_NAME)
+			else if(extensionName == VK_KHR_SURFACE_EXTENSION_NAME)
 			{
 				m_extensions |= VulkanExtensions::KHR_SURFACE;
 				instExtensions[instExtensionCount++] = VK_KHR_SURFACE_EXTENSION_NAME;
 			}
-			else if(CString(instExtensionInf[i].extensionName) == VK_EXT_DEBUG_REPORT_EXTENSION_NAME
-					&& (m_config->getGrValidation() || m_config->getGrDebugPrintf()))
+			else if(extensionName == VK_EXT_DEBUG_UTILS_EXTENSION_NAME
+					&& (m_config->getGrDebugMarkers() || m_config->getGrValidation() || m_config->getGrDebugPrintf()))
 			{
-				m_extensions |= VulkanExtensions::EXT_DEBUG_REPORT;
-				instExtensions[instExtensionCount++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
+				m_extensions |= VulkanExtensions::EXT_DEBUG_UTILS;
+				instExtensions[instExtensionCount++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
 			}
 		}
 
@@ -401,23 +401,20 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 	volkLoadInstance(m_instance);
 
 	// Set debug callbacks
-	//
-	if(!!(m_extensions & VulkanExtensions::EXT_DEBUG_REPORT))
+	if(!!(m_extensions & VulkanExtensions::EXT_DEBUG_UTILS))
 	{
-		VkDebugReportCallbackCreateInfoEXT ci = {};
-		ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
-		ci.pfnCallback = debugReportCallbackEXT;
-		ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT
-				   | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
-
-		if(m_config->getGrDebugPrintf())
-		{
-			ci.flags |= VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
-		}
-
-		ci.pUserData = this;
+		VkDebugUtilsMessengerCreateInfoEXT info = {};
+		info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
+		info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT
+							   | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT
+							   | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
+		info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT
+						   | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
+						   | VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT;
+		info.pfnUserCallback = debugReportCallbackEXT;
+		info.pUserData = this;
 
-		vkCreateDebugReportCallbackEXT(m_instance, &ci, nullptr, &m_debugCallback);
+		vkCreateDebugUtilsMessengerEXT(m_instance, &info, nullptr, &m_debugUtilsMessager);
 	}
 
 	// Create the physical device
@@ -649,11 +646,6 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				m_extensions |= VulkanExtensions::KHR_SWAPCHAIN;
 				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
 			}
-			else if(extensionName == VK_EXT_DEBUG_MARKER_EXTENSION_NAME && m_config->getGrDebugMarkers())
-			{
-				m_extensions |= VulkanExtensions::EXT_DEBUG_MARKER;
-				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
-			}
 			else if(extensionName == VK_AMD_SHADER_INFO_EXTENSION_NAME && m_config->getCoreDisplayStats())
 			{
 				m_extensions |= VulkanExtensions::AMD_SHADER_INFO;
@@ -1075,31 +1067,6 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 
 	ANKI_VK_CHECK(vkCreateDevice(m_physicalDevice, &ci, nullptr, &m_device));
 
-	// Get debug marker
-	if(!!(m_extensions & VulkanExtensions::EXT_DEBUG_MARKER))
-	{
-		m_pfnDebugMarkerSetObjectNameEXT = reinterpret_cast<PFN_vkDebugMarkerSetObjectNameEXT>(
-			vkGetDeviceProcAddr(m_device, "vkDebugMarkerSetObjectNameEXT"));
-		if(!m_pfnDebugMarkerSetObjectNameEXT)
-		{
-			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkDebugMarkerSetObjectNameEXT is not there");
-		}
-
-		m_pfnCmdDebugMarkerBeginEXT =
-			reinterpret_cast<PFN_vkCmdDebugMarkerBeginEXT>(vkGetDeviceProcAddr(m_device, "vkCmdDebugMarkerBeginEXT"));
-		if(!m_pfnCmdDebugMarkerBeginEXT)
-		{
-			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkCmdDebugMarkerBeginEXT is not there");
-		}
-
-		m_pfnCmdDebugMarkerEndEXT =
-			reinterpret_cast<PFN_vkCmdDebugMarkerEndEXT>(vkGetDeviceProcAddr(m_device, "vkCmdDebugMarkerEndEXT"));
-		if(!m_pfnCmdDebugMarkerEndEXT)
-		{
-			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkCmdDebugMarkerEndEXT is not there");
-		}
-	}
-
 	// Get VK_AMD_shader_info entry points
 	if(!!(m_extensions & VulkanExtensions::AMD_SHADER_INFO))
 	{
@@ -1453,69 +1420,56 @@ void GrManagerImpl::finish()
 	}
 }
 
-void GrManagerImpl::trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const
+void GrManagerImpl::trySetVulkanHandleName(CString name, VkObjectType type, U64 handle) const
 {
-	if(name && name.getLength())
+	if(name && name.getLength() && !!(m_extensions & VulkanExtensions::EXT_DEBUG_UTILS))
 	{
-		if(m_pfnDebugMarkerSetObjectNameEXT)
-		{
-			VkDebugMarkerObjectNameInfoEXT inf = {};
-			inf.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
-			inf.objectType = type;
-			inf.pObjectName = name.cstr();
-			inf.object = handle;
-
-			m_pfnDebugMarkerSetObjectNameEXT(m_device, &inf);
-		}
+		VkDebugUtilsObjectNameInfoEXT info = {};
+		info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
+		info.objectHandle = handle;
+		info.objectType = type;
+		info.pObjectName = name.cstr();
 
-		LockGuard<SpinLock> lock(m_vkHandleToNameLock);
-		StringAuto newName(getAllocator());
-		newName.create(name);
-		m_vkHandleToName.emplace(getAllocator(), computeHash(&handle, sizeof(handle)), std::move(newName));
+		vkSetDebugUtilsObjectNameEXT(m_device, &info);
 	}
 }
 
-StringAuto GrManagerImpl::tryGetVulkanHandleName(U64 handle) const
+VkBool32 GrManagerImpl::debugReportCallbackEXT(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
+											   VkDebugUtilsMessageTypeFlagsEXT messageTypes,
+											   const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
+											   void* pUserData)
 {
-	StringAuto out(getAllocator());
-
-	LockGuard<SpinLock> lock(m_vkHandleToNameLock);
-
-	auto it = m_vkHandleToName.find(computeHash(&handle, sizeof(handle)));
-	CString objName;
-	if(it != m_vkHandleToName.getEnd())
+	// Get all names of affected objects
+	GrManagerImpl* self = static_cast<GrManagerImpl*>(pUserData);
+	StringAuto objectNames(self->m_alloc);
+	if(pCallbackData->objectCount)
 	{
-		objName = it->toCString();
+		for(U32 i = 0; i < pCallbackData->objectCount; ++i)
+		{
+			const Char* name = pCallbackData->pObjects[i].pObjectName;
+			objectNames.append((name) ? name : "?");
+			if(i < pCallbackData->objectCount - 1)
+			{
+				objectNames.append(", ");
+			}
+		}
 	}
 	else
 	{
-		objName = "Unnamed";
+		objectNames.create("N/A");
 	}
 
-	out.create(objName);
-
-	return out;
-}
-
-VkBool32 GrManagerImpl::debugReportCallbackEXT(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
-											   uint64_t object, size_t location, int32_t messageCode,
-											   const char* pLayerPrefix, const char* pMessage, void* pUserData)
-{
-	// Get the object name
-	GrManagerImpl* self = static_cast<GrManagerImpl*>(pUserData);
-	StringAuto name = self->tryGetVulkanHandleName(object);
-
-	if(flags & VK_DEBUG_REPORT_ERROR_BIT_EXT)
+	if(messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
 	{
-		ANKI_VK_LOGE("%s (handle: %s)", pMessage, name.cstr());
+		ANKI_VK_LOGE("VK debug report: %s. Affected objects: %s", pCallbackData->pMessage, objectNames.cstr());
 	}
-	else if(flags & (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT))
+	else if(messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
 	{
-		ANKI_VK_LOGW("%s (handle: %s)", pMessage, name.cstr());
+		ANKI_VK_LOGW("VK debug report: %s. Affected objects: %s", pCallbackData->pMessage, objectNames.cstr());
 	}
 	else
 	{
-		ANKI_VK_LOGI("%s (handle: %s)", pMessage, name.cstr());
+		ANKI_VK_LOGI("VK debug report: %s. Affected objects: %s", pCallbackData->pMessage, objectNames.cstr());
 	}
 
 	return false;

+ 19 - 29
AnKi/Gr/Vulkan/GrManagerImpl.h

@@ -175,41 +175,37 @@ public:
 
 	/// @name Debug report
 	/// @{
-	void beginMarker(VkCommandBuffer cmdb, CString name) const
+	void beginMarker(VkCommandBuffer cmdb, CString name, Vec3 color = Vec3(1.0f, 0.0f, 0.0f)) const
 	{
 		ANKI_ASSERT(cmdb);
-		if(m_pfnCmdDebugMarkerBeginEXT)
+		if(!!(m_extensions & VulkanExtensions::EXT_DEBUG_UTILS))
 		{
-			VkDebugMarkerMarkerInfoEXT markerInfo = {};
-			markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
-			markerInfo.color[0] = 1.0f;
-			markerInfo.pMarkerName = (!name.isEmpty() && name.getLength() > 0) ? name.cstr() : "Unnamed";
-			m_pfnCmdDebugMarkerBeginEXT(cmdb, &markerInfo);
+			VkDebugUtilsLabelEXT label = {};
+			label.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
+			label.pLabelName = name.cstr();
+			label.color[0] = color[0];
+			label.color[1] = color[1];
+			label.color[2] = color[2];
+			label.color[3] = 1.0f;
+			vkCmdBeginDebugUtilsLabelEXT(cmdb, &label);
 		}
 	}
 
 	void endMarker(VkCommandBuffer cmdb) const
 	{
 		ANKI_ASSERT(cmdb);
-		if(m_pfnCmdDebugMarkerEndEXT)
+		if(!!(m_extensions & VulkanExtensions::EXT_DEBUG_UTILS))
 		{
-			m_pfnCmdDebugMarkerEndEXT(cmdb);
+			vkCmdEndDebugUtilsLabelEXT(cmdb);
 		}
 	}
 
-	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const;
+	void trySetVulkanHandleName(CString name, VkObjectType type, U64 handle) const;
 
-	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, void* handle) const
+	void trySetVulkanHandleName(CString name, VkObjectType type, void* handle) const
 	{
 		trySetVulkanHandleName(name, type, U64(ptrToNumber(handle)));
 	}
-
-	StringAuto tryGetVulkanHandleName(U64 handle) const;
-
-	StringAuto tryGetVulkanHandleName(void* handle) const
-	{
-		return tryGetVulkanHandleName(U64(ptrToNumber(handle)));
-	}
 	/// @}
 
 	void printPipelineShaderInfo(VkPipeline ppline, CString name, ShaderTypeBit stages, U64 hash = 0) const;
@@ -242,7 +238,6 @@ private:
 #endif
 
 	VkInstance m_instance = VK_NULL_HANDLE;
-	VkDebugReportCallbackEXT m_debugCallback = VK_NULL_HANDLE;
 	VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
 	VulkanExtensions m_extensions = VulkanExtensions::NONE;
 	VkDevice m_device = VK_NULL_HANDLE;
@@ -266,9 +261,8 @@ private:
 	VkPhysicalDeviceShaderAtomicInt64FeaturesKHR m_atomicInt64Features = {};
 	VkPhysicalDeviceFragmentShadingRateFeaturesKHR m_fragmentShadingRateFeatures = {};
 
-	PFN_vkDebugMarkerSetObjectNameEXT m_pfnDebugMarkerSetObjectNameEXT = nullptr;
-	PFN_vkCmdDebugMarkerBeginEXT m_pfnCmdDebugMarkerBeginEXT = nullptr;
-	PFN_vkCmdDebugMarkerEndEXT m_pfnCmdDebugMarkerEndEXT = nullptr;
+	VkDebugUtilsMessengerEXT m_debugUtilsMessager = VK_NULL_HANDLE;
+
 	PFN_vkGetShaderInfoAMD m_pfnGetShaderInfoAMD = nullptr;
 	mutable File m_shaderStatsFile;
 	mutable SpinLock m_shaderStatsFileMtx;
@@ -325,9 +319,6 @@ private:
 
 	PipelineCache m_pplineCache;
 
-	mutable HashMap<U64, StringAuto> m_vkHandleToName;
-	mutable SpinLock m_vkHandleToNameLock;
-
 	FrameGarbageCollector m_frameGarbageCollector;
 
 #if ANKI_PLATFORM_MOBILE
@@ -338,7 +329,6 @@ private:
 	ANKI_USE_RESULT Error initInstance(const GrManagerInitInfo& init);
 	ANKI_USE_RESULT Error initSurface(const GrManagerInitInfo& init);
 	ANKI_USE_RESULT Error initDevice(const GrManagerInitInfo& init);
-	ANKI_USE_RESULT Error initFramebuffers(const GrManagerInitInfo& init);
 	ANKI_USE_RESULT Error initMemory();
 
 #if ANKI_GR_MANAGER_DEBUG_MEMMORY
@@ -353,9 +343,9 @@ private:
 
 	void resetFrame(PerFrame& frame);
 
-	static VkBool32 debugReportCallbackEXT(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
-										   uint64_t object, size_t location, int32_t messageCode,
-										   const char* pLayerPrefix, const char* pMessage, void* pUserData);
+	static VkBool32 debugReportCallbackEXT(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
+										   VkDebugUtilsMessageTypeFlagsEXT messageTypes,
+										   const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData);
 
 	ANKI_USE_RESULT Error printPipelineShaderInfoInternal(VkPipeline ppline, CString name, ShaderTypeBit stages,
 														  U64 hash) const;

+ 1 - 1
AnKi/Gr/Vulkan/SamplerFactory.cpp

@@ -107,7 +107,7 @@ Error MicroSampler::init(const SamplerInitInfo& inf)
 
 	// Create
 	ANKI_VK_CHECK(vkCreateSampler(m_factory->m_gr->getDevice(), &ci, nullptr, &m_handle));
-	m_factory->m_gr->trySetVulkanHandleName(inf.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, m_handle);
+	m_factory->m_gr->trySetVulkanHandleName(inf.getName(), VK_OBJECT_TYPE_SAMPLER, m_handle);
 
 	return Error::NONE;
 }

+ 3 - 4
AnKi/Gr/Vulkan/TextureImpl.cpp

@@ -212,7 +212,7 @@ Error TextureImpl::initInternal(VkImage externalImage, const TextureInitInfo& in
 		ANKI_ASSERT(m_singleSurfaceImageView.m_derivedTextureType == m_texType);
 
 		ANKI_VK_CHECKF(vkCreateImageView(getDevice(), &viewCi, nullptr, &m_singleSurfaceImageView.m_handle));
-		getGrManagerImpl().trySetVulkanHandleName(getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
+		getGrManagerImpl().trySetVulkanHandleName(getName(), VK_OBJECT_TYPE_IMAGE_VIEW,
 												  ptrToNumber(m_singleSurfaceImageView.m_handle));
 	}
 
@@ -307,7 +307,7 @@ Error TextureImpl::initImage(const TextureInitInfo& init)
 	ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
 
 	ANKI_VK_CHECK(vkCreateImage(getDevice(), &ci, nullptr, &m_imageHandle));
-	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, m_imageHandle);
+	getGrManagerImpl().trySetVulkanHandleName(init.getName(), VK_OBJECT_TYPE_IMAGE, m_imageHandle);
 #if 0
 	printf("Creating texture %p %s\n", static_cast<void*>(m_imageHandle),
 		   init.getName() ? init.getName().cstr() : "Unnamed");
@@ -615,8 +615,7 @@ const MicroImageView& TextureImpl::getOrCreateView(const TextureSubresourceInfo&
 	ANKI_ASSERT(viewTexType != TextureType::COUNT);
 
 	ANKI_VK_CHECKF(vkCreateImageView(getDevice(), &viewCi, nullptr, &handle));
-	getGrManagerImpl().trySetVulkanHandleName(getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
-											  ptrToNumber(handle));
+	getGrManagerImpl().trySetVulkanHandleName(getName(), VK_OBJECT_TYPE_IMAGE_VIEW, ptrToNumber(handle));
 
 	it = m_viewsMap.emplace(getAllocator(), subresource);
 	it->m_handle = handle;