layers: Fix spurious WSI memory binding error messages in MemTracker
Bug caused invalid errors in some games.
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index bff038c..420c732 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -46,6 +46,10 @@
#include "vk_layer_logging.h"
static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(g_initOnce);
+// WSI Image Objects bypass usual Image Object creation methods. A special Memory
+// Object value will be used to identify them internally.
+static const VkDeviceMemory MEMTRACKER_SWAP_CHAIN_IMAGE_KEY = static_cast<VkDeviceMemory>(-1);
+
typedef struct _layer_data {
debug_report_data *report_data;
// TODO: put instance data here
@@ -416,12 +420,13 @@
break;
}
// Swap Chain is very unique, use imageMap, but copy in
- // SwapChainCreatInfo's usage flags. This is used by vkCreateImageView
- // to distinguish swap chain images
+ // SwapChainCreatInfo's usage flags and set the mem value to a unique key. These is used by
+ // vkCreateImageView and internal MemTracker routines to distinguish swap chain images
case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
{
auto pCI = &imageMap[handle];
memset(pCI, 0, sizeof(MT_OBJ_BINDING_INFO));
+ pCI->mem = MEMTRACKER_SWAP_CHAIN_IMAGE_KEY;
pCI->create_info.image.usage =
const_cast<VkSwapchainCreateInfoKHR*>(static_cast<const VkSwapchainCreateInfoKHR *>(pCreateInfo))->imageUsageFlags;
break;
@@ -720,44 +725,24 @@
const VkDeviceMemory mem)
{
VkBool32 result = VK_TRUE;
- // First update CB binding in MemObj mini CB list
- MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
- if (!pMemInfo) {
- // TODO : cb should be srcObj
- log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
- "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that mem obj.\n "
- "Was it correctly allocated? Did it already get freed?", mem.handle, cb);
- result = VK_FALSE;
- } else {
- // Search for cmd buffer object in memory object's binding list
- VkBool32 found = VK_FALSE;
- if (pMemInfo->pCmdBufferBindings.size() > 0) {
- for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
- if ((*it) == cb) {
- found = VK_TRUE;
- break;
- }
- }
- }
- // If not present, add to list
- if (found == VK_FALSE) {
- pMemInfo->pCmdBufferBindings.push_front(cb);
- pMemInfo->refCount++;
- }
- // Now update CBInfo's Mem reference list
- MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
- // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object
- if (!pCBInfo) {
+
+ // Skip validation if this image was created through WSI
+ if (mem != MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) {
+
+ // First update CB binding in MemObj mini CB list
+ MT_MEM_OBJ_INFO* pMemInfo = get_mem_obj_info(mem.handle);
+ if (!pMemInfo) {
// TODO : cb should be srcObj
log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
- "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem.handle, cb);
+ "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that mem obj.\n "
+ "Was it correctly allocated? Did it already get freed?", mem.handle, cb);
result = VK_FALSE;
} else {
- // Search for memory object in cmd buffer's reference list
+ // Search for cmd buffer object in memory object's binding list
VkBool32 found = VK_FALSE;
- if (pCBInfo->pMemObjList.size() > 0) {
- for (auto it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
- if ((*it) == mem) {
+ if (pMemInfo->pCmdBufferBindings.size() > 0) {
+ for (list<VkCmdBuffer>::iterator it = pMemInfo->pCmdBufferBindings.begin(); it != pMemInfo->pCmdBufferBindings.end(); ++it) {
+ if ((*it) == cb) {
found = VK_TRUE;
break;
}
@@ -765,7 +750,32 @@
}
// If not present, add to list
if (found == VK_FALSE) {
- pCBInfo->pMemObjList.push_front(mem);
+ pMemInfo->pCmdBufferBindings.push_front(cb);
+ pMemInfo->refCount++;
+ }
+ // Now update CBInfo's Mem reference list
+ MT_CB_INFO* pCBInfo = get_cmd_buf_info(cb);
+ // TODO: keep track of all destroyed CBs so we know if this is a stale or simply invalid object
+ if (!pCBInfo) {
+ // TODO : cb should be srcObj
+ log_msg(mdd(cb), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_COMMAND_BUFFER, 0, 0, MEMTRACK_INVALID_MEM_OBJ, "MEM",
+ "Trying to bind mem obj %#" PRIxLEAST64 " to CB %p but no info for that CB. Was CB incorrectly destroyed?", mem.handle, cb);
+ result = VK_FALSE;
+ } else {
+ // Search for memory object in cmd buffer's reference list
+ VkBool32 found = VK_FALSE;
+ if (pCBInfo->pMemObjList.size() > 0) {
+ for (auto it = pCBInfo->pMemObjList.begin(); it != pCBInfo->pMemObjList.end(); ++it) {
+ if ((*it) == mem) {
+ found = VK_TRUE;
+ break;
+ }
+ }
+ }
+ // If not present, add to list
+ if (found == VK_FALSE) {
+ pCBInfo->pMemObjList.push_front(mem);
+ }
}
}
}