【Vulkan入门】04-开启Debug输出

目录

先叨叨

到上篇为止我们已经作了很多事情了。建立了Instance、挑选了物理设备、建立的Device和Queue。

之前做的都是相对简单和线性的工作,只要认真对照说明文档和实例代码基本上不会出现错误。我之前的Leader说过一句话我很认同,程序是调出来的 。

因此为了今后更好的发现和解决程序的问题,需要让Vulkan为我们输出一些内部的Debug信息。本篇就来介绍如何接收Vulkan内部的Debug信息。

git信息

关键代码和主要API

VulkanEnv::SetDebugUtilMessenger()

本方法调用vkCreateDebugUtilsMessengerEXT接口创建一个DebugUtilsMessenger,而在DebugUtilsMessenger中可以指定一个回调函数,当Vulkan内参生Debug信息时,便会调用这个回调通知APP。

cpp 复制代码
void VulkanEnv::SetDebugUtilMessenger()
{
    if (false == m_enableDebug)
    {
        return;
    }

    //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#vkGetInstanceProcAddr
    auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(m_vkInstance, "vkCreateDebugUtilsMessengerEXT");
    if (nullptr == func)
    {
        return;
    }

    if (func(m_vkInstance, &m_debugUtilsMessengerCreateInfo, nullptr, &m_debugUtilsMessenger) != VK_SUCCESS) {
        throw std::runtime_error("failed to set up debug messenger!");
    }
}

这里要注意一个问题,我们安装的vulkan的SDK并没有帮助我们实现vkCreateDebugUtilsMessengerEXT接口。因此我们需要自己调用vkGetInstanceProcAddr接口向Vulkan要vkCreateDebugUtilsMessengerEXT的函数地址。如果使用过OpenGL,对这种形式应该不会陌生。
除了DebugUtilsMessenger之外,Vulkan还可以提供DebugReportCallback机制接收Debug信息。 DebugReportCallback通过vkCreateDebugReportCallbackEXT来创建。

VulkanEnv::CreateVkInstance()

通过vkCreateDebugUtilsMessengerEXT的第一个参数是Instance,这也限制了DebugUtilsMessenger必须在创建Instance之后调用。

这会导致一个问题创建Instance时的Debug信息无法获取,解决办法是让VkInstanceCreateInfo的pNext属性,指向一个VkDebugUtilsMessengerCreateInfoEXT对象。

cpp 复制代码
void VulkanEnv::CreateVkInstance()
{
...
	VkInstanceCreateInfo createInfo{};
...
    if (true == m_enableDebug)
    {
        createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &m_debugUtilsMessengerCreateInfo;
    }
...
}

题外话

创建出来的对象不要忘记在析构函数中释放!

相关推荐
李纲明11 天前
WordPress 白屏或提示「出现了严重错误」:先开 WP_DEBUG 抓致命错误,再二分插件与主题
运维·php·debug·wordpress·白屏·插件冲突·devdiy
Vex2une17 天前
异构双卡渲染避坑指南:AMD+NVIDIA混合架构下的DLSS 5适配与性能调优实战
nvidia·amd·vulkan·ai渲染·dlss5·异构双卡·dx12
蒸鱼Yuzheng1 个月前
Shader 指令成本回归:离线编译、设备权重与误报控制
ci/cd·性能优化·gpu·shader·vulkan
蒸鱼Yuzheng1 个月前
RenderDoc 跨版本回放治理:驱动、API、资源与兼容性矩阵
数据治理·gpu·兼容性测试·vulkan·renderdoc
饭来_1 个月前
Ubuntu 中出现 CondaToSNonInteractiveError 的解决方法
ubuntu·conda·debug
天天代码码天天1 个月前
C# + Vulkan 部署 APISR 动漫超分辨率:VS2022 直接编译,附 ONNX Runtime GPU 耗时与显存对比
vulkan·动漫超分辨率
DeeplyMind1 个月前
XDC2026: Vulkan Gallium(代号 “Shiva”)技术报告
vulkan·xdc2026·shiva
Z_Quintaz2 个月前
关于导航栏颜色透明这件事
前端·debug
InsightCore2 个月前
别再往 Skill 里塞一切:我们如何重新思考 AI Debug Engineer
android·debug
zhuodedao2 个月前
Spring AI + MCP 文件工具未调用问题复盘:为什么初始化成功却没有写入文件?
java·debug·agent·springai·mcp