layers: Fixes for issues resulting from MR87
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 58bbc00..8fa1223 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -2815,6 +2815,7 @@
VkQueue queue,
const VkPresentInfoKHR* pPresentInfo)
{
+ VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
bool skip_call = false;
VkDeviceMemory mem;
@@ -2824,8 +2825,10 @@
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);
}
- if (!skip_call)
- return my_data->device_dispatch_table->QueuePresentKHR(queue, pPresentInfo);
+ if (!skip_call) {
+ result = my_data->device_dispatch_table->QueuePresentKHR(queue, pPresentInfo);
+ }
+ return result;
}
VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(
@@ -2884,6 +2887,23 @@
return result;
}
+VKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer(
+ VkDevice device,
+ VkFramebuffer framebuffer,
+ const VkAllocationCallbacks* pAllocator)
+{
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
+
+ auto item = my_data->fbMap.find(framebuffer);
+ loader_platform_thread_lock_mutex(&globalLock);
+ if (item != my_data->fbMap.end()) {
+ my_data->fbMap.erase(framebuffer);
+ }
+ loader_platform_thread_unlock_mutex(&globalLock);
+
+ my_data->device_dispatch_table->DestroyFramebuffer(device, framebuffer, pAllocator);
+}
+
VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(
VkDevice device,
const VkRenderPassCreateInfo* pCreateInfo,
@@ -2911,22 +2931,24 @@
{
layer_data *my_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
bool skip_call = false;
- loader_platform_thread_lock_mutex(&globalLock);
- auto pass_data = my_data->passMap.find(pRenderPassBegin->renderPass);
- if (pass_data != my_data->passMap.end()) {
- MT_PASS_INFO& pass_info = pass_data->second;
- pass_info.fb = pRenderPassBegin->framebuffer;
- for (int i = 0; i < pass_info.attachments.size(); ++i) {
- 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) {
- set_memory_valid(my_data, fb_info.mem, true, fb_info.image);
- } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) {
- skip_call |= validate_memory_is_valid(my_data, fb_info.mem, fb_info.image);
+ if (pRenderPassBegin) {
+ loader_platform_thread_lock_mutex(&globalLock);
+ auto pass_data = my_data->passMap.find(pRenderPassBegin->renderPass);
+ if (pass_data != my_data->passMap.end()) {
+ MT_PASS_INFO& pass_info = pass_data->second;
+ pass_info.fb = pRenderPassBegin->framebuffer;
+ for (int i = 0; i < pass_info.attachments.size(); ++i) {
+ 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) {
+ set_memory_valid(my_data, fb_info.mem, true, fb_info.image);
+ } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) {
+ skip_call |= validate_memory_is_valid(my_data, fb_info.mem, fb_info.image);
+ }
}
- }
- auto cb_data = my_data->cbMap.find(cmdBuffer);
- if (cb_data != my_data->cbMap.end()) {
- cb_data->second.pass = pRenderPassBegin->renderPass;
+ auto cb_data = my_data->cbMap.find(cmdBuffer);
+ if (cb_data != my_data->cbMap.end()) {
+ cb_data->second.pass = pRenderPassBegin->renderPass;
+ }
}
loader_platform_thread_unlock_mutex(&globalLock);
}
@@ -3096,6 +3118,9 @@
return (PFN_vkVoidFunction) vkGetDeviceQueue;
if (!strcmp(funcName, "vkCreateFramebuffer"))
return (PFN_vkVoidFunction) vkCreateFramebuffer;
+ if (!strcmp(funcName, "vkDestroyFramebuffer"))
+ return (PFN_vkVoidFunction) vkDestroyFramebuffer;
+
my_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);
if (my_data->wsi_enabled)