在 Vulkan 中,VkResult 是一个非常核心的枚举类型(Enumeration),专门用来作为绝大多数 Vulkan 函数的返回值。
因为 Vulkan 是一个极度显式的低级 API,驱动程序内部几乎不会帮你做任何隐式错误处理,也不会抛出 C++ 异常。任何一个操作(比如创建对象、分配显存、提交命令)成功与否,都必须通过 VkResult 显式地反馈给开发者。
VkResult 的两大分类#
VkResult 的枚举值主要分为两大阵营:成功/状态码(Success/Status Codes) 和 错误码(Error Codes)。
核心成功码(通常 ≥ 0)#
这些值代表函数不仅成功执行,还可能带回了一些运行时状态信息:
VK_SUCCESS(0): 最完美的情况,函数成功执行且没有发生任何意外。VK_NOT_READY: 一个围栏(Fence)或查询还没有完成。VK_TIMEOUT: 某个等待操作(比如等待一个信号量或围栏)在指定时间内没有完成。VK_INCOMPLETE: 缓冲区太小,无法返回所有请求的结果(例如获取交换链图像时,提供的数组长度不够,只返回了一部分)。
核心错误码(通常 < 0)#
这些值代表操作彻底失败。由于 Vulkan 遵循 RAII(资源获取即初始化)和严苛的显式内存管理,很多错误都直接指向内存和驱动底层:
VK_ERROR_OUT_OF_HOST_MEMORY: CPU 端(主机)内存不足,无法完成分配。VK_ERROR_OUT_OF_DEVICE_MEMORY: GPU 端(设备)显存不足。这是开发中非常需要警惕的错误,通常需要你重新规划VkDeviceMemory的分配策略。VK_ERROR_INITIALIZATION_FAILED: 初始化失败,通常是因为显卡驱动不支持 Vulkan 或者是某些层(Validation Layers)没找对。VK_ERROR_DEVICE_LOST: 极其致命的错误。GPU 挂起了、掉线了、或者因为耗时过长被操作系统强制重置了(TDR)。VK_ERROR_OUT_OF_DATE_KHR: 交换链(Swapchain)特有错误。当窗口大小改变(比如用户拖动了窗口)或者屏幕旋转时,原有的交换链图像与当前的 Surface(表面)不再匹配,必须重建交换链。
总结#
把 VkResult 看作是 Vulkan 驱动与你的 C++ 代码之间沟通的“体检报告”。通过它,你能第一时间抓到是 CPU 内存爆了、GPU 显存穿了、还是用户偷偷拉大窗口了。
原文:VkResult