const rvk = @import("vulkan"); const rxr = @import("openxr"); pub extern fn xrGetInstanceProcAddr(instance: xr.Instance, procname: [*:0]const u8, function: *xr.PfnVoidFunction) xr.Result; pub extern fn vkGetInstanceProcAddr(instance: vk.Instance, procname: [*:0]const u8) vk.PfnVoidFunction; pub extern fn vkGetDeviceProcAddr(instance: vk.Device, procname: [*:0]const u8) vk.PfnVoidFunction; pub const vk = struct { usingnamespace rvk; pub const c = @cImport(@cInclude("vulkan/vulkan_core.h")); pub const getInstanceProcAddr = vkGetInstanceProcAddr; pub const getDeviceProcAddr = vkGetDeviceProcAddr; pub const InstanceDispatch = struct { vkDestroyInstance: PfnDestroyInstance, vkGetPhysicalDeviceQueueFamilyProperties: PfnGetPhysicalDeviceQueueFamilyProperties, vkCreateDebugUtilsMessengerEXT: c.PFN_vkCreateDebugUtilsMessengerEXT, usingnamespace InstanceWrapper(@This()); }; pub const DeviceDispatch = struct { vkDestroyDevice: PfnDestroyDevice, vkGetDeviceQueue: PfnGetDeviceQueue, vkQueueSubmit: PfnQueueSubmit, vkCreateCommandPool: PfnCreateCommandPool, vkDestroyCommandPool: PfnDestroyCommandPool, vkAllocateCommandBuffers: PfnAllocateCommandBuffers, vkBeginCommandBuffer: PfnBeginCommandBuffer, vkResetCommandBuffer: PfnResetCommandBuffer, vkEndCommandBuffer: PfnEndCommandBuffer, vkCmdClearColorImage: PfnCmdClearColorImage, vkCmdPipelineBarrier: PfnCmdPipelineBarrier, vkCreateFence: PfnCreateFence, vkWaitForFences: PfnWaitForFences, vkResetFences: PfnResetFences, vkDestroyFence: PfnDestroyFence, usingnamespace DeviceWrapper(@This()); }; }; pub const xr = struct { usingnamespace rxr; pub const BaseDispatch = struct { xrEnumerateInstanceExtensionProperties: PfnEnumerateInstanceExtensionProperties, xrCreateInstance: PfnCreateInstance, usingnamespace BaseWrapper(@This()); }; pub const InstanceDispatch = struct { xrDestroyInstance: PfnDestroyInstance, xrGetSystem: PfnGetSystem, xrGetSystemProperties: PfnGetSystemProperties, xrStringToPath: PfnStringToPath, xrCreateActionSet: PfnCreateActionSet, xrCreateAction: PfnCreateAction, xrCreateActionSpace: PfnCreateActionSpace, xrSuggestInteractionProfileBindings: PfnSuggestInteractionProfileBindings, xrSyncActions: PfnSyncActions, xrAttachSessionActionSets: PfnAttachSessionActionSets, xrGetActionStateFloat: PfnGetActionStateFloat, xrGetActionStatePose: PfnGetActionStatePose, xrGetActionStateBoolean: PfnGetActionStateBoolean, xrCreateSession: PfnCreateSession, xrDestroySession: PfnDestroySession, xrBeginSession: PfnBeginSession, xrEndSession: PfnEndSession, xrWaitFrame: PfnWaitFrame, xrBeginFrame: PfnBeginFrame, xrEndFrame: PfnEndFrame, xrPollEvent: PfnPollEvent, xrLocateViews: PfnLocateViews, xrLocateSpace: PfnLocateSpace, xrCreateReferenceSpace: PfnCreateReferenceSpace, xrCreateVulkanInstanceKHR: PfnCreateVulkanInstanceKHR, xrGetVulkanGraphicsDevice2KHR: PfnGetVulkanGraphicsDevice2KHR, xrGetVulkanGraphicsRequirements2KHR: PfnGetVulkanGraphicsRequirements2KHR, xrCreateVulkanDeviceKHR: PfnCreateVulkanDeviceKHR, xrEnumerateViewConfigurationViews: PfnEnumerateViewConfigurationViews, xrCreateSwapchain: PfnCreateSwapchain, xrDestroySwapchain: PfnDestroySwapchain, xrEnumerateSwapchainImages: PfnEnumerateSwapchainImages, xrAcquireSwapchainImage: PfnAcquireSwapchainImage, xrWaitSwapchainImage: PfnWaitSwapchainImage, xrReleaseSwapchainImage: PfnReleaseSwapchainImage, usingnamespace InstanceWrapper(@This()); }; pub const CMInstanceDispatch = struct { xrGetControllerModelKeyMSFT: PfnGetControllerModelKeyMSFT, xrLoadControllerModelMSFT: PfnLoadControllerModelMSFT, usingnamespace InstanceWrapper(@This()); }; pub fn getProcAddr(instance: Instance, name: [*:0]const u8) !PfnVoidFunction { var out: PfnVoidFunction = undefined; const result = xrGetInstanceProcAddr(instance, name, &out); return switch (result) { .success => out, .error_handle_invalid => error.HandleInvalid, .error_instance_lost => error.InstanceLost, .error_runtime_failure => error.RuntimeFailure, .error_out_of_memory => error.OutOfMemory, .error_function_unsupported => error.FunctionUnsupported, .error_validation_failure => error.ValidationFailure, else => error.Unknown, }; } };