-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GPU: OpenXR integration #10925
Comments
Agreed - in the nuclear case we can just add a property but it'd be nice to have a full list of what apps need to support VR with any given GPU API. We could maybe kill two birds with one stone by having an OpenXR sample at https://github.com/TheSpydog/SDL_gpu_examples, and developing a gpu-xr PR to support it. My only experience with XR right now is input, for #4464, so I dunno how much help I'll be. |
I've updated the issue with a full breakdown of the init process for every currently supported graphics API, turns out this will probably be a lot more involved than I originally thought. But should still be possible without exposing any raw GPU handles to the end user.
I might fork off SDL and SDL_gpu_examples at some point, to try to actually get some code down for this, unless someone gets to it before me |
I have started very early work on this here and here. Right now I have instance/system/session creation working on Vulkan with I have nothing visual to show yet, since I still gotta write the rest of the surrounding code in the example itself, and also write some swapchain related functions in SDL_gpu to let me render to the XR session swapchain. Only after that can I actually start working on cleaning this up to upstream. (which includes stuff like making the OpenXR loader dynamically loaded) I'm terrible with CMake, so forgive my dirty hacks and probable sins in the CMake patches to SDL 🥲 |
Is this still relevant today? I would be very interested in developing VR games next! |
I haven't worked on my fork in about a month or so, but I'm still interested in making this happen, I'm just very busy with other projects at the moment, feel free to contribute to my fork if you want to see this make progress. Right now it desperately needs a rebase |
After some hacking today, i managed to get us all the way to rendering to the swapchain (with some hacks/hardcoded values) big problem is that Monado's debug view is showing massive texture corruption (however the main simulated HMD's view is displaying correctly!) |
After taking a deep dive into the various graphics API init routines for OpenXR (and reading the entire core specification front to back), I think the only way to make this work cleanly and according to the OpenXR spec is if SDL fully wrapped the creation of your OpenXR Instance, System, and Session into the same function call that creates the
SDL_GPUDevice*
. There is just way too much intertwined with the core init code of the GPU device, since all the extensions tell you which GPU device/instance/adapter you must use for rendering with OpenXR.Along with this, there should likely be an
SDL_GPUCreateXrSwapchain
function, which picks the best format to use, and returns the created swapchain, and alsoSDL_GPUEnumerateXrSwapchainImages
, which returns theSDL_GPUTexture*
for every swapchain image in the swapchain you need to render to.The
SDL_GPUCreateXrSwapchain
function can probably be omitted if desired, by having anSDL_GPUGetXrSwapchainFormats
, which internally callsxrEnumerateSwapchainFormats
and returns all the ones SDL_GPU can render to.Init steps for each API
These are written from the perspective of SDL creating a GPU device from scratch (after it has determined which API it wants to use for VR)
XR_KHR_D3D11_enable
XR_KHR_D3D11_enable
extension enabled.xrGetD3D11GraphicsRequirementsKHR
with the created OpenXR instance and system to get the feature level and adapter to use when creating your D3D11 objects.next
ptr ofXrSessionCreateInfo
being aXrGraphicsBindingD3D11KHR
with the createdID3D11Device
SDL_GPUDevice*
as normalXR_KHR_D3D12_enable
XR_KHR_D3D12_enable
extension enabled.xrGetD3D12GraphicsRequirementsKHR
to get the minimum feature level and adapter to use.xrCreateSession
withXrSessionCreateInfo.next
pointing to aXrGraphicsBindingD3D12KHR
with the createdID3D12Device
andID3D12CommandQueue
SDL_GPUDevice*
as normalXR_KHR_metal_enable
XR_KHR_metal_enable
extension enabled.xrGetMetalGraphicsRequirementsKHR
to get theMTLDevice
to usenext
ptr ofXrSessionCreateInfo
pointing toXrGraphicsBindingMetalKHR
filled in with the created command queue.SDL_GPUDevice*
as normalNote about Vulkan
From what I can see, you probably need to support both the XR_KHR_vulkan_enable and XR_KHR_vulkan_enable2 extensions, as some runtimes may only support one or the other.
XR_KHR_vulkan_enable
XR_KHR_vulkan_enable
extension enabledxrGetVulkanGraphicsRequirementsKHR
to get the minimum/maximum Vulkan version supported by the OpenXR runtimexrGetVulkanInstanceExtensionsKHR
to get the instance extensions to enable when creating your VkInstancexrGetVulkanDeviceExtensionsKHR
to get the Vulkan device extensions to enable when creating yourVkDevice
xrGetVulkanGraphicsDeviceKHR
to get theVkPhysicalDevice
to useVkDevice
, pick a queue family+indexXrSessionCreateInfo.next
ptr pointing to aXrGraphicsBindingVulkanKHR
with the VkInstance, VkPhysicalDevice, VkDevice, queue family, and queue index to use.SDL_GPUDevice*
as normalXR_KHR_vulkan_enable2
XR_KHR_vulkan_enable2
extension enabled.xrGetVulkanGraphicsRequirements2KHR
to get the minimum/maximum Vulkan version supported by the OpenXR runtimexrCreateVulkanInstanceKHR
to create yourVkInstance
xrGetVulkanGraphicsDevice2KHR
to get theVkPhysicalDevice
to usexrCreateVulkanDeviceKHR
to create theVkDevice
to useXrSessionCreateInfo.next
ptr pointing to aXrGraphicsBindingVulkanKHR
with the VkInstance, VkPhysicalDevice, VkDevice, queue family, and queue indexSDL_GPUDevice*
as normalBrief summary of the handles that need to be passed between OpenXR and SDL, mostly to give scale of just how intertwined the init of the GPU device and OpenXR session really are.
List of GPU handles needed to pass into OpenXR
ID3D11Device*
ID3D12Device*
ID3D12CommandQueue*
(NOTE: I haven't used OpenXR with D3D12, but I from reading the spec, I believe this can be any D3D12 command queue)MTLCommandQueue
(it actually wants an "an Objective-C object that conforms to the MTLCommandQueue protocol", but I dont know enough metal/obj-c to know what that entails)XR_KHR_vulkan_enable
VkInstance
VkPhysicalDevice
VkDevice
XR_KHR_vulkan_enable2
PFN_vkGetInstanceProcAddr
const VkInstanceCreateInfo*
const VkAllocationCallbacks*
VkPhysicalDevice
const VkDeviceCreateInfo*
const VkAllocationCallbacks*
List of GPU handles returned by OpenXR, needed to be passed into the GPU API
ID3D11Texture2D*
, returned byxrEnumerateSwapchainImages
ID3D12Resource*
, returned byxrEnumerateSwapchainImages
MTLTexture
, returned byxrEnumerateSwapchainImages
. (once again it's actually a void*, and is defined as "texture is populated with a valid Metal texture to use, which must be able to be bridged casted to an Objective-C object that conforms to the MTLTexture protocol")MTLDevice
, returned byxrGetMetalGraphicsRequirementsKHR
. The spec seems to force you to use a specificMTLDevice
on metal, you can't create your own.VkImage
returned byxrEnumerateSwapchainImages
LUID
for the D3D11/D3D12 adapter to useXR_KHR_vulkan_enable
VkPhysicalDevice
, like Metal, it seems that Vulkan with OpenXR also forces you to use a particularVkPhysicalDevice
, and the application is unable to pick one on it's own.XR_KHR_vulkan_enable2
VkInstance
VkPhysicalDevice
VkDevice
The various OpenXR extensions also return some required info to init a functional GPU device for OpenXR usage
xrGetD3D11GraphicsRequirementsKHR
.xrGetD3D12GraphicsRequirementsKHR
XR_KHR_vulkan_enable
) Minimum/Maximum Vulkan version supported by the OpenXR runtime, returned byxrGetVulkanGraphicsRequirementsKHR
XR_KHR_vulkan_enable2
) Minimum/Maximum Vulkan version supported, returned byxrGetVulkanGraphicsRequirements2KHR
The text was updated successfully, but these errors were encountered: