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