debug_report.c revision 2d1d970ee5517436a87be5159ded60d9d18c089c
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 29f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter#include <stdio.h> 301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <string.h> 311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <stdlib.h> 32f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter#include <inttypes.h> 336969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#ifndef WIN32 34f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter#include <alloca.h> 356969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#endif 361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include "debug_report.h" 372d1d970ee5517436a87be5159ded60d9d18c089cTobin Ehlis#include "vk_layer.h" 381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 39f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchtertypedef void (VKAPI *PFN_stringCallback)(char *message); 40f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic const struct loader_extension_property debug_report_extension_info = { 421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .info = { 431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .sType = VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, 441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .name = DEBUG_REPORT_EXTENSION_NAME, 451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .version = VK_DEBUG_REPORT_EXTENSION_VERSION, 461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .description = "loader: debug report extension", 471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter }, 481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter .origin = VK_EXTENSION_ORIGIN_LOADER, 491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter}; 501c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_add_instance_extensions( 521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_extension_list *ext_list) 531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter loader_add_to_ext_list(ext_list, 1, &debug_report_extension_info); 551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_create_instance( 581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *ptr_instance) 591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 601c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter ptr_instance->debug_report_enabled = has_vk_extension_property( 611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &debug_report_extension_info.info, 621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &ptr_instance->enabled_instance_extensions); 631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgCreateMsgCallback( 661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData, 701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pNewDbgFuncNode = (VkLayerDbgFunctionNode *) malloc(sizeof(VkLayerDbgFunctionNode)); 731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!pNewDbgFuncNode) 741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_OUT_OF_HOST_MEMORY; 751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 768afefb5096305216b66a6e18ff653fde6f1f908aCourtney Goeltzenleuchter struct loader_instance *inst = loader_instance(instance); 77b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult result = inst->disp->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback); 791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (result == VK_SUCCESS) { 801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgCallback = *pMsgCallback; 811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback; 821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgFlags = msgFlags; 831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pUserData = pUserData; 841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pNext = inst->DbgFunctionHead; 851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pNewDbgFuncNode; 861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } else { 871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter free(pNewDbgFuncNode); 881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 89b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 911c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 921c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgDestroyMsgCallback( 941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback msg_callback) 961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 978afefb5096305216b66a6e18ff653fde6f1f908aCourtney Goeltzenleuchter struct loader_instance *inst = loader_instance(instance); 98b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pTrav = inst->DbgFunctionHead; 1001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pPrev = pTrav; 1011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1023d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter VkResult result = inst->disp->DbgDestroyMsgCallback(instance, msg_callback); 1031c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter while (pTrav) { 1051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (pTrav->msgCallback == msg_callback) { 1061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev->pNext = pTrav->pNext; 1071c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst->DbgFunctionHead == pTrav) 1081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pTrav->pNext; 1091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter free(pTrav); 1101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev = pTrav; 1131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pTrav = pTrav->pNext; 1141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 116b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 1171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 1181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 1191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 1221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * This is the instance chain terminator function 1231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * for DbgCreateMsgCallback 1241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 1251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney GoeltzenleuchterVkResult loader_DbgCreateMsgCallback( 1261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 1281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 1291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const void* pUserData, 1301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 1311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 1321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback *icd_info; 1331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const struct loader_icd *icd; 1341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *inst; 1351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult res; 1361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t storage_idx; 1371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (instance == VK_NULL_HANDLE) 1391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 1401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (inst = loader.instances; inst; inst = inst->next) { 1421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 1431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst == VK_NULL_HANDLE) 1471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 1481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info = calloc(sizeof(VkDbgMsgCallback), inst->total_icd_count); 1501c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!icd_info) { 1511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_OUT_OF_HOST_MEMORY; 1521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 1551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 1561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!icd->DbgCreateMsgCallback) { 1571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter continue; 1581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1601c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter res = icd->DbgCreateMsgCallback( 1611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->instance, 1621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter msgFlags, 1631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pfnMsgCallback, 1641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pUserData, 1651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter &icd_info[storage_idx]); 1661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (res != VK_SUCCESS) { 1681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 1711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter /* roll back on errors */ 1741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd) { 1751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 1761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 1771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd_info[storage_idx]) { 1781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->DbgDestroyMsgCallback( 1791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->instance, 1801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info[storage_idx]); 1811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 1831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return res; 1861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter *pMsgCallback = (VkDbgMsgCallback) icd_info; 1891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_SUCCESS; 1911c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 1921c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 1941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * This is the instance chain terminator function 1951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * for DbgDestroyMsgCallback 1961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 1971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney GoeltzenleuchterVkResult loader_DbgDestroyMsgCallback( 1981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback msgCallback) 2001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 2011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t storage_idx; 2021c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback *icd_info; 2031c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const struct loader_icd *icd; 2041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult res = VK_SUCCESS; 2051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *inst; 2061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2071c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (instance == VK_NULL_HANDLE) 2081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 2091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (inst = loader.instances; inst; inst = inst->next) { 2111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 2121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 2131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst == VK_NULL_HANDLE) 2161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_INVALID_HANDLE; 2171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info = (VkDbgMsgCallback *) msgCallback; 2191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 2201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 2211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (icd_info[storage_idx]) { 2221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->DbgDestroyMsgCallback( 2233d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter icd->instance, 2241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info[storage_idx]); 2251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 2271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return res; 2291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 231f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchterstatic void print_msg_flags(VkFlags msgFlags, char *msg_flags) 232f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter{ 233f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter bool separator = false; 234f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 235f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter msg_flags[0] = 0; 236f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_DEBUG_BIT) { 237f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "DEBUG"); 238f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 239f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 240f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_INFO_BIT) { 241f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 242f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "INFO"); 243f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 244f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 245f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_WARN_BIT) { 246f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 247f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "WARN"); 248f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 249f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 250f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_PERF_WARN_BIT) { 251f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 252f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "PERF"); 253f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 254f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 255f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_ERROR_BIT) { 256f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 257f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "ERROR"); 258f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 259f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter} 260f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 2611c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter// DebugReport utility callback functions 2621c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StringCallback( 2631c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 2641c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 2651c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 2661c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 2671c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 2681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 2691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 2701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 2711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 272cab27b346f70b65b3fa53ddc8abce3a515c1e79bJon Ashburn size_t buf_size; 273f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char *buf; 274f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char msg_flags[30]; 275f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter PFN_stringCallback callback = (PFN_stringCallback) pUserData; 276f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 277f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter print_msg_flags(msgFlags, msg_flags); 278f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 279f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter buf_size = strlen(msg_flags) + /* ReportFlags: i.e. (DEBUG,INFO,WARN,PERF,ERROR) */ 280f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* objType */ 281f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* srcObject */ 282f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* location */ 283f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* msgCode */ 284f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strlen(pLayerPrefix) + 285f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strlen(pMsg) + 286f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 50 /* other / whitespace */; 2876969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#ifdef WIN32 2886969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour buf = _alloca(buf_size); 2896969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#else 290f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter buf = alloca(buf_size); 2916969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#endif 292f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter snprintf(buf, buf_size, "%s (%s): object: 0x%" PRIxLEAST64 " type: %d location: %zu msgCode: %d: %s", 293f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter pLayerPrefix, msg_flags, srcObject, objType, location, msgCode, pMsg); 294f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter callback(buf); 2951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StdioCallback( 2981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 2991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 3001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 3011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 3021c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 3031c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 3041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 3051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 3061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 307f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char msg_flags[30]; 308f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 309f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter print_msg_flags(msgFlags, msg_flags); 3101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 311f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter fprintf((FILE *) pUserData, "%s(%s): object: 0x%" PRIxLEAST64 " type: %d location: %zu msgCode: %d: %s", 312f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter pLayerPrefix, msg_flags, srcObject, objType, location, msgCode, pMsg); 3131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 3141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI BreakCallback( 3161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 3171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObjectType objType, 3181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkObject srcObject, 3191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 3201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 3211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 3221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 3231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 3241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 3251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 3271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid *debug_report_instance_gpa( 3291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *ptr_instance, 3301c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* name) 3311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 3321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (ptr_instance == VK_NULL_HANDLE || !ptr_instance->debug_report_enabled) 3331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return NULL; 3341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3351c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!strcmp("vkDbgCreateMsgCallback", name)) 3361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) debug_report_DbgCreateMsgCallback; 3371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter else if (!strcmp("vkDbgDestroyMsgCallback", name)) 3381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) debug_report_DbgDestroyMsgCallback; 339b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgStringCallback", name)) 3401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) StringCallback; 341b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgStdioCallback", name)) 3421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) StdioCallback; 343b843f0b3ae07f177b4eef3391e971f5e9135bd5cJon Ashburn else if (!strcmp("vkDbgBreakCallback", name)) 3441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return (void *) BreakCallback; 3451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return NULL; 3471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 348