debug_report.c revision b40f2568bff91895d66848767fdaa540793b5162
11c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 21c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Vulkan 31c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * 41c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Copyright (C) 2015 LunarG, Inc. 51c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * 61c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Permission is hereby granted, free of charge, to any person obtaining a 71c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * copy of this software and associated documentation files (the "Software"), 81c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * to deal in the Software without restriction, including without limitation 91c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * and/or sell copies of the Software, and to permit persons to whom the 111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Software is furnished to do so, subject to the following conditions: 121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * 131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * The above copyright notice and this permission notice shall be included 141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * in all copies or substantial portions of the Software. 151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * 161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * DEALINGS IN THE SOFTWARE. 231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * 241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Authors: 251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Jon Ashburn <jon@lunarg.com> 261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * Courtney Goeltzenleuchter <courtney@lunarg.com> 271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <string.h> 301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <stdlib.h> 311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include "debug_report.h" 321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include "vkLayer.h" 331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic const struct loader_extension_property debug_report_extension_info = { 351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .info = { 361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, 371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .name = DEBUG_REPORT_EXTENSION_NAME, 381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .version = VK_DEBUG_REPORT_EXTENSION_VERSION, 391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .description = "loader: debug report extension", 401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter }, 411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .origin = VK_EXTENSION_ORIGIN_LOADER, 421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .hosted = true, 431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter}; 441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_add_instance_extensions( 461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_extension_list *ext_list) 471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter loader_add_to_ext_list(ext_list, 1, &debug_report_extension_info); 491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 501c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_create_instance( 521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *ptr_instance) 531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter ptr_instance->debug_report_enabled = has_vk_extension_property( 551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &debug_report_extension_info.info, 561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &ptr_instance->enabled_instance_extensions); 571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgCreateMsgCallback( 601c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData, 641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pNewDbgFuncNode = (VkLayerDbgFunctionNode *) malloc(sizeof(VkLayerDbgFunctionNode)); 671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!pNewDbgFuncNode) 681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_OUT_OF_HOST_MEMORY; 691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 708afefb5096305216b66a6e18ff653fde6f1f908aCourtney Goeltzenleuchter struct loader_instance *inst = loader_instance(instance); 71b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult result = inst->disp->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback); 731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (result == VK_SUCCESS) { 741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgCallback = *pMsgCallback; 751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback; 761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgFlags = msgFlags; 771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pUserData = pUserData; 781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pNext = inst->DbgFunctionHead; 791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pNewDbgFuncNode; 801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } else { 811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter free(pNewDbgFuncNode); 821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 83b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgDestroyMsgCallback( 881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback msg_callback) 901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 918afefb5096305216b66a6e18ff653fde6f1f908aCourtney Goeltzenleuchter struct loader_instance *inst = loader_instance(instance); 92b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pTrav = inst->DbgFunctionHead; 941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pPrev = pTrav; 951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 963d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter VkResult result = inst->disp->DbgDestroyMsgCallback(instance, msg_callback); 971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter while (pTrav) { 991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (pTrav->msgCallback == msg_callback) { 1001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev->pNext = pTrav->pNext; 1011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst->DbgFunctionHead == pTrav) 1021c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pTrav->pNext; 1031c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter free(pTrav); 1041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev = pTrav; 1071c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pTrav = pTrav->pNext; 1081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 110b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 1111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 1121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 1131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 1161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * This is the instance chain terminator function 1171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * for DbgCreateMsgCallback 1181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 1191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney GoeltzenleuchterVkResult loader_DbgCreateMsgCallback( 1201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 1221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 1231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const void* pUserData, 1241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 1251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 1261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback *icd_info; 1271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const struct loader_icd *icd; 1281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *inst; 1291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult res; 1301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t storage_idx; 1311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (instance == VK_NULL_HANDLE) 1331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 1341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter assert(loader.icds_scanned); 1361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (inst = loader.instances; inst; inst = inst->next) { 1381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 1391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst == VK_NULL_HANDLE) 1431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 1441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info = calloc(sizeof(VkDbgMsgCallback), inst->total_icd_count); 1461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!icd_info) { 1471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_OUT_OF_HOST_MEMORY; 1481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1501c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 1511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 1521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!icd->DbgCreateMsgCallback) { 1531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter continue; 1541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter res = icd->DbgCreateMsgCallback( 1571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->instance, 1581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter msgFlags, 1591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pfnMsgCallback, 1601c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pUserData, 1611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &icd_info[storage_idx]); 1621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (res != VK_SUCCESS) { 1641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 1671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter /* roll back on errors */ 1701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd) { 1711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 1721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 1731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd_info[storage_idx]) { 1741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->DbgDestroyMsgCallback( 1751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->instance, 1761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info[storage_idx]); 1771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 1791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return res; 1821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter *pMsgCallback = (VkDbgMsgCallback) icd_info; 1851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_SUCCESS; 1871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 1881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 1901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * This is the instance chain terminator function 1911c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * for DbgDestroyMsgCallback 1921c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 1931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney GoeltzenleuchterVkResult loader_DbgDestroyMsgCallback( 1941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback msgCallback) 1961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 1971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t storage_idx; 1981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback *icd_info; 1991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const struct loader_icd *icd; 2001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult res = VK_SUCCESS; 2011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *inst; 2021c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2031c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (instance == VK_NULL_HANDLE) 2041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 2051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter assert(loader.icds_scanned); 2071c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (inst = loader.instances; inst; inst = inst->next) { 2091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 2101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 2111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst == VK_NULL_HANDLE) 2141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 2151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info = (VkDbgMsgCallback *) msgCallback; 2171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 2181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 2191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd_info[storage_idx]) { 2201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->DbgDestroyMsgCallback( 2213d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter icd->instance, 2221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info[storage_idx]); 2231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 2251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return res; 2271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter// DebugReport utility callback functions 2301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StringCallback( 2311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 2321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 2331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 2341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 2351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 2361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 2371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 2381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 2391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 2401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StdioCallback( 2441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 2451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 2461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 2471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 2481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 2491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 2501c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 2511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 2521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 2531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI BreakCallback( 2571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 2581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 2591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 2601c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 2611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 2621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 2631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 2641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 2651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 2661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid *debug_report_instance_gpa( 2701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *ptr_instance, 2711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* name) 2721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 2731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (ptr_instance == VK_NULL_HANDLE || !ptr_instance->debug_report_enabled) 2741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return NULL; 2751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!strcmp("vkDbgCreateMsgCallback", name)) 2771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) debug_report_DbgCreateMsgCallback; 2781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter else if (!strcmp("vkDbgDestroyMsgCallback", name)) 2791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) debug_report_DbgDestroyMsgCallback; 280b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgStringCallback", name)) 2811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) StringCallback; 282b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgStdioCallback", name)) 2831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) StdioCallback; 284b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgBreakCallback", name)) 2851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) BreakCallback; 2861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return NULL; 2881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 289