layers: Add names to objects and print in validation
Change-Id: Ie6587c26c8528ffac5698b8cb3ca2c4cc86b1dfd
layers: Fill out the rest of debug marker calls
Change-Id: I0c4085e36e5c06e11c0c09d1ca126ae6db35526d
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 9450278..9b43035 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -10135,6 +10135,41 @@
return result;
}
+VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
+ std::unique_lock<std::mutex> lock(global_lock);
+ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (pNameInfo->pObjectName) {
+ device_data->report_data->debugObjectNameMap->insert(
+ std::make_pair<uint64_t, std::string>((uint64_t &&)pNameInfo->object, pNameInfo->pObjectName));
+ } else {
+ device_data->report_data->debugObjectNameMap->erase(pNameInfo->object);
+ }
+ lock.unlock();
+ VkResult result = device_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
+ return result;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectTagEXT(VkDevice device, VkDebugMarkerObjectTagInfoEXT *pTagInfo) {
+ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ VkResult result = device_data->dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo);
+ return result;
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
+ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ device_data->dispatch_table.CmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) {
+ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ device_data->dispatch_table.CmdDebugMarkerEndEXT(commandBuffer);
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT *pMarkerInfo) {
+ layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ device_data->dispatch_table.CmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
+}
+
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName);
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *funcName);
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName);
@@ -10262,6 +10297,11 @@
{"vkCmdNextSubpass", (void*)CmdNextSubpass},
{"vkCmdEndRenderPass", (void*)CmdEndRenderPass},
{"vkCmdExecuteCommands", (void*)CmdExecuteCommands},
+ {"vkCmdDebugMarkerBeginEXT", (void*)CmdDebugMarkerBeginEXT},
+ {"vkCmdDebugMarkerEndEXT", (void*)CmdDebugMarkerEndEXT},
+ {"vkCmdDebugMarkerInsertEXT", (void*)CmdDebugMarkerInsertEXT},
+ {"vkDebugMarkerSetObjectNameEXT", (void*)DebugMarkerSetObjectNameEXT},
+ {"vkDebugMarkerSetObjectTagEXT", (void*)DebugMarkerSetObjectTagEXT},
{"vkSetEvent", (void*)SetEvent},
{"vkMapMemory", (void*)MapMemory},
{"vkUnmapMemory", (void*)UnmapMemory},
diff --git a/layers/linux/VkLayer_core_validation.json b/layers/linux/VkLayer_core_validation.json
index 4c5f7a1..437c41d 100644
--- a/layers/linux/VkLayer_core_validation.json
+++ b/layers/linux/VkLayer_core_validation.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/layers/linux/VkLayer_object_tracker.json b/layers/linux/VkLayer_object_tracker.json
index 9c94b76..68fa9d5 100644
--- a/layers/linux/VkLayer_object_tracker.json
+++ b/layers/linux/VkLayer_object_tracker.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/layers/linux/VkLayer_parameter_validation.json b/layers/linux/VkLayer_parameter_validation.json
index 9820123..e10b964 100644
--- a/layers/linux/VkLayer_parameter_validation.json
+++ b/layers/linux/VkLayer_parameter_validation.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp
index 1265524..8790317 100644
--- a/layers/object_tracker.cpp
+++ b/layers/object_tracker.cpp
@@ -4534,12 +4534,18 @@
VKAPI_ATTR VkResult VKAPI_CALL DebugMarkerSetObjectNameEXT(VkDevice device, VkDebugMarkerObjectNameInfoEXT *pNameInfo) {
bool skip = VK_FALSE;
std::unique_lock<std::mutex> lock(global_lock);
+ layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (pNameInfo->pObjectName) {
+ dev_data->report_data->debugObjectNameMap->insert(
+ std::make_pair<uint64_t, std::string>((uint64_t &&)pNameInfo->object, pNameInfo->pObjectName));
+ } else {
+ dev_data->report_data->debugObjectNameMap->erase(pNameInfo->object);
+ }
skip |= ValidateObject(device, device, kVulkanObjectTypeDevice, false, VALIDATION_ERROR_23605601, VALIDATION_ERROR_UNDEFINED);
lock.unlock();
if (skip) {
return VK_ERROR_VALIDATION_FAILED_EXT;
}
- layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
VkResult result = dev_data->dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo);
return result;
}
diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp
index 5cb2a5b..70ffb59 100644
--- a/layers/parameter_validation.cpp
+++ b/layers/parameter_validation.cpp
@@ -5331,7 +5331,12 @@
bool skip = false;
auto my_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
assert(my_data != NULL);
-
+ if (pNameInfo->pObjectName) {
+ my_data->report_data->debugObjectNameMap->insert(
+ std::make_pair<uint64_t, std::string>((uint64_t &&)pNameInfo->object, pNameInfo->pObjectName));
+ } else {
+ my_data->report_data->debugObjectNameMap->erase(pNameInfo->object);
+ }
skip |= parameter_validation_vkDebugMarkerSetObjectNameEXT(my_data, pNameInfo);
if (!skip) {
diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h
index e0beb5e..7cf113b 100644
--- a/layers/vk_layer_logging.h
+++ b/layers/vk_layer_logging.h
@@ -40,6 +40,7 @@
VkLayerDbgFunctionNode *default_debug_callback_list;
VkFlags active_flags;
bool g_DEBUG_REPORT;
+ std::unordered_map<uint64_t, std::string> *debugObjectNameMap;
} debug_report_data;
template debug_report_data *GetLayerDataPtr<debug_report_data>(void *data_key,
@@ -119,8 +120,21 @@
while (pTrav) {
if (pTrav->msgFlags & msgFlags) {
- if (pTrav->pfnMsgCallback(msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, pMsg, pTrav->pUserData)) {
- bail = true;
+ auto it = debug_data->debugObjectNameMap->find(srcObject);
+ if (it == debug_data->debugObjectNameMap->end()) {
+ if (pTrav->pfnMsgCallback(msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, pMsg,
+ pTrav->pUserData)) {
+ bail = true;
+ }
+ } else {
+ std::string newMsg = "SrcObject name = ";
+ newMsg.append(it->second.c_str());
+ newMsg.append(" ");
+ newMsg.append(pMsg);
+ if (pTrav->pfnMsgCallback(msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, newMsg.c_str(),
+ pTrav->pUserData)) {
+ bail = true;
+ }
}
}
pTrav = pTrav->pNext;
@@ -143,6 +157,7 @@
debug_data->g_DEBUG_REPORT = true;
}
}
+ debug_data->debugObjectNameMap = new std::unordered_map<uint64_t, std::string>;
return debug_data;
}
@@ -150,6 +165,7 @@
if (debug_data) {
RemoveAllMessageCallbacks(debug_data, &debug_data->default_debug_callback_list);
RemoveAllMessageCallbacks(debug_data, &debug_data->debug_callback_list);
+ delete debug_data->debugObjectNameMap;
free(debug_data);
}
}
diff --git a/layers/windows/VkLayer_core_validation.json b/layers/windows/VkLayer_core_validation.json
index 0f9cbc6..35b2f09 100644
--- a/layers/windows/VkLayer_core_validation.json
+++ b/layers/windows/VkLayer_core_validation.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/layers/windows/VkLayer_object_tracker.json b/layers/windows/VkLayer_object_tracker.json
index 2ebecd0..d572edb 100644
--- a/layers/windows/VkLayer_object_tracker.json
+++ b/layers/windows/VkLayer_object_tracker.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/layers/windows/VkLayer_parameter_validation.json b/layers/windows/VkLayer_parameter_validation.json
index 0d6c0f5..5131b43 100644
--- a/layers/windows/VkLayer_parameter_validation.json
+++ b/layers/windows/VkLayer_parameter_validation.json
@@ -12,6 +12,18 @@
"name": "VK_EXT_debug_report",
"spec_version": "6"
}
+ ],
+ "device_extensions": [
+ {
+ "name": "VK_EXT_debug_marker",
+ "spec_version": "4",
+ "entrypoints": ["vkDebugMarkerSetObjectTagEXT",
+ "vkDebugMarkerSetObjectNameEXT",
+ "vkCmdDebugMarkerBeginEXT",
+ "vkCmdDebugMarkerEndEXT",
+ "vkCmdDebugMarkerInsertEXT"
+ ]
+ }
]
}
}
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 3c37527..602e254 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -912,6 +912,49 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, DebugMarkerNameTest) {
+ ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), "VK_LAYER_LUNARG_core_validation", VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
+ } else {
+ printf(" Debug Marker Extension not supported, skipping test\n");
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkDebugMarkerSetObjectNameEXT fpvkDebugMarkerSetObjectNameEXT =
+ (PFN_vkDebugMarkerSetObjectNameEXT)vkGetInstanceProcAddr(instance(), "vkDebugMarkerSetObjectNameEXT");
+ if (!(fpvkDebugMarkerSetObjectNameEXT)) {
+ printf(" Can't find fpvkDebugMarkerSetObjectNameEXT; skipped.\n");
+ return;
+ }
+
+ VkEvent event_handle = VK_NULL_HANDLE;
+ VkEventCreateInfo event_info = {};
+ event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
+ vkCreateEvent(device(), &event_info, NULL, &event_handle);
+ VkDebugMarkerObjectNameInfoEXT name_info = {};
+ name_info.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
+ name_info.pNext = nullptr;
+ name_info.object = (uint64_t)event_handle;
+ name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT;
+ name_info.pObjectName = "UnimaginablyImprobableString";
+ fpvkDebugMarkerSetObjectNameEXT(device(), &name_info);
+
+ m_commandBuffer->begin();
+ vkCmdSetEvent(m_commandBuffer->handle(), event_handle, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
+ m_commandBuffer->end();
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+ vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UnimaginablyImprobableString");
+ vkDestroyEvent(m_device->device(), event_handle, NULL);
+ m_errorMonitor->VerifyFound();
+ vkQueueWaitIdle(m_device->m_queue);
+}
+
TEST_F(VkLayerTest, InvalidStructSType) {
TEST_DESCRIPTION(
"Specify an invalid VkStructureType for a Vulkan "