C++ 为什么openxr';xrCreateSession';导致了许多vulkan“;SPIR-V模块无效:";验证错误(以及如何修复它)?
C++ 为什么openxr';xrCreateSession';导致了许多vulkan“;SPIR-V模块无效:";验证错误(以及如何修复它)?,c++,vulkan,openxr,C++,Vulkan,Openxr,xrCreateSession接受XrInstance和XrSessionCreateInfo 用于创建实例的XrInstanceCreateInfo并不特别有趣:唯一值得注意的参数是enabledExtensionCount(=1)和enabledExtensionNames(=XR_KHR_VULKAN_ENABLE_EXTENSION_NAME)。其余为任意标题/版本信息 用于创建会话的XRSessionCreateInfo将systemId设置为xrGetSystem的结果,并将next
xrCreateSession
接受XrInstance
和XrSessionCreateInfo
用于创建实例的XrInstanceCreateInfo
并不特别有趣:唯一值得注意的参数是enabledExtensionCount
(=1
)和enabledExtensionNames
(=XR_KHR_VULKAN_ENABLE_EXTENSION_NAME
)。其余为任意标题/版本信息
用于创建会话的XRSessionCreateInfo
将systemId
设置为xrGetSystem
的结果,并将next
设置为XrGraphicsBindingVulkanKHR
类型的指针
它的值只指向vulkan实例、physicalDevice、device、queueFamilyIndex和queueIndex,我有理由相信我收集的数据是正确的(没有openXR,vulkan工作正常)
但是第二个xrCreateSession
被调用,我得到大约20个以下形式的验证错误:
Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x24341691190, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: Header block 512[%512] is contained in the loop construct headed by 505[%505], but its merge block 513[%513] is not
%512 = OpLabel
(标题栏、标题栏、合并栏等编号不同。)
目前我还没有向vulkan和openXR提供任何SPIR-V,所以我不确定我能控制什么
为什么我会犯这些错误?可以采取什么措施来防止它们?我不确定,但我猜测XR的实现需要在以后的调用中调用着色器,并在
xrCreateSession
期间加载这些着色器。因此,如果这些着色器模块在某种程度上无效,您将在xrCreateSession期间看到验证错误。如果从调试消息回调中获得堆栈跟踪,并且堆栈上有xrCreateSession
,我会向OpenXR供应商报告一个错误。这也可能是由隐式Vulkan层引起的。有各种各样的工具和应用程序安装隐式加载的Vulkan层,这些工具和应用程序也会触发验证层错误。在Windows上,您可以在计算机\HKEY\U LOCAL\U MACHINE\SOFTWARE\Khronos\Vulkan\ImplicitLayers注册表项中禁用它们,方法是将它们的值设置为1或简单地重命名整个注册表项。如果验证层错误消失,那么它就是其中一个隐式层。我不确定,但我猜测XR的实现需要在以后的调用中调用着色器,并在xrCreateSession
期间加载这些着色器。因此,如果这些着色器模块在某种程度上无效,您将在xrCreateSession期间看到验证错误。如果从调试消息回调中获得堆栈跟踪,并且堆栈上有xrCreateSession
,我会向OpenXR供应商报告一个错误。这也可能是由隐式Vulkan层引起的。有各种各样的工具和应用程序安装隐式加载的Vulkan层,这些工具和应用程序也会触发验证层错误。在Windows上,您可以在计算机\HKEY\U LOCAL\U MACHINE\SOFTWARE\Khronos\Vulkan\ImplicitLayers注册表项中禁用它们,方法是将它们的值设置为1或简单地重命名整个注册表项。如果验证层错误消失,那么它就是其中一个隐式层。