1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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,
};
}
};
|