debug_report.c revision 0c5eea212afbc79a63f75ea5fab2526998a26e74
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 29b620ace53373bb2803db70005dee39be9c184f06Courtney Goeltzenleuchter#define _GNU_SOURCE 30f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter#include <stdio.h> 311c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <string.h> 321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include <stdlib.h> 33f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter#include <inttypes.h> 346969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#ifndef WIN32 35c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter#include <signal.h> 36c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter#else 376969851e9b282a032d0b60021a60bd6e50db7591Tony Barbour#endif 386fb9a531b82cc9e3c603486f70ef9f60e617c3aaJon Ashburn#include "vk_loader_platform.h" 391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter#include "debug_report.h" 402d1d970ee5517436a87be5159ded60d9d18c089cTobin Ehlis#include "vk_layer.h" 411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 42f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchtertypedef void (VKAPI *PFN_stringCallback)(char *message); 43f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 44c4748dc128c1449212884a15f67faeb616fd1f3bJon Ashburnstatic const VkExtensionProperties debug_report_extension_info = { 45846298c67f02628ed8a93f0438aa079dfea8541bCourtney Goeltzenleuchter .extName = VK_DEBUG_REPORT_EXTENSION_NAME, 46d5b6e890d23a20280a2bed4a5358db1d8fafb74bIan Elliott .specVersion = VK_DEBUG_REPORT_EXTENSION_REVISION, 471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter}; 481c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 491c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_add_instance_extensions( 50e58f1a382f472101f92b7aca05ac28e972736a53Jon Ashburn const struct loader_instance *inst, 511c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_extension_list *ext_list) 521c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 53e58f1a382f472101f92b7aca05ac28e972736a53Jon Ashburn loader_add_to_ext_list(inst, ext_list, 1, &debug_report_extension_info); 541c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchtervoid debug_report_create_instance( 5718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter struct loader_instance *ptr_instance, 5818061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter const VkInstanceCreateInfo *pCreateInfo) 591c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 6018061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ptr_instance->debug_report_enabled = false; 6118061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter 6218061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter for (uint32_t i = 0; i < pCreateInfo->extensionCount; i++) { 63846298c67f02628ed8a93f0438aa079dfea8541bCourtney Goeltzenleuchter if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_DEBUG_REPORT_EXTENSION_NAME) == 0) { 6418061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter ptr_instance->debug_report_enabled = true; 6518061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter return; 6618061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 6718061cdee54b19cd628178d2924a7a914c62a10bCourtney Goeltzenleuchter } 681c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 691c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 701c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgCreateMsgCallback( 711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData, 751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 77e58f1a382f472101f92b7aca05ac28e972736a53Jon Ashburn VkLayerDbgFunctionNode *pNewDbgFuncNode = (VkLayerDbgFunctionNode *) loader_heap_alloc((struct loader_instance *)instance, sizeof(VkLayerDbgFunctionNode), VK_SYSTEM_ALLOC_TYPE_INTERNAL); 781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (!pNewDbgFuncNode) 791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return VK_ERROR_OUT_OF_HOST_MEMORY; 801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 810c5eea212afbc79a63f75ea5fab2526998a26e74Jon Ashburn struct loader_instance *inst = loader_get_instance(instance); 82b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult result = inst->disp->DbgCreateMsgCallback(instance, msgFlags, pfnMsgCallback, pUserData, pMsgCallback); 841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (result == VK_SUCCESS) { 851c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgCallback = *pMsgCallback; 861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pfnMsgCallback = pfnMsgCallback; 871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->msgFlags = msgFlags; 881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pUserData = pUserData; 891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pNewDbgFuncNode->pNext = inst->DbgFunctionHead; 901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pNewDbgFuncNode; 911c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } else { 92e58f1a382f472101f92b7aca05ac28e972736a53Jon Ashburn loader_heap_free((struct loader_instance *) instance, pNewDbgFuncNode); 931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 94b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkResult debug_report_DbgDestroyMsgCallback( 991c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback msg_callback) 1011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 1020c5eea212afbc79a63f75ea5fab2526998a26e74Jon Ashburn struct loader_instance *inst = loader_get_instance(instance); 103b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_lock_mutex(&loader_lock); 1041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pTrav = inst->DbgFunctionHead; 1051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkLayerDbgFunctionNode *pPrev = pTrav; 1061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1073d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter VkResult result = inst->disp->DbgDestroyMsgCallback(instance, msg_callback); 1081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter while (pTrav) { 110de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour if (pTrav->msgCallback.handle == msg_callback.handle) { 1111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev->pNext = pTrav->pNext; 1121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if (inst->DbgFunctionHead == pTrav) 1131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter inst->DbgFunctionHead = pTrav->pNext; 114e58f1a382f472101f92b7aca05ac28e972736a53Jon Ashburn loader_heap_free((struct loader_instance *) instance, pTrav); 1151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1171c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pPrev = pTrav; 1181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter pTrav = pTrav->pNext; 1191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 1201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 121b40f2568bff91895d66848767fdaa540793b5162Jon Ashburn loader_platform_thread_unlock_mutex(&loader_lock); 1221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return result; 1231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 1241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1251c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1261c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter/* 1271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * This is the instance chain terminator function 1281c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter * for DbgCreateMsgCallback 1291c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter */ 130de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour 131f99e410907e8b75ea09ecb2c90c2a093171efa6fDan GinsburgVkResult VKAPI loader_DbgCreateMsgCallback( 1321c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkInstance instance, 1331c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 1341c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const PFN_vkDbgMsgCallback pfnMsgCallback, 135f9136f4fc0e16231352dccfb48d87eefefc85eceJon Ashburn void* pUserData, 1361c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback* pMsgCallback) 1371c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 1381c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkDbgMsgCallback *icd_info; 1391c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const struct loader_icd *icd; 1401c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *inst; 1411c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkResult res; 1421c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter uint32_t storage_idx; 1431c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 1441c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (inst = loader.instances; inst; inst = inst->next) { 1451c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 1461c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 1471c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 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) { 177de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour if (icd_info[storage_idx].handle) { 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 188de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour *(VkDbgMsgCallback **)pMsgCallback = 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 */ 197f99e410907e8b75ea09ecb2c90c2a093171efa6fDan GinsburgVkResult VKAPI 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 for (inst = loader.instances; inst; inst = inst->next) { 2081c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter if ((VkInstance) inst == instance) 2091c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter break; 2101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 212de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour icd_info = *(VkDbgMsgCallback **) &msgCallback; 2131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx = 0; 2141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter for (icd = inst->icds; icd; icd = icd->next) { 215de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour if (icd_info[storage_idx].handle) { 2161c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd->DbgDestroyMsgCallback( 2173d8dc1f0b7082672757a92ddb7f5a35be6ea6be3Courtney Goeltzenleuchter icd->instance, 2181c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter icd_info[storage_idx]); 2191c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2201c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter storage_idx++; 2211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter } 2221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter return res; 2231c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 225f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchterstatic void print_msg_flags(VkFlags msgFlags, char *msg_flags) 226f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter{ 227f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter bool separator = false; 228f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 229f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter msg_flags[0] = 0; 230f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_DEBUG_BIT) { 231f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "DEBUG"); 232f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 233f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 234f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_INFO_BIT) { 235f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 236f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "INFO"); 237f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 238f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 239f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_WARN_BIT) { 240f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 241f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "WARN"); 242f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 243f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 244f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_PERF_WARN_BIT) { 245f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 246f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "PERF"); 247f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter separator = true; 248f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 249f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (msgFlags & VK_DBG_REPORT_ERROR_BIT) { 250f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter if (separator) strcat(msg_flags, ","); 251f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strcat(msg_flags, "ERROR"); 252f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter } 253f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter} 254f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 2551c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter// DebugReport utility callback functions 2561c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StringCallback( 2571c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 258de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour VkDbgObjectType objType, 259de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour uint64_t 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{ 266cab27b346f70b65b3fa53ddc8abce3a515c1e79bJon Ashburn size_t buf_size; 267f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char *buf; 268f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char msg_flags[30]; 269f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter PFN_stringCallback callback = (PFN_stringCallback) pUserData; 270f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 271f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter print_msg_flags(msgFlags, msg_flags); 272f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 273f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter buf_size = strlen(msg_flags) + /* ReportFlags: i.e. (DEBUG,INFO,WARN,PERF,ERROR) */ 274f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* objType */ 275f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* srcObject */ 276f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* location */ 277f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 20 + /* msgCode */ 278f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strlen(pLayerPrefix) + 279f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter strlen(pMsg) + 280f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 50 /* other / whitespace */; 281e5c4872e6a045563c513d41922278d460f20b1c1Jon Ashburn buf = loader_stack_alloc(buf_size); 282e5c4872e6a045563c513d41922278d460f20b1c1Jon Ashburn 283f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter snprintf(buf, buf_size, "%s (%s): object: 0x%" PRIxLEAST64 " type: %d location: %zu msgCode: %d: %s", 284f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter pLayerPrefix, msg_flags, srcObject, objType, location, msgCode, pMsg); 285f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter callback(buf); 2861c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 2871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 2881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI StdioCallback( 2891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 290de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour VkDbgObjectType objType, 291de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour uint64_t srcObject, 2921c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 2931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 2941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 2951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 2961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 2971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 298f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter char msg_flags[30]; 299f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter 300f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter print_msg_flags(msgFlags, msg_flags); 3011c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 302f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter fprintf((FILE *) pUserData, "%s(%s): object: 0x%" PRIxLEAST64 " type: %d location: %zu msgCode: %d: %s", 303f1eb24969343c029c23d3cd173784861c68d4cf9Courtney Goeltzenleuchter pLayerPrefix, msg_flags, srcObject, objType, location, msgCode, pMsg); 3041c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 3051c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 3061c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic void VKAPI BreakCallback( 3071c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter VkFlags msgFlags, 308de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour VkDbgObjectType objType, 309de4124da4233d201bf1d7326acf0e8bf53d5bee5Tony Barbour uint64_t srcObject, 3101c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter size_t location, 3111c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter int32_t msgCode, 3121c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pLayerPrefix, 3131c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter const char* pMsg, 3141c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter void* pUserData) 3151c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 316c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter#ifndef WIN32 317c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter raise(SIGTRAP); 318c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter#else 319c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter DebugBreak(); 320c3c1f01dd2e5e956f16e0943224d58b13ada5ea4Courtney Goeltzenleuchter#endif 3211c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 3221c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter 32305b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburnbool debug_report_instance_gpa( 3241c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter struct loader_instance *ptr_instance, 32505b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn const char* name, 32605b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn void **addr) 3271c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{ 32805b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = NULL; 32905b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (ptr_instance == VK_NULL_HANDLE) 33005b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return false; 33105b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn 33205b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (!strcmp("vkDbgCreateMsgCallback", name)) { 33305b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = ptr_instance->debug_report_enabled ? (void *) debug_report_DbgCreateMsgCallback : NULL; 33405b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return true; 33505b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn } 33605b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (!strcmp("vkDbgDestroyMsgCallback", name)) { 33705b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = ptr_instance->debug_report_enabled ? (void *) debug_report_DbgDestroyMsgCallback : NULL; 33805b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return true; 33905b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn } 34005b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (!strcmp("vkDbgStringCallback", name)) { 34105b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = ptr_instance->debug_report_enabled ? (void *) StringCallback : NULL; 34205b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return true; 34305b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn } 34405b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (!strcmp("vkDbgStdioCallback", name)) { 34505b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = ptr_instance->debug_report_enabled ? (void *) StdioCallback : NULL; 34605b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return true; 34705b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn } 34805b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn if (!strcmp("vkDbgBreakCallback", name)) { 34905b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn *addr = ptr_instance->debug_report_enabled ? (void *) BreakCallback : NULL; 35005b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return true; 35105b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn } 35205b4ec611004b014bc39851c5ef6ebf300a2f8cbJon Ashburn return false; 3531c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter} 354