summaryrefslogtreecommitdiffstats
path: root/src/xrvk.zig
blob: b2521d58994964ff0138ed2ed7e462f8e2c98417 (plain)
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,
        };
    }
};