调用vkCmdBeginRendering触发访问违例的问题排查求助
Vulkan动态渲染
vkCmdBeginRendering空深度附件指针崩溃问题分析 问题背景
我正在开发一个延迟渲染器,尝试用动态渲染实现光照阶段(表述虽不精准但意思明确),相关代码如下:
VkRenderingAttachmentInfo color_attachment_0 = {}; color_attachment_0.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; color_attachment_0.imageView = _lit_image->vk_view; color_attachment_0.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; color_attachment_0.resolveMode = VK_RESOLVE_MODE_NONE; color_attachment_0.resolveImageView = VK_NULL_HANDLE; color_attachment_0.resolveImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; color_attachment_0.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; color_attachment_0.storeOp = VK_ATTACHMENT_STORE_OP_STORE; color_attachment_0.clearValue.color.float32[0] = 0.0f; color_attachment_0.clearValue.color.float32[1] = 0.0f; color_attachment_0.clearValue.color.float32[2] = 0.0f; color_attachment_0.clearValue.color.float32[3] = 1.0f; VkRenderingInfo pass_begin = {}; pass_begin.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; pass_begin.renderArea = { { 0, 0 }, { window_width, window_height } }; pass_begin.layerCount = 1; pass_begin.viewMask = 0; pass_begin.colorAttachmentCount = 1; pass_begin.pColorAttachments = &color_attachment_0; pass_begin.pDepthAttachment = VK_NULL_HANDLE; pass_begin.pStencilAttachment = VK_NULL_HANDLE; vkCmdBeginRendering(cmd_buf->vk_command_buffer, &pass_begin); // bind pipeline // ... vkCmdEndRendering();
执行vkCmdBeginRendering时,Visual Studio调试器抛出异常0xC0000005: Access violation reading location 0x0000000000000068,但Vulkan验证层未给出任何错误提示。
已确认_lit_image->vk_view句柄有效,代码中所有指针/对象均未失效;光照阶段前的G-pass已通过动态渲染完成且G缓冲显示正常,排除vkCmdBeginRendering函数指针异常的可能。将pDepthAttachment指向一个有效深度附件后,崩溃消失,需明确空深度附件指针引发崩溃的原因。
可能原因
- 管线与渲染信息不匹配:光照阶段绑定的管线可能启用了深度测试/深度写入,但动态渲染开始时未提供深度附件。尽管Vulkan规范允许
pDepthAttachment为VK_NULL_HANDLE(当管线不依赖深度/模板时),但如果管线状态要求深度附件,驱动尝试访问不存在的深度资源就会触发访问违例。验证层可能在这种动态渲染的状态组合校验上存在疏漏,未检测到问题。 - 驱动实现缺陷:部分Vulkan驱动对动态渲染的空深度/模板附件处理存在bug。有些驱动会默认假设只要管线包含深度/模板状态,
pDepthAttachment就必须非空——即便规范允许空值,这种情况下驱动会尝试访问空指针的偏移地址(0x68是VkRenderingAttachmentInfo结构体中某个成员的偏移量),直接引发崩溃。 - 结构体隐含状态处理异常:虽然用
{}初始化了VkRenderingInfo,但某些驱动可能对未显式声明的隐含状态处理出错。不过你已经明确设置pDepthAttachment为VK_NULL_HANDLE,这种可能性相对较低。
解决建议
- 检查管线配置:确认光照阶段的管线是否确实不需要深度附件。如果管线启用了深度相关状态,要么提供有效深度附件,要么修改管线禁用深度测试/写入。
- 升级显卡驱动:这类驱动层面的bug通常会在新版本中修复,尝试更新到最新版GPU驱动。
- 显式初始化所有字段:确保
VkRenderingInfo的所有相关字段都被明确设置,避免驱动因未初始化字段产生异常逻辑。
内容的提问来源于Stack Exchange,提问作者Achihab Halib
相关产品推荐
相关产品推荐

