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