Search Issue Tracker

Duplicate

Votes

1

Found in

2020.3

2020.3.24f1

2021.2

2022.1

2022.2

Issue ID

1393378

Regression

No

IUnityGraphicsVulkan::InterceptInitialization() stops working after OpenXR is installed and is not supported by multiple plugins

OpenXR

-

Reproduction steps:
1. Open the user's attached project "AndroidVulkanInterceptInitializationRepro.zip"
2. Make sure OpenXR is uninstalled from the project
3. Build for Quest 1/2 and check Android Logcat for "InterceptVulkanInitialization called"
4. Install OpenXR
5. Build for Quest 1/2 and check Android Logcat for "InterceptVulkanInitialization called"

Expected result: IUnityGraphicsVulkan::InterceptInitialization() is called after installing OpenXR and can be supported by multiple plugins
Actual result: IUnityGraphicsVulkan::InterceptInitialization() stops working after OpenXR is installed and is not supported by multiple plugins

Reproduces on: 2020.3.31f1, 2021.2.15f1, 2022.1.0b11, 2022.2.0a6
Could not test on 2019.4.36f1 since OpenXR is not available

  1. Resolution Note (2020.3.X):

    Latest versions of IUnityGraphicsVulkan.h have a new IUnityGraphicsVulkan2 interface to solve this problem:

    // Vulkan API hooks
    //
    // Must be called before kUnityGfxDeviceEventInitialize (preload plugin)
    // Unity will call 'func' when initializing the Vulkan API
    // The 'getInstanceProcAddr' passed to the callback is the function pointer from the Vulkan Loader
    // The function pointer returned from UnityVulkanInitCallback may be a different implementation
    // This allows intercepting all Vulkan API calls
    // The priority is used to sort multiple callbacks such that the highest priority will be called last
    // with the original Vulkan loader implementation of vkGetInstanceProcAddress passed in as 'getInstanceProcAddr'.
    // A priority value of `kUnityVulkanInitCallbackMaxPriority` is used to force a callback to be called immediately before
    // the original Vulkan loader implementation of `vkGetInstanceProcAddress`. Only one callback can be registered with a
    // priority of `kUnityVulkanInitCallbackMaxPriority`, if one already exists it will be replaced.
    // Passing a priority value of `kUnityVulkanInitCallbackMaxPriority` is equivalent to calling the `InterceptInitialization` method.
    //
    // Most rules/restrictions for implementing a Vulkan layer apply
    // Returns true on success, false on failure (typically because it is used too late)
    bool(UNITY_INTERFACE_API * AddInterceptInitialization)(UnityVulkanInitCallback func, void* userdata, int32_t priority);
    // Remove vulkan intercept initialization callback.

    // Removal will not take effect until the next time vulkan is initialized.
    bool(UNITY_INTERFACE_API * RemoveInterceptInitialization)(UnityVulkanInitCallback func);

    This shipped in 2022.1.0a7, 2021.2.0b9, 2020.3.17f1 (~August - September 2021 timeframe)

Add comment

Log in to post comment