首页 > 其他分享 >【Vulkan入门】04-开启Debug输出

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

时间:2024-12-05 09:57:55浏览次数:10  
标签:vkCreateDebugUtilsMessengerEXT 04 DebugUtilsMessenger Instance VulkanEnv Debug V

目录

先叨叨

上篇为止我们已经作了很多事情了。建立了Instance、挑选了物理设备、建立的Device和Queue。
之前做的都是相对简单和线性的工作,只要认真对照说明文档和实例代码基本上不会出现错误。我之前的Leader说过一句话我很认同,程序是调出来的
因此为了今后更好的发现和解决程序的问题,需要让Vulkan为我们输出一些内部的Debug信息。本篇就来介绍如何接收Vulkan内部的Debug信息。

git信息

  • repository: https://gitee.com/J8_series/easy-car-ui
  • tag: 04-05-EnableDebugAndValidation
  • url: https://gitee.com/J8_series/easy-car-ui/tree/04-05-EnableDebugAndValidation

关键代码和主要API

VulkanEnv::SetDebugUtilMessenger()

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

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对象。

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

题外话

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

标签:vkCreateDebugUtilsMessengerEXT,04,DebugUtilsMessenger,Instance,VulkanEnv,Debug,V
From: https://blog.csdn.net/patronwa/article/details/144255669

相关文章

  • 【2024-12-04】治疗牙齿
    20:00我这一辈子什么都经历了,但我依然很乐观。喜怒哀乐,去经历就好了。能做啥就继续做啥,高高兴兴,这样心情就会很痛快。                                                 ......
  • 【Vulkan入门】05-开启Vulkan的validation
    目录先叨叨关键函数和APIVulkanEnv::GetAllSupportedLayers()VulkanEnv::CreateVkInstance()运行代码先叨叨Vulkan为了尽量提高执行效率,因此所有API对传入的参数没有作任何校验。即使传错了参数也会继续执行,对错误参数会造成的后果不做任何定义。不过Vulkan也提供......
  • 20241204: 2056. 棋盘上有效移动组合的数目
    有一个 8x8 的棋盘,它包含 n 个棋子(棋子包括车,后和象三种)。给你一个长度为 n 的字符串数组 pieces ,其中 pieces[i] 表示第 i 个棋子的类型(车,后或象)。除此以外,还给你一个长度为 n 的二维整数数组 positions ,其中 positions[i]=[ri,ci] 表示第 i 个棋子现在......
  • 1204- 链表的中间节点
    链表的中间节点leetcode876题目大意:给定一个链表,找到其中间的节点,如果中间是两个就找到后一个节点解题思路:设定两个链表指针,第一个指向head,第二个指向第一个的下两个节点,这样始终会比第一个快2倍,也就形成了切割,如果说第二个节点的next或者第二个节点为空了就说明走到末尾了,此......
  • 洛谷刷题之p1048
    [NOIP2005普及组]采药题目入口题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株......
  • 12.04 CW 模拟赛 T2.树的链接
    算法全都想到了,不会读入和\(\rm{LCA}\)直接把赛时记录的拉过来对于\(50\%\)的数据点,直接输出\(-1\)即可前\(20\%\)直接预处理即可注意到一个很强的性质,即保证在此之前在城市\(x\)与\(y\)之间不存在任何路径也就是说每次连边都是加入割边,最终的图一......
  • 【每日一题】20241204
    【每日一题】若集合\(A=\{x\mid\log_{\frac12}x\geq\frac12\}\),\(B=\{x\mid\frac{(1-x)^3}{(x+1)^2}>0\}\),则\(\complement_BA=\)___________.在平面直角坐标系\(xOy\)中,圆\(C\)的方程为\(x^2+y^2-8x+15=0\),若直线\(y=kx-2\)上至少存在一点,使得以该点......
  • 20222404 2024-2025-1 《网络与系统攻防技术》实验七实验报告
    1.实验内容总结一下本周学习内容,不要复制粘贴2.实验过程2.1简单应用SET工具建立冒名网站攻击机:kaii192.168.47.141靶机:windowsxp192.168.47.1452.1.1查看apache工具的默认端口,发现是80端口,于是就不用修改了查看本机的80端口是否被其他进程占用。netstat-tupln|gre......
  • SM2604弹窗-layui
    1、添加路径SM2604,/layui-v2.2.5/layui.js 放在PU脚本集合中的第1个  2、layui.use(['layer','form'],function(){varform=layui.form;varlayer=layui.layer;$=layui.jquery;$("#btn_val_CPMC").click(function(){varsql="sel......
  • Task 03&04
    Task03数据类型与操作在了解数据类型之前,有必要先了解字面量1.1.字面量(Literal)字面量是指在程序中直接写出的固定值。在程序运行中不会改变,如数字,字符串,布尔值等。#数字字⾯量103.14#字符串字⾯量"HelloWorld!"#布尔字⾯量True1.2.数据类型(DataTypes)数据类......