初始化viewportCount为0触发VUID校验错误,是否为验证层漏洞?
问题描述
我在VkPipelineViewportStateCreateInfo中将viewportCount和scissorCount设为0,打算在渲染阶段用vkCmdSetViewport和vkCmdSetScissor动态设置,但触发了VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216校验错误。错误提示说当VkPhysicalDeviceFeatures::multiViewport特性未启用时,viewportCount必须不大于1,可我设的是0。这是验证层有漏洞还是我理解错了规则?
错误详情
[VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216] Object 0: handle = 0x5610e4b1ed80, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xe99671df | vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is disabled, but pCreateInfos[0].pViewportState->viewportCount (=0) is not 1. The Vulkan spec states: If the multiple viewports feature is not enabled, viewportCount must not be greater than 1
解答
- 这不是验证层漏洞,是对Vulkan规范细节的理解偏差。
- 规范提示的"不大于1"存在表述歧义,实际约束更严格:当
multiViewport未启用时,viewportCount的合法值必须为1,而非0或1。- Vulkan管线创建时要求所有状态都有合法的初始值,即便后续会用动态命令修改。设为0意味着管线没有初始视口状态,不符合状态完整性要求。
- 解决办法:将
viewportCount和scissorCount设为1,传入一个默认的视口与裁剪矩形(比如覆盖整个交换链图像),后续再用vkCmdSetViewport/vkCmdSetScissor动态替换即可。这样既符合验证层要求,也不会影响动态设置的逻辑。
内容的提问来源于stack exchange,提问作者David Carpenter

