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