layers: Output function names for deferred memory validation checks
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 5bb18e6..4425c0b 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -467,19 +467,21 @@
my_data->memObjMap[mem].valid = false;
}
-static VkBool32 validate_memory_is_valid(layer_data *my_data, VkDeviceMemory mem, VkImage image = VK_NULL_HANDLE) {
+static VkBool32 validate_memory_is_valid(layer_data *my_data, VkDeviceMemory mem, const char* functionName, VkImage image = VK_NULL_HANDLE) {
if (mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) {
MT_OBJ_BINDING_INFO* pBindInfo = get_object_binding_info(my_data, reinterpret_cast<uint64_t>(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
if (pBindInfo && !pBindInfo->valid) {
- return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, reinterpret_cast<uint64_t>(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
- "Cannot read invalid swapchain image %" PRIx64 ", please fill the memory before using.", reinterpret_cast<uint64_t>(image));
+ return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
+ reinterpret_cast<uint64_t>(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
+ "%s: Cannot read invalid swapchain image %" PRIx64 ", please fill the memory before using.", functionName, reinterpret_cast<uint64_t>(image));
}
}
else {
MT_MEM_OBJ_INFO *pMemObj = get_mem_obj_info(my_data, mem);
if (pMemObj && !pMemObj->valid) {
- return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, reinterpret_cast<uint64_t>(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
- "Cannot read invalid memory %" PRIx64 ", please fill the memory before using.", reinterpret_cast<uint64_t>(mem));
+ return log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
+ reinterpret_cast<uint64_t>(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM",
+ "%s: Cannot read invalid memory %" PRIx64 ", please fill the memory before using.", functionName, reinterpret_cast<uint64_t>(mem));
}
}
return false;
@@ -2337,7 +2339,7 @@
VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
auto cb_data = my_data->cbMap.find(commandBuffer);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdBindVertexBuffers()"); };
cb_data->second.validate_functions.push_back(function);
}
}
@@ -2357,7 +2359,7 @@
VkBool32 skip_call = get_mem_binding_from_object(my_data, commandBuffer, reinterpret_cast<uint64_t>(buffer), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
auto cb_data = my_data->cbMap.find(commandBuffer);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdBindIndexBuffer()"); };
cb_data->second.validate_functions.push_back(function);
}
// TODO : Somewhere need to verify that IBs have correct usage state flagged
@@ -2431,7 +2433,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdCopyBuffer()"); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyBuffer");
@@ -2467,7 +2469,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyQueryPoolResults");
@@ -2496,13 +2498,13 @@
// Validate that src & dst images have correct usage flags set
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, srcImage); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdCopyImage()", srcImage); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyImage");
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyImage");
@@ -2533,13 +2535,13 @@
// Validate that src & dst images have correct usage flags set
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, srcImage); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdBlitImage()", srcImage); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdBlitImage");
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);\
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdBlitImage");
@@ -2567,13 +2569,13 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyBufferToImage");
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdCopyBufferToImage()"); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyBufferToImage");
@@ -2602,13 +2604,13 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, srcImage); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdCopyImageToBuffer()", srcImage); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyImageToBuffer");
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdCopyImageToBuffer");
@@ -2636,7 +2638,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdUpdateBuffer");
@@ -2662,7 +2664,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdFillBuffer");
@@ -2690,7 +2692,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, image); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdClearColorImage");
@@ -2716,7 +2718,7 @@
loader_platform_thread_lock_mutex(&globalLock);
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, image); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdClearDepthStencilImage");
@@ -2743,13 +2745,13 @@
VkDeviceMemory mem;
skipCall = get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, srcImage); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, mem, "vkCmdResolveImage()", srcImage); };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdResolveImage");
skipCall |= get_mem_binding_from_object(my_data, commandBuffer, (uint64_t)dstImage, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, mem, true, dstImage); return false; };
cb_data->second.validate_functions.push_back(function);
}
skipCall |= update_cmd_buf_and_mem_references(my_data, commandBuffer, mem, "vkCmdResolveImage");
@@ -2956,7 +2958,7 @@
MT_SWAP_CHAIN_INFO *pInfo = my_data->swapchainMap[pPresentInfo->pSwapchains[i]];
VkImage image = pInfo->images[pPresentInfo->pImageIndices[i]];
skip_call |= get_mem_binding_from_object(my_data, queue, reinterpret_cast<uint64_t>(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem);
- skip_call |= validate_memory_is_valid(my_data, mem, image);
+ skip_call |= validate_memory_is_valid(my_data, mem, "vkQueuePresentKHR()", image);
}
if (!skip_call) {
result = my_data->device_dispatch_table->QueuePresentKHR(queue, pPresentInfo);
@@ -3103,7 +3105,7 @@
MT_FB_ATTACHMENT_INFO& fb_info = my_data->fbMap[pass_info.fb].attachments[i];
if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, true, fb_info.image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, true, fb_info.image); return false; };
cb_data->second.validate_functions.push_back(function);
}
VkImageLayout& attachment_layout = pass_info.attachment_first_layout[pass_info.attachments[i].attachment];
@@ -3115,18 +3117,18 @@
}
} else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, false, fb_info.image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, false, fb_info.image); return false; };
cb_data->second.validate_functions.push_back(function);
}
} else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, fb_info.mem, fb_info.image); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); };
cb_data->second.validate_functions.push_back(function);
}
}
if (pass_info.attachment_first_read[pass_info.attachments[i].attachment]) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, fb_info.mem, fb_info.image); };
+ std::function<bool()> function = [=]() { return validate_memory_is_valid(my_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); };
cb_data->second.validate_functions.push_back(function);
}
}
@@ -3154,12 +3156,12 @@
MT_FB_ATTACHMENT_INFO& fb_info = my_data->fbMap[pass_info.fb].attachments[i];
if (pass_info.attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, true, fb_info.image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, true, fb_info.image); return false; };
cb_data->second.validate_functions.push_back(function);
}
} else if (pass_info.attachments[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) {
if (cb_data != my_data->cbMap.end()) {
- std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, false, fb_info.image);return false; };
+ std::function<bool()> function = [=]() { set_memory_valid(my_data, fb_info.mem, false, fb_info.image); return false; };
cb_data->second.validate_functions.push_back(function);
}
}