Repository: wheaney/XRLinuxDriver Branch: main Commit: 08b3bc93d1df Files: 187 Total size: 87.0 MB Directory structure: gitextract_d2i3_4h7/ ├── .fpm ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ └── release.yml ├── .gitignore ├── .gitmodules ├── .readthedocs.yaml ├── .vscode/ │ └── tasks.json ├── CMakeLists.txt ├── LICENSE ├── README.md ├── bin/ │ ├── build_custom_banner_config.py │ ├── inject_ua │ ├── package │ ├── package_libs │ ├── setup │ ├── ua.sh │ ├── user/ │ │ ├── install │ │ └── systemd_start │ ├── xr_driver_cli │ ├── xr_driver_logs │ ├── xr_driver_ot_profile_setup │ ├── xr_driver_setup │ ├── xr_driver_uninstall │ └── xr_driver_verify ├── docker-build/ │ ├── Dockerfile │ ├── Dockerfile.aarch64 │ ├── init.sh │ ├── run-build.sh │ └── run-fpm.sh ├── docs/ │ ├── 6dof-from-3dof-opentrack-neuralnet.md │ ├── development.md │ ├── index.md │ ├── mouse-and-joystick-modes.md │ ├── opentrack-app.md │ ├── opentrack-listener.md │ └── requirements.txt ├── fpm/ │ ├── build │ ├── postinstall │ ├── postupgrade │ ├── preinstall │ └── preuninstall ├── include/ │ ├── buffer.h │ ├── config.h │ ├── connection_pool.h │ ├── curl.h │ ├── devices/ │ │ ├── rayneo.h │ │ ├── rokid.h │ │ ├── viture.h │ │ └── xreal.h │ ├── devices.h │ ├── driver.h │ ├── epoch.h │ ├── features/ │ │ ├── breezy_desktop.h │ │ ├── sbs.h │ │ └── smooth_follow.h │ ├── files.h │ ├── imu.h │ ├── ipc.h │ ├── logging.h │ ├── memory.h │ ├── multitap.h │ ├── outputs.h │ ├── plugins/ │ │ ├── breezy_desktop.h │ │ ├── custom_banner.h │ │ ├── device_license.h │ │ ├── gamescope_reshade_wayland.h │ │ ├── metrics.h │ │ ├── neck_saver.h │ │ ├── opentrack_listener.h │ │ ├── opentrack_source.h │ │ ├── sideview.h │ │ ├── smooth_follow.h │ │ └── virtual_display.h │ ├── plugins.h │ ├── runtime_context.h │ ├── sdks/ │ │ ├── rayneo.h │ │ ├── rokid.h │ │ ├── viture_device.h │ │ ├── viture_device_carina.h │ │ ├── viture_glasses_constants.h │ │ ├── viture_glasses_provider.h │ │ ├── viture_macros.h │ │ ├── viture_protocol.h │ │ └── viture_version.h │ ├── state.h │ ├── strings.h │ ├── system.h │ ├── version.h.in │ └── wl_client/ │ └── gamescope_reshade.h ├── lib/ │ ├── aarch64/ │ │ └── viture/ │ │ ├── libopencv_calib3d.so.4.6.0 │ │ ├── libopencv_calib3d.so.406 │ │ ├── libopencv_core.so.4.6.0 │ │ ├── libopencv_core.so.406 │ │ ├── libopencv_features2d.so.4.6.0 │ │ ├── libopencv_features2d.so.406 │ │ ├── libopencv_flann.so.4.6.0 │ │ ├── libopencv_flann.so.406 │ │ ├── libopencv_highgui.so.4.6.0 │ │ ├── libopencv_highgui.so.406 │ │ ├── libopencv_imgcodecs.so.4.6.0 │ │ ├── libopencv_imgcodecs.so.406 │ │ ├── libopencv_imgproc.so.4.6.0 │ │ ├── libopencv_imgproc.so.406 │ │ ├── libopencv_video.so.4.6.0 │ │ ├── libopencv_video.so.406 │ │ ├── libopencv_videoio.so.4.6.0 │ │ └── libopencv_videoio.so.406 │ └── x86_64/ │ └── viture/ │ ├── libopencv_calib3d.so.4.2 │ ├── libopencv_calib3d.so.4.2.0 │ ├── libopencv_core.so.4.2 │ ├── libopencv_core.so.4.2.0 │ ├── libopencv_features2d.so.4.2 │ ├── libopencv_features2d.so.4.2.0 │ ├── libopencv_flann.so.4.2 │ ├── libopencv_flann.so.4.2.0 │ ├── libopencv_highgui.so.4.2 │ ├── libopencv_highgui.so.4.2.0 │ ├── libopencv_imgcodecs.so.4.2 │ ├── libopencv_imgcodecs.so.4.2.0 │ ├── libopencv_imgproc.so.4.2 │ ├── libopencv_imgproc.so.4.2.0 │ ├── libopencv_video.so.4.2 │ ├── libopencv_video.so.4.2.0 │ ├── libopencv_videoio.so.4.2 │ └── libopencv_videoio.so.4.2.0 ├── license_public_key.pem ├── mkdocs.yml ├── modules/ │ └── rayneoSDKHeaders/ │ ├── base/ │ │ ├── FXRDebug.h │ │ ├── FXRError.h │ │ ├── FXRMacro.h │ │ └── FXRType.h │ ├── device/ │ │ ├── XRDevice.h │ │ └── usb/ │ │ ├── XRDeviceState.h │ │ └── XRPacket.h │ ├── interface/ │ │ ├── FXRApi.h │ │ ├── FXRClient.h │ │ └── FXRServer.h │ ├── ipc/ │ │ └── FXRProtocol.h │ └── openxr/ │ ├── openxr.h │ ├── openxr_platform.h │ ├── openxr_platform_defines.h │ ├── openxr_reflection.h │ ├── openxr_reflection_parent_structs.h │ └── openxr_reflection_structs.h ├── src/ │ ├── buffer.c │ ├── config.c │ ├── connection_pool.c │ ├── curl.c │ ├── devices/ │ │ ├── rayneo.c │ │ ├── rokid.c │ │ ├── viture.c │ │ └── xreal.c │ ├── devices.c │ ├── driver.c │ ├── epoch.c │ ├── features/ │ │ ├── breezy_desktop.c │ │ ├── sbs.c │ │ └── smooth_follow.c │ ├── files.c │ ├── imu.c │ ├── ipc.c │ ├── logging.c │ ├── multitap.c │ ├── outputs.c │ ├── plugins/ │ │ ├── breezy_desktop.c │ │ ├── custom_banner.c │ │ ├── device_license.c │ │ ├── gamescope_reshade_wayland.c │ │ ├── metrics.c │ │ ├── neck_saver.c │ │ ├── opentrack_listener.c │ │ ├── opentrack_source.c │ │ ├── sideview.c │ │ ├── smooth_follow.c │ │ └── virtual_display.c │ ├── plugins.c │ ├── runtime_context.c │ ├── state.c │ ├── strings.c │ ├── system.c │ └── wl_client/ │ └── gamescope_reshade.c ├── systemd/ │ └── xr-driver.service └── udev/ ├── 70-rayneo-xr.rules ├── 70-rokid-xr.rules ├── 70-uinput-xr.rules ├── 70-viture-xr.rules └── 70-xreal-xr.rules ================================================ FILE CONTENTS ================================================ ================================================ FILE: .fpm ================================================ --name xr-driver --description "Linux service for interacting with XR devices" --iteration 1 --url https://github.com/wheaney/XRLinuxDriver --maintainer "Wayne Heaney " --license mit -s dir -f --before-install ./fpm/preinstall --after-install ./fpm/postinstall --after-upgrade ./fpm/postupgrade --before-remove ./fpm/preuninstall --chdir build/xr_driver bin/xrDriver=/usr/bin/xrDriver bin/xr_driver_cli=/usr/bin/xr_driver_cli systemd/xr-driver.service=/usr/lib/systemd/user/xr-driver.service ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: wheaney patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: wheaney tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .github/workflows/release.yml ================================================ name: Release on: workflow_dispatch: inputs: force_release: description: 'Run release even if version did not change' type: boolean required: false default: false push: branches: - main paths: - 'CMakeLists.txt' permissions: contents: write jobs: check-version-change: runs-on: ubuntu-latest outputs: version-changed: ${{ steps.check.outputs.changed }} version: ${{ steps.get-version.outputs.version }} steps: - uses: actions/checkout@v4 with: fetch-depth: 2 - name: Check if version changed id: check env: FORCE_RELEASE: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.force_release == 'true' }} run: | # Get the current version CURRENT_VERSION=$(grep -oP 'project\(xrDriver VERSION \K[0-9]+\.[0-9]+\.[0-9]+' CMakeLists.txt) echo "Current version: ${CURRENT_VERSION}" # Get the previous version (from previous commit) if git rev-parse HEAD~1 >/dev/null 2>&1; then git show HEAD~1:CMakeLists.txt > /tmp/prev_cmakelists.txt PREVIOUS_VERSION=$(grep -oP 'project\(xrDriver VERSION \K[0-9]+\.[0-9]+\.[0-9]+' /tmp/prev_cmakelists.txt 2>/dev/null || echo "none") rm /tmp/prev_cmakelists.txt else # This is the first commit PREVIOUS_VERSION="none" fi echo "Previous version: ${PREVIOUS_VERSION}" if [ "${FORCE_RELEASE}" = "true" ]; then echo "Force release enabled; proceeding regardless of version change" echo "changed=true" >> $GITHUB_OUTPUT exit 0 fi if [ "${CURRENT_VERSION}" != "${PREVIOUS_VERSION}" ]; then echo "Version changed from ${PREVIOUS_VERSION} to ${CURRENT_VERSION}" echo "changed=true" >> $GITHUB_OUTPUT else echo "Version unchanged" echo "changed=false" >> $GITHUB_OUTPUT fi - name: Get version id: get-version run: | VERSION=$(grep -oP 'project\(xrDriver VERSION \K[0-9]+\.[0-9]+\.[0-9]+' CMakeLists.txt) echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "Version: ${VERSION}" build-x86_64: needs: check-version-change if: needs.check-version-change.outputs.version-changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image for x86_64 run: | docker buildx build --platform linux/amd64 --load -f ./docker-build/Dockerfile -t "xr-driver:amd64" . - name: Build x86_64 binary package run: | docker run --rm -t -v ./:/source --platform linux/amd64 -e UA_API_SECRET_INTENTIONALLY_EMPTY=1 "xr-driver:amd64" sudo chown -R "${USER}":"${USER}" out/ - name: Build x86_64 lib package run: | ./bin/package_libs - name: Upload x86_64 artifacts uses: actions/upload-artifact@v4 with: name: xrDriver-x86_64 path: | out/xrDriver-x86_64.tar.gz out/xrDriver-libs-x86_64.tar.gz build-aarch64: needs: check-version-change if: needs.check-version-change.outputs.version-changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image for aarch64 run: | docker buildx build --platform linux/arm64 --load -f ./docker-build/Dockerfile.aarch64 -t "xr-driver:arm64" . - name: Build aarch64 binary package run: | docker run --rm -t -v ./:/source --platform linux/arm64 -e UA_API_SECRET_INTENTIONALLY_EMPTY=1 "xr-driver:arm64" sudo chown -R "${USER}":"${USER}" out/ - name: Build aarch64 lib package run: | ./bin/package_libs - name: Upload aarch64 artifacts uses: actions/upload-artifact@v4 with: name: xrDriver-aarch64 path: | out/xrDriver-aarch64.tar.gz out/xrDriver-libs-aarch64.tar.gz create-release: needs: [check-version-change, build-x86_64, build-aarch64] if: needs.check-version-change.outputs.version-changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Download x86_64 artifacts uses: actions/download-artifact@v4 with: name: xrDriver-x86_64 path: ./artifacts - name: Download aarch64 artifacts uses: actions/download-artifact@v4 with: name: xrDriver-aarch64 path: ./artifacts - name: Create Release uses: softprops/action-gh-release@v2 with: tag_name: v${{ needs.check-version-change.outputs.version }} name: Release v${{ needs.check-version-change.outputs.version }} draft: false prerelease: false files: | artifacts/xrDriver-x86_64.tar.gz artifacts/xrDriver-libs-x86_64.tar.gz artifacts/xrDriver-aarch64.tar.gz artifacts/xrDriver-libs-aarch64.tar.gz bin/xr_driver_setup bin/xr_driver_ot_profile_setup ================================================ FILE: .gitignore ================================================ .idea/ .cache/ cmake-build-debug/ cmake-build-release/ build/ out/ xrDriver /include/custom_banner_config.h /custom_banner_config.yml # Packaging artifacts xr_driver/ xr_driver_lib/ *.tar.gz ================================================ FILE: .gitmodules ================================================ [submodule "modules/xrealInterfaceLibrary"] path = modules/xrealInterfaceLibrary url = https://gitlab.com/wheaney/nrealAirLinuxDriver.git ================================================ FILE: .readthedocs.yaml ================================================ # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the OS, Python version, and other tools you might need build: os: ubuntu-24.04 tools: python: "3.13" # Install MkDocs and theme/plugins needed for building. python: install: - requirements: docs/requirements.txt # Build documentation with Mkdocs mkdocs: configuration: mkdocs.yml ================================================ FILE: .vscode/tasks.json ================================================ { "version": "2.0.0", "tasks": [ { "label": "build XRLinuxDriver (cmake)", "type": "shell", "command": "bash -lc 'set -euo pipefail; if [ -d build ]; then cmake --build build -j$(nproc); else cmake -S . -B build && cmake --build build -j$(nproc); fi'", "problemMatcher": [ "$gcc" ], "group": "build" } ] } ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.16) project(xrDriver VERSION 2.9.4 LANGUAGES C) # Emit compile_commands.json for IDEs (VS Code IntelliSense) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) configure_file(include/version.h.in version.h) include_directories(${PROJECT_BINARY_DIR}) # Build type: default to RelWithDebInfo for useful backtraces unless caller overrides if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) endif() set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel) set(CMAKE_C_STANDARD 17) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(PkgConfig REQUIRED) find_package(Python3 REQUIRED COMPONENTS Interpreter) set (py_cmd "${CMAKE_SOURCE_DIR}/bin/build_custom_banner_config.py") set (custom_banner_header_file "${CMAKE_SOURCE_DIR}/include/custom_banner_config.h") set (custom_banner_yaml_file "${CMAKE_SOURCE_DIR}/custom_banner_config.yml") add_custom_target(run_python_script ALL COMMAND ${Python3_EXECUTABLE} ${py_cmd} ${custom_banner_yaml_file} ${custom_banner_header_file} ) if(DEFINED ENV{UA_API_SECRET}) set(UA_API_SECRET $ENV{UA_API_SECRET}) message(STATUS "Using UA_API_SECRET from environment") add_definitions(-DUA_API_SECRET="${UA_API_SECRET}") else() set(UA_API_SECRET "") message(STATUS "!!! UA_API_SECRET is NOT set") endif() file(READ ${CMAKE_CURRENT_SOURCE_DIR}/license_public_key.pem DEVICE_LICENSE_PUBLIC_KEY_RAW) string(REPLACE "\n" "\\n" DEVICE_LICENSE_PUBLIC_KEY_ESCAPED ${DEVICE_LICENSE_PUBLIC_KEY_RAW}) add_definitions(-DDEVICE_LICENSE_PUBLIC_KEY="${DEVICE_LICENSE_PUBLIC_KEY_ESCAPED}") find_package(Threads REQUIRED) pkg_check_modules(LIBUSB REQUIRED libusb-1.0) pkg_check_modules(LIBEVDEV REQUIRED libevdev) pkg_check_modules(OPENSSL REQUIRED openssl) pkg_check_modules(JSONC REQUIRED json-c) pkg_check_modules(CURL REQUIRED libcurl) pkg_check_modules(LIBWAYLAND_CLIENT REQUIRED wayland-client) execute_process(COMMAND git submodule update --init --recursive WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(modules/xrealInterfaceLibrary/interface_lib) # Set the library directory based on architecture set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}) set(VITURE_LIB_DIR ${LIB_DIR}/viture) message(STATUS "LIB_DIR: ${LIB_DIR}") if(EXISTS ${VITURE_LIB_DIR}) message(STATUS "VITURE_LIB_DIR: ${VITURE_LIB_DIR}") endif() # Find all .a files in the library directory file(GLOB STATIC_LIBS ${LIB_DIR}/*.a) if(EXISTS ${VITURE_LIB_DIR}) file(GLOB VITURE_STATIC_LIBS ${VITURE_LIB_DIR}/*.a) list(APPEND STATIC_LIBS ${VITURE_STATIC_LIBS}) endif() message(STATUS "STATIC_LIBS: ${STATIC_LIBS}") # Add all static libraries foreach(LIB ${STATIC_LIBS}) get_filename_component(LIB_NAME ${LIB} NAME_WE) string(REPLACE "lib" "" LIB_NAME ${LIB_NAME}) add_library(${LIB_NAME} STATIC IMPORTED) set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION ${LIB} ) endforeach() # Find all .so files in the library directory file(GLOB SHARED_LIBS ${LIB_DIR}/*.so) if(EXISTS ${VITURE_LIB_DIR}) file(GLOB VITURE_SHARED_LIBS ${VITURE_LIB_DIR}/*.so) list(APPEND SHARED_LIBS ${VITURE_SHARED_LIBS}) endif() message(STATUS "SHARED_LIBS: ${SHARED_LIBS}") # Add all shared libraries foreach(LIB ${SHARED_LIBS}) get_filename_component(LIB_NAME ${LIB} NAME_WE) string(REPLACE "lib" "" LIB_NAME ${LIB_NAME}) add_library(${LIB_NAME} SHARED IMPORTED) set_target_properties(${LIB_NAME} PROPERTIES IMPORTED_LOCATION ${LIB} IMPORTED_SONAME ${LIB_NAME}.so ) endforeach() # Define the mapping of binary names to source files set(DEVICE_MAPPINGS "libRayNeoXRMiniSDK.so:src/devices/rayneo.c" "libGlassSDK.so:src/devices/rokid.c" ) set(SOURCES src/buffer.c src/config.c src/connection_pool.c src/curl.c src/devices/xreal.c src/devices.c src/driver.c src/epoch.c src/features/breezy_desktop.c src/features/smooth_follow.c src/features/sbs.c src/files.c src/logging.c src/imu.c src/ipc.c src/multitap.c src/outputs.c src/plugins.c src/plugins/breezy_desktop.c src/plugins/custom_banner.c src/plugins/device_license.c src/plugins/gamescope_reshade_wayland.c src/plugins/metrics.c src/plugins/sideview.c src/plugins/smooth_follow.c src/plugins/virtual_display.c src/plugins/neck_saver.c src/plugins/opentrack_source.c src/plugins/opentrack_listener.c src/runtime_context.c src/state.c src/strings.c src/system.c src/wl_client/gamescope_reshade.c ) # Function to get the source file from a mapping function(get_source_file BINARY_NAME RESULT_VAR) foreach(MAPPING ${DEVICE_MAPPINGS}) string(REPLACE ":" ";" MAPPING_LIST ${MAPPING}) list(GET MAPPING_LIST 0 MAPPED_BINARY) list(GET MAPPING_LIST 1 MAPPED_SOURCE) if(${BINARY_NAME} STREQUAL ${MAPPED_BINARY}) set(${RESULT_VAR} ${MAPPED_SOURCE} PARENT_SCOPE) return() endif() endforeach() set(${RESULT_VAR} "" PARENT_SCOPE) endfunction() # Get all targets in the current directory get_property(ALL_TARGETS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY IMPORTED_TARGETS) # Iterate over all targets foreach(TARGET ${ALL_TARGETS}) get_target_property(LIB_TYPE ${TARGET} TYPE) if(LIB_TYPE STREQUAL "STATIC_LIBRARY" OR LIB_TYPE STREQUAL "SHARED_LIBRARY") get_target_property(LIB_LOCATION ${TARGET} IMPORTED_LOCATION) if(LIB_LOCATION) get_filename_component(LIB_NAME ${LIB_LOCATION} NAME) get_source_file(${LIB_NAME} SOURCE_FILE) if(SOURCE_FILE) list(APPEND SOURCES ${SOURCE_FILE}) string(TOUPPER ${TARGET} TARGET_UPPER) add_definitions(-D${TARGET_UPPER}_SUPPORTED) message(STATUS "${TARGET} support enabled, added ${SOURCE_FILE}") endif() endif() endif() endforeach() if(EXISTS ${VITURE_LIB_DIR}) list(APPEND SOURCES src/devices/viture.c) add_definitions(-DVITURE_SUPPORTED) message(STATUS "VITURE support enabled, added src/devices/viture.c") endif() add_executable(xrDriver ${SOURCES}) # Improve crash backtraces and line number resolution if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") # Per-config compile options target_compile_options(xrDriver PRIVATE $<$:-g3> $<$:-O0> $<$:-fno-omit-frame-pointer> $<$:-g> $<$:-fno-omit-frame-pointer> ) # Export symbol table for better backtrace_symbols() resolution target_link_options(xrDriver PRIVATE $<$:-rdynamic> $<$:-rdynamic> ) endif() # Optional: AddressSanitizer for clearer reports on memory errors option(ENABLE_ASAN "Build with AddressSanitizer" OFF) if(ENABLE_ASAN AND CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(xrDriver PRIVATE -fsanitize=address -fno-omit-frame-pointer -g) target_link_options(xrDriver PRIVATE -fsanitize=address) endif() target_include_directories(xrDriver SYSTEM BEFORE PRIVATE ${LIBEVDEV_INCLUDE_DIRS} ${JSONC_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/modules/rayneoSDKHeaders ${CMAKE_CURRENT_SOURCE_DIR}/modules/xrealInterfaceLibrary/interface_lib/include ${LIBUSB_INCLUDE_DIRS} ${LIBCURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIRS} ${LIBWAYLAND_CLIENT_INCLUDE_DIRS} ) set(ALL_IMPORTED_LIBS) get_property(ALL_TARGETS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY IMPORTED_TARGETS) foreach(TARGET ${ALL_TARGETS}) get_target_property(LIB_TYPE ${TARGET} TYPE) if(LIB_TYPE STREQUAL "STATIC_LIBRARY" OR LIB_TYPE STREQUAL "SHARED_LIBRARY") list(APPEND ALL_IMPORTED_LIBS ${TARGET}) endif() endforeach() target_link_libraries(xrDriver PRIVATE ${LIBEVDEV_LIBRARIES} ${JSONC_LIBRARIES} xrealAirLibrary Threads::Threads m ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} ${ALL_IMPORTED_LIBS} ${LIBUSB_LIBRARIES} ${LIBWAYLAND_CLIENT_LIBRARIES} ) add_dependencies(xrDriver run_python_script) ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ # XR Linux Driver [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/U7U8OVC0L) [![Chat](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/azSBTXNXMt) [![Documentation Status](https://readthedocs.org/projects/xrlinuxdriver/badge/?version=latest)](https://xrlinuxdriver.readthedocs.io/en/latest/?badge=latest) ## What is this? This driver allows your Linux device (including Steam Deck) to automatically recognize supported XR glasses (see [Supported Devices](#supported-devices)) when they're plugged in, and convert the movements of the glasses into mouse movements and an external broadcast that games or any application can utilize. If you're looking for a 3DoF virtual display, this driver by itself does not provide that functionality; instead, see [Breezy Desktop](https://github.com/wheaney/breezy-desktop) or [use the Steam Deck plugin](#steam-deck-via-decky-loader). ## Supported Devices Check below to see if your device is supported. **Note: be sure you're on the latest firmware for your device.** | Brand | Model | Support? | Recommend? | x86_64 (AMD64) | AARCH64 (ARM64) | Firmware updates | Notes | | -------- | ----------------- | ----------------- | ------------ | -------------- | --------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | VITURE | One
One Lite
Pro XR
Luma
Luma Pro | :heavy_check_mark: | :+1: | :heavy_check_mark: | :heavy_check_mark: | [Official update site](https://static.viture.com/dfu-util/). Requires Chrome on Windows/Mac. | Official collaboration. [Closed source SDK](https://www.viture.com/developer/viture-one-sdk-for-linux). | | VITURE | Luma Ultra | :heavy_check_mark: | :+1: | :heavy_check_mark: | :heavy_check_mark: | [Official update site](https://static.viture.com/dfu-util/). Requires Chrome on Windows/Mac. | Official collaboration. [Closed source SDK](https://www.viture.com/developer/viture-one-sdk-for-linux). | | VITURE | Beast | :clock4: Coming soon... | | | | | Support requires updates to the official SDK. | | TCL/RayNeo | NXTWEAR S/S+
Air 2
2s
3s/Pro | :heavy_check_mark: | :+1: | :heavy_check_mark: | | | Official collaboration, closed source SDK. | | Rokid | Max
Air | :heavy_check_mark: | :+1: | :heavy_check_mark: | | | Official collaboration, closed source SDK. | | XREAL | Air
Air 2
Air 2 Pro
Air 2 Ultra | :heavy_check_mark: | :-1: | :heavy_check_mark: | :heavy_check_mark: | [Official update site](https://www.xreal.com/support/update/). Requires Chrome. | Unwilling to collaborate. [Unofficial, open-source SDK](https://gitlab.com/TheJackiMonster/nrealAirLinuxDriver). Exhibits drift. | | XREAL | One
One Pro | :heavy_check_mark:

**See notes before use** | :-1: | :heavy_check_mark: | :heavy_check_mark: | [Official update site](https://www.xreal.com/support/update/). Requires Chrome. | **Important** - Disable stabilizer/anchor features on glasses. Must be on latest firmware. | | XREAL | 1S | :heavy_check_mark: XR driver v2.8.x

:heavy_check_mark: Breezy Desktop v2.8.x

:heavy_check_mark: Decky XR Gaming v1.5.x

**See notes before use** | :-1: | :heavy_check_mark: | :heavy_check_mark: | [Official update site](https://www.xreal.com/support/update/). Requires Chrome. | **Important** - Disable stabilizer/anchor features on glasses. Must be on latest firmware. | ## Setup ### Manual installation *Note: this installation is for just the base driver with mouse/joystick support. If you're looking for virtual display or workspace tools, check out [Breezy Desktop](https://github.com/wheaney/breezy-desktop).* 1. [Download the setup script](https://github.com/wheaney/XRLinuxDriver/releases/latest/download/xr_driver_setup) and set the execute flag (e.g. from the terminal: `chmod +x ~/Downloads/xr_driver_setup`) 2. Run the setup script as root (e.g. `sudo ~/Downloads/xr_driver_setup`) Your device should now automatically recognize when your glasses are plugged in and translate their movements to mouse movements. If you're not seeing this, check the log at `$XDG_STATE_HOME/xr_driver/driver.log` and report an Issue here with its contents. #### Turning automatic driver usage on or off To disable the driver and turn off mouse movements without completely removing it, you can use the config script (e.g. `xr_driver_cli -d` to disable, and `-e` to re-enable). Run this script without arguments to see its usage. Configs are stored in the file `$XDG_CONFIG_HOME/xr_driver/config.ini`. ### Updating If using Decky, updates are installed through Decky. Otherwise, just rerun the `xr_driver_setup` file. No need to redownload this script, as it will automatically download the latest installation binary for you. ### Uninstalling If you wish to completely remove the installation, run the following script as root: `~/.local/bin/xr_driver_uninstall`. For Steam Deck users, you can uninstall the plugin via the Decky interface. ## Data Privacy Notice Your right to privacy and the protection of your personal data are baked into every decision around how your personal data is collected, handled and stored. Your personal data will never be shared, sold, or distributed in any form. ### Data Collected In order to provide you with Supporter Tier features, this application and its backend services have to collect the following pieces of personal information: * Your email address is sent to this application's backend server from either the payment vendor (Ko-fi) or from your device (at your request). Your email address may be used immediately upon receipt in its unaltered form to send you a transactional email, but it is then hashed prior to storage. The unaltered form of your email address is never stored and can no longer be referenced. The hashed value is stored for later reference. * Other personal data may be sent from the payment vendor, but is never utilized nor stored. * Your device's MAC address is hashed on your device. It never leaves your device in its original, unaltered form. The hashed value is sent to this application's backend server and stored for later reference. * Metrics are collected using Google Analytics. No personal information is explicitly collected, and Google Analytics will anonymize the IP address that's sent as part of the HTTP request. You can disable metrics collection using `xr_driver_cli --no-metrics`. Hashing functions are a one-way process that serve to anonymize your personal data by irreversibly changing them. Once hashed, they can never be unhashed or traced back to their original values. ### Contact For inquires about data privacy or any related concerns, please contact: Wayne Heaney - **wayne@xronlinux.com** ## Credits This driver wouldn't have been possible without the work of Tobias Frisch for his [base Linux driver](https://gitlab.com/TheJackiMonster/nrealAirLinuxDriver) that this uses under the hood, Matt Smith for his [Windows driver](https://github.com/MSmithDev/AirAPI_Windows/), and others that worked to [reverse engineer the glasses](https://github.com/edwatt/real_utilities/). ================================================ FILE: bin/build_custom_banner_config.py ================================================ import sys import os import yaml start_date = 0 end_date = 0 target_device_vendor_id = 0 target_device_product_id = 0 yaml_file_path = sys.argv[1] output_file_path = sys.argv[2] if os.path.isfile(yaml_file_path): with open(yaml_file_path, 'r') as stream: try: yaml_data = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) sys.exit(1) try: start_date = int(yaml_data.get("start_date", 0)) except ValueError: print("ERROR: start_date is not an int") sys.exit(1) try: end_date = int(yaml_data.get("end_date", 0)) except ValueError: print("ERROR: end_date is not an int") sys.exit(1) try: target_device_vendor_id = int(yaml_data.get("target_device_vendor_id", 0)) if target_device_vendor_id != 0: try: target_device_product_id = int(yaml_data.get("target_device_product_id", 0)) except ValueError: print("ERROR: target_device_product_id is not an int") sys.exit(1) except ValueError: print("ERROR: target_device_vendor_id is not an int") sys.exit(1) if end_date != 0 and start_date != 0 and start_date > end_date: print("ERROR: start_date is after end_date") sys.exit(1) with open(output_file_path, "w") as f: f.write("#pragma once\n") f.write("// This file is autogenerated by bin/custom_banner_build.py\n") f.write("// Do not edit this file directly\n") f.write("#define CUSTOM_BANNER_START_DATE {}\n".format(start_date)) f.write("#define CUSTOM_BANNER_END_DATE {}\n".format(end_date)) f.write("#define CUSTOM_BANNER_TARGET_DEVICE_VENDOR_ID {}\n".format(target_device_vendor_id)) f.write("#define CUSTOM_BANNER_TARGET_DEVICE_PRODUCT_ID {}\n".format(target_device_product_id)) ================================================ FILE: bin/inject_ua ================================================ #!/bin/bash # Function to copy and replace code in scripts. Allows for code reuse without needing multiple bash files. copy_and_inject_ua() { # Source file containing the code to be injected local source_file=$1 # Directory where the scripts will be copied to local copy_to_dir=$2 # Keyword in the destination file where the code will be injected local keyword="#INJECT_UA_CALL" # List of scripts to be copied and modified local scripts=("${@:3}") for script in "${scripts[@]}"; do # Copy the script to the package directory cp -p $script $copy_to_dir # Get the filename of the script local filename=$(basename $script) # Destination file where the code will be injected local destination_file="$copy_to_dir/$filename" # Replace the keyword with the content of the source file sed -i -e "/$keyword/r $source_file" -e "s/$keyword/UA_API_SECRET=\"${UA_API_SECRET}\"/g" $destination_file done } ================================================ FILE: bin/package ================================================ #!/usr/bin/env bash # exit when any command fails set -e USER=${SUDO_USER:-$USER} GROUP=$(id -gn $USER) source bin/inject_ua if [ -z "$UA_API_SECRET" ] && [ -z "$UA_API_SECRET_INTENTIONALLY_EMPTY" ]; then echo "UA_API_SECRET isn't set. If this is intentional, set UA_API_SECRET_INTENTIONALLY_EMPTY to a non-empty value." exit 1 fi ARCH=$(uname -m) echo "Building for $ARCH" # build the driver BUILD_PATH=build if [ ! -d "$BUILD_PATH" ]; then mkdir $BUILD_PATH fi pushd $BUILD_PATH cmake .. make # create package PACKAGE_DIR=xr_driver PACKAGE_BIN_DIR=$PACKAGE_DIR/bin PACKAGE_USER_BIN_DIR=$PACKAGE_BIN_DIR/user mkdir -p $PACKAGE_USER_BIN_DIR mv xrDriver $PACKAGE_BIN_DIR # copy setup and user-relevant scripts copy_and_inject_ua "../bin/ua.sh" "$PACKAGE_DIR" "../bin/setup" copy_and_inject_ua "../bin/ua.sh" "$PACKAGE_BIN_DIR" "../bin/xr_driver_verify" "../bin/xr_driver_cli" "../bin/xr_driver_uninstall" "../bin/xr_driver_logs" copy_and_inject_ua "../bin/ua.sh" "$PACKAGE_USER_BIN_DIR" "../bin/user/install" "../bin/user/systemd_start" # copy the systemd files needed to run our service cp -r ../systemd $PACKAGE_DIR cp -r ../udev $PACKAGE_DIR # create manifest file for verifying installed file checksums against the originally packaged versions # include any file that doesn't get modified during setup (e.g. the systemd service file) pushd $PACKAGE_BIN_DIR BIN_MANIFEST=$(sha256sum xrDriver xr_driver_cli xr_driver_uninstall xr_driver_logs) popd echo $BIN_MANIFEST > $PACKAGE_DIR/manifest # bundle up the driver directory (without lib files) BUILD_ARTIFACT_NAME="xrDriver-$ARCH.tar.gz" tar -zcvf $BUILD_ARTIFACT_NAME $PACKAGE_DIR popd mkdir -p out cp $BUILD_PATH/$BUILD_ARTIFACT_NAME out/ rm -rf $BUILD_PATH ================================================ FILE: bin/package_libs ================================================ #!/usr/bin/env bash # exit when any command fails set -e # Package libraries for both architectures ARCHITECTURES=("x86_64" "aarch64") echo "Building lib packages for all architectures" # build the lib package BUILD_PATH=build if [ ! -d "$BUILD_PATH" ]; then mkdir $BUILD_PATH fi pushd $BUILD_PATH > /dev/null for ARCH in "${ARCHITECTURES[@]}"; do echo "Packaging libraries for $ARCH" # create separate lib package PACKAGE_LIB_DIR=xr_driver_lib mkdir -p $PACKAGE_LIB_DIR cp ../lib/$ARCH/*.so* $PACKAGE_LIB_DIR || true cp ../lib/$ARCH/viture/*.so* $PACKAGE_LIB_DIR || true LIB_ARTIFACT_NAME="xrDriver-libs-$ARCH.tar.gz" tar -zcvf $LIB_ARTIFACT_NAME $PACKAGE_LIB_DIR # Clean up for next iteration rm -rf $PACKAGE_LIB_DIR done popd > /dev/null mkdir -p out cp $BUILD_PATH/*.tar.gz out/ rm -rf $BUILD_PATH ================================================ FILE: bin/setup ================================================ #!/usr/bin/env bash set -e # This script gets packaged with the release and should do the bulk of the setup work. This allows this setup to be tied # to a specific release of the code, and guarantees it will never run along-side newer or older binaries. # Make sure only root can run our script if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi # some distros don't have systemd enabled by default. if [[ -z "${SKIP_SYSTEMD:-}" ]]; then if [[ $(ps -p 1 -o comm=) != "systemd" ]]; then echo "systemd is required for this installation. Please enable it, then rerun the setup." exit 1 fi else if [[ $(ps -p 1 -o comm=) != "systemd" ]]; then echo "SKIP_SYSTEMD is set and systemd is not detected as PID 1; continuing without systemd integration." fi fi if ! find /usr/lib* -name 'libcurl.so*' -print -quit | grep -q .; then echo "The libcurl library is not found. It's typically provided by the package libcurl4 (Debian/Ubuntu), libcurl (Fedora), or curl (Arch). \ Please install it and rerun setup." exit 1 fi if ! find /usr/lib* -name 'libwayland-client.so*' -print -quit | grep -q .; then echo -e "\n\n!!! WARNING: The Wayland client library was not found, which will disable the gamescope integration. \ To enable this, install the appropriate library. It's typically provided by the package libwayland-client0 \ (Debian/Ubuntu), wayland (Fedora), or wayland (Arch).\n\n" fi USER=${SUDO_USER:-$USER} GROUP=$(id -g $USER) USER_HOME=$(getent passwd $USER | cut -d: -f6) function create_and_chown() { if [ ! -d "$1" ]; then mkdir -p $1 fi # XDG dir can be provided as the second argument, we want to make sure it's owned by the user # but don't recursively chown it since other programs may put files in there if [ -n "$2" ]; then chown $USER:$GROUP $2 fi # only recursively chown the directory if it's not an XDG dir if [ -z "$2" ] || [ "$1" != "$2" ]; then chown -R $USER:$GROUP $1 fi } if [ -z "$XDG_DATA_HOME" ]; then XDG_DATA_HOME="$USER_HOME/.local/share" fi SYSTEMD_DATA_DIR="$XDG_DATA_HOME/systemd" SYSTEMD_USER_DIR="$SYSTEMD_DATA_DIR/user" mkdir -p $SYSTEMD_USER_DIR # this will get chowned by the recursive call triggered next create_and_chown $SYSTEMD_DATA_DIR $XDG_DATA_HOME DATA_DIR="$XDG_DATA_HOME/xr_driver" create_and_chown $DATA_DIR $XDG_DATA_HOME if [ -z "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$USER_HOME/.config" fi CONFIG_DIR="$XDG_CONFIG_HOME/xr_driver" create_and_chown $CONFIG_DIR $XDG_CONFIG_HOME if [ -z "$XDG_BIN_HOME" ]; then XDG_BIN_HOME="$USER_HOME/.local/bin" fi OLD_BIN_DIR="$USER_HOME/bin" BIN_DIR="$XDG_BIN_HOME" create_and_chown $OLD_BIN_DIR create_and_chown $BIN_DIR $XDG_BIN_HOME if [ -z "$XDG_STATE_HOME" ]; then XDG_STATE_HOME="$USER_HOME/.local/state" fi STATE_DIR="$XDG_STATE_HOME/xr_driver" create_and_chown $STATE_DIR $XDG_STATE_HOME if [ -e "$OLD_BIN_DIR/xreal_driver_uninstall" ]; then echo "Cleaning up the previous installation" # ` || true` will ensure that this can't cause a failure, even with `set -e` $OLD_BIN_DIR/xreal_driver_uninstall --for-install || true UA_EVENT_NAME="update" fi if [ -e "$BIN_DIR/xr_driver_uninstall" ]; then echo "Cleaning up the previous installation" # ` || true` will ensure that this can't cause a failure, even with `set -e` $BIN_DIR/xr_driver_uninstall --for-install || true UA_EVENT_NAME="update" fi if command -v jq >/dev/null 2>&1 && [ -e "$STATE_DIR/license.json" ]; then HWID=$(jq -r '.license | fromjson | .hardwareId' "$STATE_DIR/license.json" | cut -c 1-8) if [ "$HWID" != "null" ]; then echo "Moving your license file to $STATE_DIR/${HWID}_license.json" mv "$STATE_DIR/license.json" "$STATE_DIR/${HWID}_license.json" fi fi current_path=$(pwd) if [[ "$current_path" == /tmp/* ]]; then target_dir=$(echo "$current_path" | sed -E 's|^(/tmp/[^/]+).*|\1|') echo "Changing ownership of $target_dir to $USER:$GROUP" chown -R $USER:$GROUP "$target_dir" fi # this part of the setup should be run as the user, not root XDG_RUNTIME_DIR="/run/user/$(id -u $USER)" if [ ! -d "$XDG_RUNTIME_DIR" ]; then # On non-systemd systems /run/user/ may not exist. Fall back to a private runtime dir in /tmp. XDG_RUNTIME_DIR="/tmp/xr_driver_runtime_$(id -u $USER)" mkdir -p "$XDG_RUNTIME_DIR" chown "$USER:$GROUP" "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR" fi export XDG_RUNTIME_DIR su -c "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR $(realpath bin/user/install)" $USER ############################### ### BEGIN sudo required section if ! { lsmod | grep -q uinput || [[ -c /dev/uinput ]]; }; then echo "Setting up uinput kernel module" modprobe uinput fi # if steamos is detected, we need to install the udev rules to /etc since /usr is on the readonly FS UDEV_RULES_DIR="/usr/lib/udev/rules.d" UDEV_RULES_DIR_CHANGED=0 if [ -f /etc/os-release ]; then . /etc/os-release if [ "$ID" == "steamos" ]; then UDEV_RULES_DIR="/etc/udev/rules.d" UDEV_RULES_DIR_CHANGED=1 fi fi if [ $UDEV_RULES_DIR_CHANGED -eq 0 ]; then if touch "$UDEV_RULES_DIR/100-xr-driver-test-rule" 2>/dev/null; then rm "$UDEV_RULES_DIR/100-xr-driver-test-rule" else UDEV_RULES_DIR="/etc/udev/rules.d" fi fi mkdir -p $UDEV_RULES_DIR echo "Copying the udev rules to ${UDEV_RULES_DIR}" cp udev/* $UDEV_RULES_DIR udevadm control --reload-rules >/dev/null 2>&1 for subsystem in usb hidraw input; do udevadm trigger --action=add --subsystem-match="$subsystem" >/dev/null 2>&1 || true done udevadm settle >/dev/null 2>&1 || true # remove temporary files that may be left behind, sometimes they cause problems rm -f /tmp/shader_runtime_* rm -f /dev/shm/xr_* rm -f /dev/shm/breezy_desktop_imu ### END sudo required section ############################### if [ -n "$SKIP_SYSTEMD" ]; then printf "\n\033[1;33m!!! IMPORTANT !!!\033[0m\n" echo "SKIP_SYSTEMD set; skipping systemd service startup." echo "You are responsible for starting the driver manually when needed:" printf "\tLD_LIBRARY_PATH=\"${DATA_DIR}/lib\" ${BIN_DIR}/xrDriver\n\n" else # this part of the setup should be run as the user, not root su -l -c "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR $(realpath bin/user/systemd_start)" $USER ############################### ### BEGIN sudo required section # Ensure the user service persists after logout loginctl enable-linger $USER ### END sudo required section ############################### fi ================================================ FILE: bin/ua.sh ================================================ MEASUREMENT_ID="G-Z94MXP18T6" # if UA_EVENT_VERSION is set, copy its value and replace any dots in the value with underscores, then append it to UA_EVENT_NAME if [ -n "$UA_EVENT_VERSION" ]; then UA_EVENT_NAME="$(echo $UA_EVENT_NAME)_$(echo $UA_EVENT_VERSION | sed 's/\./_/g')" fi POST_DATA=$(cat </dev/null 2>&1 || true ================================================ FILE: bin/user/install ================================================ #!/usr/bin/env bash set -e # this part of the setup should be run as the user, not root if [ "$(id -u)" == "0" ]; then echo "This script must NOT be run as root" 1>&2 exit 1 fi GROUP=$(id -gn $USER) USER_HOME=$(getent passwd $USER | cut -d: -f6) UA_EVENT_NAME="install" if [ -z "$XDG_DATA_HOME" ]; then XDG_DATA_HOME="$USER_HOME/.local/share" fi SYSTEMD_USER_DIR="$XDG_DATA_HOME/systemd/user" DATA_DIR="$XDG_DATA_HOME/xr_driver" if [ -z "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$USER_HOME/.config" fi CONFIG_DIR="$XDG_CONFIG_HOME/xr_driver" if [ -z "$XDG_BIN_HOME" ]; then XDG_BIN_HOME="$USER_HOME/.local/bin" fi OLD_BIN_DIR="$USER_HOME/bin" BIN_DIR="$XDG_BIN_HOME" if [ -z "$XDG_STATE_HOME" ]; then XDG_STATE_HOME="$USER_HOME/.local/state" fi STATE_DIR="$XDG_STATE_HOME/xr_driver" if [ -e "$OLD_BIN_DIR/xreal_driver_uninstall" ]; then echo "Cleaning up the previous installation" # ` || true` will ensure that this can't cause a failure, even with `set -e` $OLD_BIN_DIR/xreal_driver_uninstall --for-install || true UA_EVENT_NAME="update" fi if [ -e "$BIN_DIR/xr_driver_uninstall" ]; then echo "Cleaning up the previous installation" # ` || true` will ensure that this can't cause a failure, even with `set -e` $BIN_DIR/xr_driver_uninstall --for-install || true UA_EVENT_NAME="update" fi UA_CLIENT_ID="ARLinuxDriver" UA_EVENT_VERSION="$1" #INJECT_UA_CALL # make sure the systemd service isn't already running from a previous install systemctl --user is-active --quiet xr-driver && systemctl --user stop xr-driver echo "Copying shared libraries to ${DATA_DIR}/lib" mkdir -p $DATA_DIR/lib cp lib/* "$DATA_DIR/lib" 2>/dev/null || true if [ -e "$USER_HOME/.xreal_driver_config" ]; then echo "Migrating config file to ${CONFIG_DIR}/config.ini" mv $USER_HOME/.xreal_driver_config $CONFIG_DIR/config.ini fi if [ -e "$USER_HOME/.xreal_driver_log" ]; then echo "Migrating log file to ${STATE_DIR}/driver.log" mv $USER_HOME/.xreal_driver_log ${STATE_DIR}/driver.log fi if [ -e "/var/lib/xr_driver/device_license" ]; then echo "Migrating device license to ${STATE_DIR}/license.json" pushd /var/lib/xr_driver > /dev/null # since the file has root ownership, rename it before moving to a user directory mv "device_license" "license.json" mv "license.json" "${STATE_DIR}/license.json" popd > /dev/null fi # escaping sed replace: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern ESCAPED_USER_HOME=$(printf '%s\n' "$USER_HOME" | sed -e 's/[\/&]/\\&/g') ESCAPED_LD_LIBRARY_PATH=$(printf '%s\n' "$DATA_DIR/lib" | sed -e 's/[\/&]/\\&/g') ESCAPED_BIN_DIR=$(printf '%s\n' "$BIN_DIR" | sed -e 's/[\/&]/\\&/g') echo "Copying driver binary and scripts to ${BIN_DIR} and ${DATA_DIR}" pushd bin > /dev/null sed -i -e "s/{bin_dir}/$ESCAPED_BIN_DIR/g" xr_driver_verify cp xrDriver $BIN_DIR cp xr_driver_cli $BIN_DIR cp xr_driver_uninstall $BIN_DIR cp xr_driver_logs $BIN_DIR cp xr_driver_verify $BIN_DIR # keep putting this in the old location in case an older version of the script tries to find it cp xr_driver_uninstall $OLD_BIN_DIR/xreal_driver_uninstall popd > /dev/null cp manifest $DATA_DIR echo "Copying the systemd service to ${SYSTEMD_USER_DIR}" sed -i -e "s/{user_home}/$ESCAPED_USER_HOME/g" \ -e "s/{user}/$USER/g" \ -e "s/{ld_library_path}/$ESCAPED_LD_LIBRARY_PATH/g" \ -e "s/{bin_dir}/$ESCAPED_BIN_DIR/g" systemd/xr-driver.service cp systemd/xr-driver.service $SYSTEMD_USER_DIR # clear bash's cache of executable locations, so it can find the newly installed scripts hash -r ================================================ FILE: bin/user/systemd_start ================================================ #!/usr/bin/env bash set -e # this part of the setup should be run as the user, not root if [ "$(id -u)" == "0" ]; then echo "This script must NOT be run as root" 1>&2 exit 1 fi if ! command -v systemctl >/dev/null 2>&1; then printf '\n\033[31mERROR\033[0m systemd was not found on this system. If you would still like to proceed without the background service, rerun this script with SKIP_SYSTEMD=1.\n' exit 1 fi echo "Setting up the systemd service" systemctl --user daemon-reload systemctl --user start xr-driver # check if systemd startup was successful if ! systemctl --user is-active --quiet xr-driver; then echo "systemd startup failed" exit 1 fi # set it to run on startup systemctl --user enable xr-driver ================================================ FILE: bin/xr_driver_cli ================================================ #!/usr/bin/env bash if ! systemctl --user --quiet is-active xr-driver >/dev/null 2>&1; then if [ -z "$IGNORE_SYSTEMD_ERRORS" ]; then echo "xr-driver service is not active. Start it with:" >&2 echo " systemctl --user start xr-driver" >&2 echo "" echo "If the issue persists, please create an issue on the wheaney/XRLinuxDriver repository." echo "" echo "To ignore this error, rerun with IGNORE_SYSTEMD_ERRORS=1" exit 1 else echo "Warning: xr-driver service is not active, most actions will be ineffective until this is resolved. Continuing due to IGNORE_SYSTEMD_ERRORS..." >&2 fi fi USER=${SUDO_USER:-$USER} USER_HOME=$(getent passwd $USER | cut -d: -f6) if [ -z "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$USER_HOME/.config" fi CONFIG_DIR="$XDG_CONFIG_HOME/xr_driver" if [ ! -d "$CONFIG_DIR" ]; then mkdir -p $CONFIG_DIR fi if [ -z "$XDG_STATE_HOME" ]; then XDG_STATE_HOME="$USER_HOME/.local/state" fi LOG_FILE="$XDG_STATE_HOME/xr_driver/driver.log" ensure_config_file() { local file="$1" if [ ! -f "$file" ]; then touch "$file" fi } write_config_value() { local file="$1" local key="$2" local value="$3" if grep -q "^$key=" "$file"; then sed -i "s/^$key=.*/$key=$value/" "$file" else echo "$key=$value" >> "$file" fi } read_config_value() { local file="$1" local key="$2" local type="$3" local value if [ "$type" == "string" ]; then value="Not set" else value="enabled" fi while read -r line; do if [[ $line == "$key="* ]]; then local raw_value=${line#*=} if [ "$type" == "string" ]; then value=$raw_value else if [ "$raw_value" == "true" ]; then value="disabled" fi fi break fi done < "$file" echo "$value" } process_config() { local file="$1" local key="$2" local value="$3" local type="$4" local key2="$5" local value2="$6" local token_action="$7" local token_arg="$8" ensure_config_file "$file" if [[ -n $value ]]; then write_config_value "$file" "$key" "$value" if [[ -n $key2 ]]; then write_config_value "$file" "$key2" "$value2" fi return 0 fi local read_value read_value=$(read_config_value "$file" "$key" "$type") if [[ -n $token_action ]]; then local hardware_id="$read_value" local url="https://eu.driver-backend.xronlinux.com/tokens/v1" local message="" if [[ "$token_action" == "request" || "$token_action" == "verify" ]] && ! command -v jq >/dev/null 2>&1; then echo "Error: jq utility not found. Install jq to use this feature." >&2 exit 1 fi if [ "$token_action" == "request" ]; then postbody=$(jq -n \ --arg hardwareId "$hardware_id" \ --arg email "$token_arg" \ '{hardwareId: $hardwareId, email: $email}') message=$(curl -s -X POST -H "Content-Type: application/json" -d "$postbody" "$url" | jq -r '.message') elif [ "$token_action" == "verify" ]; then postbody=$(jq -n \ --arg hardwareId "$hardware_id" \ --arg token "$token_arg" \ '{hardwareId: $hardwareId, token: $token}') message=$(curl -s -X PUT -H "Content-Type: application/json" -d "$postbody" "$url" | jq -r '.message') elif [ "$token_action" == "refresh" ]; then echo "refresh_device_license=true" > /dev/shm/xr_driver_control message="License refresh requested" elif [ "$token_action" == "get" ]; then message="$hardware_id" fi if [ -n "$message" ]; then echo "$message" fi else echo "$read_value" fi } require_arg() { local opt="$1" local arg="$2" if [ -z "$arg" ] || [ "$arg" == "--" ]; then echo "Error: $opt requires an argument." >&2 exit 1 fi } print_usage() { echo "Usage: $0 [options] Options: -h, --help -l, --view-log -d, --disable -e, --enable -s, --status -j, --use-joystick -m, --use-mouse --vr-lite-invert-x, --no-vr-lite-invert-x --vr-lite-invert-y, --no-vr-lite-invert-y --gamescope-reshade-wayland, --no-gamescope-reshade-wayland -ms, --mouse-sensitivity [sensitivity_value] --look-ahead-ms [milliseconds] -dz, --deadzone-threshold-degrees [threshold_degrees] --multi-tap, --no-multi-tap -ds, --display-size [display_size] -dd, --display-distance [display_distance] -em, --external-mode -de, --disable-external -vd, --virtual-display -bd, --breezy-desktop --opentrack-app -sv, --sideview -svp, --sideview-position [top_left|top_right|bottom_left|bottom_right] --smooth-follow, --no-smooth-follow -sft, --smooth-follow-threshold [threshold_value] --curved-display, --no-curved-display --smooth-follow-track-roll, --no-smooth-follow-track-roll --smooth-follow-track-pitch, --no-smooth-follow-track-pitch --smooth-follow-track-yaw, --no-smooth-follow-track-yaw -sbsms, --sbs-mode-stretched, --no-sbs-mode-stretched -sbs3d, --sbs-content-3d, --no-sbs-content-3d -nsh, --neck-saver-horizontal [multiplier] -nsv, --neck-saver-vertical [multiplier] --opentrack-app-ip [ip] --opentrack-app-port [port] --opentrack-listener, --no-opentrack-listener --opentrack-listen-ip [ip] --opentrack-listen-port [port] --metrics, --no-metrics --request-token [email] --verify-token [token] --refresh-license --get-hardware-id" } if [ $# -eq 0 ]; then print_usage exit 0 fi if [ -n "$1" ]; then if ! command -v getopt >/dev/null 2>&1; then echo "Error: getopt utility not found. Install getopt to use this CLI." >&2 exit 1 fi normalized_args=() for arg in "$@"; do case "$arg" in -ms) normalized_args+=("--mouse-sensitivity") ;; -dz) normalized_args+=("--deadzone-threshold-degrees") ;; -ds) normalized_args+=("--display-size") ;; -dd) normalized_args+=("--display-distance") ;; -em) normalized_args+=("--external-mode") ;; -de) normalized_args+=("--disable-external") ;; -vd) normalized_args+=("--virtual-display") ;; -bd) normalized_args+=("--breezy-desktop") ;; -sv) normalized_args+=("--sideview") ;; -svp) normalized_args+=("--sideview-position") ;; -sft) normalized_args+=("--smooth-follow-threshold") ;; -sbsms) normalized_args+=("--sbs-mode-stretched") ;; -sbs3d) normalized_args+=("--sbs-content-3d") ;; -nsh) normalized_args+=("--neck-saver-horizontal") ;; -nsv) normalized_args+=("--neck-saver-vertical") ;; *) normalized_args+=("$arg") ;; esac done PARSED=$(getopt -o hldesjm --long help,view-log,disable,enable,status,use-joystick,use-mouse,vr-lite-invert-x,no-vr-lite-invert-x,vr-lite-invert-y,no-vr-lite-invert-y,gamescope-reshade-wayland,no-gamescope-reshade-wayland,mouse-sensitivity:,look-ahead-ms:,deadzone-threshold-degrees:,debug:,display-size:,display-distance:,external-mode,disable-external,virtual-display,breezy-desktop,opentrack-app,sideview,sideview-position:,smooth-follow,no-smooth-follow,smooth-follow-threshold:,curved-display,no-curved-display,smooth-follow-track-roll,no-smooth-follow-track-roll,smooth-follow-track-pitch,no-smooth-follow-track-pitch,smooth-follow-track-yaw,no-smooth-follow-track-yaw,sbs-mode-stretched,no-sbs-mode-stretched,sbs-content-3d,no-sbs-content-3d,multi-tap,no-multi-tap,neck-saver-horizontal:,neck-saver-vertical:,opentrack-app-ip:,opentrack-app-port:,opentrack-listener,no-opentrack-listener,opentrack-listen-ip:,opentrack-listen-port:,metrics,no-metrics,request-token:,verify-token:,refresh-license,get-hardware-id -- "${normalized_args[@]}") if [ $? -ne 0 ]; then exit 1 fi eval set -- "$PARSED" default_config_file="$CONFIG_DIR/config.ini" state_config_file="/dev/shm/xr_driver_state" while true; do case "$1" in -h|--help) print_usage exit 0 ;; -l|--view-log) less +F "$LOG_FILE" exit 0 ;; -d|--disable) process_config "$default_config_file" "disabled" "true" shift ;; -e|--enable) process_config "$default_config_file" "disabled" "false" shift ;; -s|--status) process_config "$default_config_file" "disabled" "" "" shift ;; -j|--use-joystick) process_config "$default_config_file" "output_mode" "joystick" "string" "external_mode" "none" shift ;; -m|--use-mouse) process_config "$default_config_file" "output_mode" "mouse" "string" "external_mode" "none" shift ;; --vr-lite-invert-x) process_config "$default_config_file" "vr_lite_invert_x" "true" shift ;; --no-vr-lite-invert-x) process_config "$default_config_file" "vr_lite_invert_x" "false" shift ;; --vr-lite-invert-y) process_config "$default_config_file" "vr_lite_invert_y" "true" shift ;; --no-vr-lite-invert-y) process_config "$default_config_file" "vr_lite_invert_y" "false" shift ;; --gamescope-reshade-wayland) process_config "$default_config_file" "gamescope_reshade_wayland_disabled" "false" shift ;; --no-gamescope-reshade-wayland) process_config "$default_config_file" "gamescope_reshade_wayland_disabled" "true" shift ;; --mouse-sensitivity) require_arg "$1" "$2" process_config "$default_config_file" "mouse_sensitivity" "$2" "string" shift 2 ;; --look-ahead-ms) require_arg "$1" "$2" process_config "$default_config_file" "look_ahead" "$2" "string" shift 2 ;; --deadzone-threshold-degrees) require_arg "$1" "$2" process_config "$default_config_file" "dead_zone_threshold_deg" "$2" "string" shift 2 ;; --debug) require_arg "$1" "$2" process_config "$default_config_file" "debug" "$2" "string" shift 2 ;; --display-size) require_arg "$1" "$2" process_config "$default_config_file" "display_size" "$2" "string" shift 2 ;; --display-distance) require_arg "$1" "$2" process_config "$default_config_file" "display_distance" "$2" "string" shift 2 ;; --external-mode) process_config "$default_config_file" "external_mode" "" "string" shift ;; --disable-external) process_config "$default_config_file" "external_mode" "none" "string" shift ;; --virtual-display) process_config "$default_config_file" "output_mode" "external_only" "string" "external_mode" "virtual_display" shift ;; --breezy-desktop) process_config "$default_config_file" "output_mode" "external_only" "string" "external_mode" "breezy_desktop" shift ;; --opentrack-app) process_config "$default_config_file" "output_mode" "external_only" "string" "external_mode" "opentrack" shift ;; --sideview) process_config "$default_config_file" "output_mode" "external_only" "string" "external_mode" "sideview" shift ;; --sideview-position) require_arg "$1" "$2" process_config "$default_config_file" "sideview_position" "$2" "string" shift 2 ;; --smooth-follow) process_config "$default_config_file" "sideview_smooth_follow_enabled" "true" shift ;; --no-smooth-follow) process_config "$default_config_file" "sideview_smooth_follow_enabled" "false" shift ;; --smooth-follow-threshold) require_arg "$1" "$2" process_config "$default_config_file" "sideview_follow_threshold" "$2" "string" shift 2 ;; --curved-display) process_config "$default_config_file" "curved_display" "true" shift ;; --no-curved-display) process_config "$default_config_file" "curved_display" "false" shift ;; --smooth-follow-track-roll) process_config "$default_config_file" "smooth_follow_track_roll" "true" shift ;; --no-smooth-follow-track-roll) process_config "$default_config_file" "smooth_follow_track_roll" "false" shift ;; --smooth-follow-track-pitch) process_config "$default_config_file" "smooth_follow_track_pitch" "true" shift ;; --no-smooth-follow-track-pitch) process_config "$default_config_file" "smooth_follow_track_pitch" "false" shift ;; --smooth-follow-track-yaw) process_config "$default_config_file" "smooth_follow_track_yaw" "true" shift ;; --no-smooth-follow-track-yaw) process_config "$default_config_file" "smooth_follow_track_yaw" "false" shift ;; --sbs-mode-stretched) process_config "$default_config_file" "sbs_mode_stretched" "true" "string" shift ;; --no-sbs-mode-stretched) process_config "$default_config_file" "sbs_mode_stretched" "false" "string" shift ;; --sbs-content-3d) process_config "$default_config_file" "sbs_content" "true" "string" shift ;; --no-sbs-content-3d) process_config "$default_config_file" "sbs_content" "false" "string" shift ;; --neck-saver-horizontal) require_arg "$1" "$2" process_config "$default_config_file" "neck_saver_horizontal_multiplier" "$2" "string" shift 2 ;; --neck-saver-vertical) require_arg "$1" "$2" process_config "$default_config_file" "neck_saver_vertical_multiplier" "$2" "string" shift 2 ;; --opentrack-app-ip) require_arg "$1" "$2" process_config "$default_config_file" "opentrack_app_ip" "$2" "string" shift 2 ;; --opentrack-app-port) require_arg "$1" "$2" process_config "$default_config_file" "opentrack_app_port" "$2" "string" shift 2 ;; --opentrack-listener) process_config "$default_config_file" "opentrack_listener_enabled" "true" shift ;; --no-opentrack-listener) process_config "$default_config_file" "opentrack_listener_enabled" "false" shift ;; --opentrack-listen-ip) require_arg "$1" "$2" process_config "$default_config_file" "opentrack_listen_ip" "$2" "string" shift 2 ;; --opentrack-listen-port) require_arg "$1" "$2" process_config "$default_config_file" "opentrack_listen_port" "$2" "string" shift 2 ;; --multi-tap) process_config "$default_config_file" "multi_tap_enabled" "true" shift ;; --no-multi-tap) process_config "$default_config_file" "multi_tap_enabled" "false" shift ;; --metrics) process_config "$default_config_file" "metrics_disabled" "false" shift ;; --no-metrics) process_config "$default_config_file" "metrics_disabled" "true" shift ;; --request-token) require_arg "$1" "$2" process_config "$state_config_file" "hardware_id" "" "string" "" "" "request" "$2" shift 2 ;; --verify-token) require_arg "$1" "$2" process_config "$state_config_file" "hardware_id" "" "string" "" "" "verify" "$2" shift 2 ;; --refresh-license) process_config "$state_config_file" "hardware_id" "" "string" "" "" "refresh" shift ;; --get-hardware-id) process_config "$state_config_file" "hardware_id" "" "string" "" "" "get" shift ;; --) shift break ;; *) break ;; esac done fi ================================================ FILE: bin/xr_driver_logs ================================================ #!/usr/bin/env bash # exit when any command fails set -e if [ "$(id -u)" == "0" ]; then echo "This script must not be run as root" 1>&2 exit 1 fi XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" # Determine the directory containing this script as invoked. # This makes the script packaging-friendly (e.g. distro/AUR installs), since # companion scripts are expected to be installed alongside it. script_ref="$0" if [[ "$script_ref" != */* ]]; then script_ref="$(command -v -- "$script_ref" 2>/dev/null || echo "$script_ref")" fi script_dir="$(cd -P -- "$(dirname -- "$script_ref")" && pwd -P)" # Create a temp directory to gather logs tmp_dir=$(mktemp -d -t xr-driver-logs-XXXXXXXXXX) echo "Gathering logs into temp directory: ${tmp_dir}" mkdir -p "$tmp_dir/xr_driver_logs" # Copy XR driver log if [ -f "$XDG_STATE_HOME/xr_driver/driver.log" ]; then cp "$XDG_STATE_HOME/xr_driver/driver.log" "$tmp_dir/xr_driver_logs/driver.log" else echo "Warning: XR driver log not found at $XDG_STATE_HOME/xr_driver/driver.log" fi # Copy XR driver config if [ -f "$HOME/.config/xr_driver/config.ini" ]; then cp "$HOME/.config/xr_driver/config.ini" "$tmp_dir/xr_driver_logs/config.ini" else echo "Warning: XR driver config not found at $HOME/.config/xr_driver/config.ini" fi copy_breezy_logs() { if [ ! -d "$script_dir" ]; then return 0 fi local breezy_scripts breezy_scripts=$(find "$script_dir" -maxdepth 1 -type f -name 'breezy_*_logs' -perm -u+x -print 2>/dev/null || true) if [ -z "$breezy_scripts" ]; then return 0 fi while IFS= read -r script_path; do [ -z "$script_path" ] && continue local script_name script_name=$(basename "$script_path") echo "Running $script_name to collect Breezy logs" local run_dir run_dir=$(mktemp -d -p "$tmp_dir" breezy-run-XXXXXXXXXX) set +e (cd "$run_dir" && "$script_path") local rc=$? set -e if [ "$rc" -ne 0 ]; then echo "Warning: $script_name exited with code $rc" rm -rf "$run_dir" continue fi local archive archive=$(find "$run_dir" -maxdepth 1 -type f -name '*.tar.gz' -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -n 1 | cut -d' ' -f2-) if [ -z "$archive" ]; then echo "Warning: $script_name did not produce a .tar.gz archive" rm -rf "$run_dir" continue fi cp "$archive" "$tmp_dir/xr_driver_logs/" rm -rf "$run_dir" done <<< "$breezy_scripts" } copy_breezy_logs # Create archive archive_name="xr_driver_logs_$(date +%Y%m%d_%H%M%S).tar.gz" tar -czf "$archive_name" -C "$tmp_dir" xr_driver_logs echo "Created log archive: $(pwd)/$archive_name" rm -rf "$tmp_dir" ================================================ FILE: bin/xr_driver_ot_profile_setup ================================================ #!/usr/bin/env bash set -euo pipefail default_ini="" # Pick the newest ~/.config/opentrack-*/default.ini. shopt -s nullglob candidates=("${HOME}/.config"/opentrack-*/default.ini) shopt -u nullglob if [[ ${#candidates[@]} -gt 0 ]]; then # Sort naturally (version-like) and take the last. default_ini="$(printf '%s\n' "${candidates[@]}" | sort -V | tail -n 1)" fi if [[ -z "$default_ini" ]]; then cat >&2 <"$tmp" <<'EOF' [modules] filter-dll=nm protocol-dll=udp tracker-dll=neuralnet [opentrack-mappings] x-max-output-value=-100 x-max-value=100 y-max-output-value=-100 y-max-value=100 z-max-output-value=-100 z-max-value=100 [opentrack-ui] pitch-invert-sign=true roll-invert-sign=true x-invert-sign=true x-source-index=0 y-source-index=1 yaw-invert-sign=true z-source-index=2 [udp-proto] ip1=127 ip2=0 ip3=0 ip4=1 EOF chmod 0644 "$tmp" 2>/dev/null || true mv -f "$tmp" "$dst" echo "xr-driver profile created. Launch opentrack and choose "xr-driver.ini" from the Profile menu." ================================================ FILE: bin/xr_driver_setup ================================================ #!/usr/bin/env bash # This setup script should do the minimum work required to download the release package, unzip it, and kick off the # setup script contained within. # exit when any command fails set -e # Make sure only root can run our script if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi check_command() { if ! command -v "$1" &>/dev/null; then echo "Please install \"$1\" and make sure it's available in your \$PATH, then rerun the setup." exit 1 fi } check_command "curl" ARCH=$(uname -m) start_dir=$(pwd) # create temp directory tmp_dir=$(mktemp -d -t xr-driver-XXXXXXXXXX) pushd $tmp_dir > /dev/null echo "Created temp directory: ${tmp_dir}" binary_download_url="https://github.com/wheaney/XRLinuxDriver/releases/latest/download/xrDriver-$ARCH.tar.gz" lib_download_url="https://github.com/wheaney/XRLinuxDriver/releases/latest/download/xrDriver-libs-$ARCH.tar.gz" if [ "$1" = "-v" ] then metrics_version="$2" local_dir_arg="$3" elif [ "$1" = "--tag" ] && [ -n "$2" ] then binary_download_url="https://github.com/wheaney/XRLinuxDriver/releases/download/$2/xrDriver-$ARCH.tar.gz" lib_download_url="https://github.com/wheaney/XRLinuxDriver/releases/download/$2/xrDriver-libs-$ARCH.tar.gz" else local_dir_arg="$1" fi # Handle local directory if provided if [ -n "$local_dir_arg" ] then # Convert relative path to absolute path if [[ "$local_dir_arg" = /* ]]; then local_dir="$local_dir_arg" else local_dir=$(realpath "$start_dir/$local_dir_arg") fi # Check for driver archive in the local directory binary_path_arg="$local_dir/xrDriver-$ARCH.tar.gz" if [ ! -f "$binary_path_arg" ]; then echo "Error: Driver archive not found at $binary_path_arg" exit 1 fi # Check for lib archive in the local directory lib_path_arg="$local_dir/xrDriver-libs-$ARCH.tar.gz" if [ ! -f "$lib_path_arg" ]; then echo "Error: Lib archive not found at $lib_path_arg" YELLOW='\e[1;33m' RESET='\e[0m' echo -e "\n${YELLOW}IMPORTANT${RESET}: Be sure you're using the latest version of the setup script\n" exit 1 fi fi if [ -z "$binary_path_arg" ] then # download and unzip the latest driver binary_path_arg="xrDriver-$ARCH.tar.gz" echo "Downloading to: ${tmp_dir}/$binary_path_arg" curl -L "$binary_download_url" > "$binary_path_arg" else cp $binary_path_arg $tmp_dir fi echo "Extracting to: ${tmp_dir}/xr_driver" tar -xf $(basename $binary_path_arg) # Handle lib archive if [ -z "$lib_path_arg" ] then # download and unzip the latest lib archive lib_path_arg="xrDriver-libs-$ARCH.tar.gz" echo "Downloading to: ${tmp_dir}/$lib_path_arg" curl -L "$lib_download_url" > "$lib_path_arg" else cp $lib_path_arg $tmp_dir fi echo "Extracting lib to: ${tmp_dir}/xr_driver/lib" tar -xf $(basename $lib_path_arg) # Move lib files to xr_driver/lib subdirectory mkdir -p xr_driver/lib mv xr_driver_lib/* xr_driver/lib/ rmdir xr_driver_lib pushd xr_driver > /dev/null # run the setup script that comes with this release, pass in the metrics version ./setup $metrics_version echo "Deleting temp directory: ${tmp_dir}" rm -rf $tmp_dir cd "$(dirs -l -0)" && dirs -c ================================================ FILE: bin/xr_driver_uninstall ================================================ #!/usr/bin/env bash for_install=0 if [[ -n "$1" ]] && [[ "$1" == "--for-install" ]]; then for_install=1 fi # we don't want the uninstall script to be able to cause a failure if being triggered by the setup script [ "$for_install" -eq 0 ] && set -e # Get the directory of the current script script_dir=$(dirname "$0") USER=${SUDO_USER:-$USER} USER_HOME=$(getent passwd $USER | cut -d: -f6) if [ -z "$XDG_DATA_HOME" ]; then XDG_DATA_HOME="$USER_HOME/.local/share" fi SYSTEMD_DATA_DIR="$XDG_DATA_HOME/systemd" SYSTEMD_USER_DIR="$SYSTEMD_DATA_DIR/user" DATA_DIR="$XDG_DATA_HOME/xr_driver" if [ -z "$XDG_CONFIG_HOME" ]; then XDG_CONFIG_HOME="$USER_HOME/.config" fi CONFIG_DIR="$XDG_CONFIG_HOME/xr_driver" if [ -z "$XDG_BIN_HOME" ]; then XDG_BIN_HOME="$USER_HOME/.local/bin" fi OLD_BIN_DIR="$USER_HOME/bin" BIN_DIR="$XDG_BIN_HOME" if [ -z "$XDG_STATE_HOME" ]; then XDG_STATE_HOME="$USER_HOME/.local/state" fi STATE_DIR="$XDG_STATE_HOME/xr_driver" [ "$for_install" -eq 0 ] && echo "Removing the systemd service" # if this is root if [ "$(id -u)" == "0" ]; then export XDG_RUNTIME_DIR=/run/user/$(id -u $USER) if su -l -c "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR systemctl --user is-active --quiet xr-driver" $USER; then su -l -c "XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR systemctl --user stop xr-driver" $USER fi else if systemctl --user is-active --quiet xr-driver; then systemctl --user stop xr-driver fi fi [ "$for_install" -eq 0 ] && echo "Removing the systemd service from ${SYSTEMD_USER_DIR}" rm -f $SYSTEMD_USER_DIR/xr-driver.service UDEV_RULES_DIR="/usr/lib/udev/rules.d" ALT_UDEV_RULES_DIR="/etc/udev/rules.d" [ "$for_install" -eq 0 ] && echo "Removing the udev rules from ${UDEV_RULES_DIR} or ${ALT_UDEV_RULES_DIR}" sudo rm $UDEV_RULES_DIR/70-*-xr.rules > /dev/null 2>&1 || true sudo rm $ALT_UDEV_RULES_DIR/70-*-xr.rules > /dev/null 2>&1 || true if [ "$for_install" -eq 0 ]; then echo "Removing installed files from $STATE_DIR, $CONFIG_DIR, $DATA_DIR, and $BIN_DIR" UA_EVENT_NAME="uninstall" UA_CLIENT_ID="ARLinuxDriver" #INJECT_UA_CALL rm -rf $STATE_DIR rm -rf $CONFIG_DIR fi rm -rf $DATA_DIR rm -f $BIN_DIR/xrDriver rm -f $BIN_DIR/xr_driver_cli rm -f $BIN_DIR/xr_driver_verify rm -f $BIN_DIR/xr_driver_logs rm -f /tmp/shader_runtime_* rm -f /dev/shm/xr_* rm -f /dev/shm/breezy_desktop_imu # this script is self-deleting, leave this as the last command # remove the one we're not using first if [ "$script_dir" = "$OLD_BIN_DIR" ]; then rm -f "$BIN_DIR/xr_driver_uninstall" rm -f "$OLD_BIN_DIR/xreal_driver_uninstall" else rm -f "$OLD_BIN_DIR/xreal_driver_uninstall" rm -f "$BIN_DIR/xr_driver_uninstall" fi ================================================ FILE: bin/xr_driver_verify ================================================ #!/usr/bin/env bash set -e USER=${SUDO_USER:-$USER} USER_HOME=$(getent passwd $USER | cut -d: -f6) if [ -z "$XDG_DATA_HOME" ]; then XDG_DATA_HOME="$USER_HOME/.local/share" fi DATA_DIR="$XDG_DATA_HOME/xr_driver" if [ ! -e "$DATA_DIR/manifest" ]; then echo "Verification failed" >&2 exit 1 fi # Get the directory of the current script script_dir=$(dirname "$0") # create a string to string mapping, file name to expected file location declare -A file_paths file_paths=( ["xrDriver"]="{bin_dir}/xrDriver" ["xr_driver_cli"]="{bin_dir}/xr_driver_cli" ["xr_driver_uninstall"]="{bin_dir}/xr_driver_uninstall" ["xr_driver_logs"]="{bin_dir}/xr_driver_logs" ) # verify the file hashes in ./manifest while IFS= read -r line do # split the line into hash and filename manifest_hash=$(echo $line | awk '{print $1}') file=$(echo $line | awk '{print $2}') actual_file_path=${file_paths[$file]} # compute the SHA256 hash of the actual file actual_hash=$(sha256sum $actual_file_path | awk '{print $1}') # compare the hashes if ! [ "$manifest_hash" = "$actual_hash" ]; then echo "Verification failed" >&2 exit 1 fi done < "$DATA_DIR/manifest" echo "Verification succeeded" ================================================ FILE: docker-build/Dockerfile ================================================ # To run the build from the package root: # docker buildx build --platform linux/amd64,linux/arm64 -f ./docker-build/Dockerfile -t "xr-driver" . # docker run --rm -t -v ./:/source -v --platform linux/amd64 "xr-driver:amd64" # docker run --rm -t -v ./:/source -v --platform linux/arm64 "xr-driver:arm64" FROM --platform=$TARGETPLATFORM debian:stable-20250428-slim ARG TARGETPLATFORM RUN echo "Target platform: $TARGETPLATFORM" RUN apt-get update && apt-get install -y \ build-essential \ cmake \ pkg-config \ libudev-dev \ libusb-1.0-0-dev \ libcurl4-openssl-dev \ libevdev-dev \ libssl-dev \ libjson-c-dev \ python3 \ python3-yaml \ libwayland-dev \ cargo \ rustc \ git \ && rm -rf /var/lib/apt/lists/* WORKDIR /source CMD bin/package ================================================ FILE: docker-build/Dockerfile.aarch64 ================================================ # To run the build from the package root: # docker buildx build --platform linux/amd64,linux/arm64 -f ./docker-build/Dockerfile -t "xr-driver" . # docker run --rm -t -v ./:/source -v --platform linux/amd64 "xr-driver:amd64" # docker run --rm -t -v ./:/source -v --platform linux/arm64 "xr-driver:arm64" # Support Raspberry Pi OS Bookworm (64-bit) and later FROM --platform=$TARGETPLATFORM debian:bookworm-slim ARG TARGETPLATFORM RUN echo "Target platform: $TARGETPLATFORM" ARG RUST_TOOLCHAIN=stable ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ build-essential \ cmake \ pkg-config \ libudev-dev \ libusb-1.0-0-dev \ libcurl4-openssl-dev \ libevdev-dev \ libssl-dev \ libjson-c-dev \ python3 \ python3-yaml \ libwayland-dev \ ca-certificates \ curl \ xz-utils \ git \ && rm -rf /var/lib/apt/lists/* ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH RUN set -eux; \ curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain "${RUST_TOOLCHAIN}"; \ rustc --version; \ cargo --version WORKDIR /source CMD bin/package ================================================ FILE: docker-build/init.sh ================================================ #!/bin/bash # might be needed on a fresh docker setup: # install qemu and qemu-user-static packages # sudo docker context rm default docker run --privileged --rm tonistiigi/binfmt --install all sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes if [[ "$1" == "--init" || ! $(docker buildx inspect xrdriverbuilder &>/dev/null; echo $?) -eq 0 ]]; then # start fresh echo "Creating new docker builder instance" docker buildx rm xrdriverbuilder 2>/dev/null || true docker buildx create --use --name xrdriverbuilder --driver docker-container --driver-opt image=moby/buildkit:latest else echo "Using existing docker builder instance" docker buildx use xrdriverbuilder fi echo "Building docker image" docker buildx build --platform linux/amd64 -f ./docker-build/Dockerfile -t "xr-driver:amd64" --load . docker buildx build --platform linux/arm64 -f ./docker-build/Dockerfile.aarch64 -t "xr-driver:arm64" --load . ================================================ FILE: docker-build/run-build.sh ================================================ #!/bin/bash set -e USER=${SUDO_USER:-$USER} GROUP=$(id -gn $USER) # Run containers for each architecture if [[ "$1" == "x86_64" || -z "$1" ]]; then sudo rm -rf build/ docker run --rm -t -v ./:/source --platform linux/amd64 -e STEAMOS -e UA_API_SECRET -e UA_API_SECRET_INTENTIONALLY_EMPTY "xr-driver:amd64" sudo chown -R $USER:$GROUP out/ fi if [[ "$1" == "aarch64" || -z "$1" ]]; then sudo rm -rf build/ docker run --rm -t -v ./:/source --platform linux/arm64 -e UA_API_SECRET -e UA_API_SECRET_INTENTIONALLY_EMPTY "xr-driver:arm64" sudo chown -R $USER:$GROUP out/ fi # build directory structure is all owned by root because of docker, delete it all now sudo rm -rf build/ ================================================ FILE: docker-build/run-fpm.sh ================================================ #!/usr/bin/env bash set -e function libs_to_fpm_args { local lib_dir=$1 local fpm_args="" for lib in $(ls $lib_dir); do fpm_args="$fpm_args lib/$lib=/usr/lib/$lib" done echo $fpm_args } function udev_files_to_fpm_args { local udev_dir=$1 local fpm_args="" for udev_file in $(ls $udev_dir); do fpm_args="$fpm_args udev/$udev_file=/usr/lib/udev/rules.d/$udev_file" done echo $fpm_args } # parse the version from the CMakeLists.txt file version=$(grep -oP 'project\(xrDriver VERSION \K[0-9]+\.[0-9]+\.[0-9]+' CMakeLists.txt) # Run containers for each architecture if [[ "$1" == "x86_64" || -z "$1" ]]; then sudo rm -rf build/ docker run --rm -t -v ./:/source --platform linux/amd64 -e UA_API_SECRET -e UA_API_SECRET_INTENTIONALLY_EMPTY "xr-driver:amd64" ./fpm/build lib_args=$(libs_to_fpm_args "build/xr_driver/lib") udev_args=$(udev_files_to_fpm_args "build/xr_driver/udev") fpm --architecture x86_64 --version $version \ -t deb \ --no-auto-depends \ --depends libssl3 \ --depends libevdev2 \ --depends libusb-1.0-0 \ --depends libjson-c5 \ --depends libcurl4 \ --depends libwayland-client0 \ --depends libsystemd0 \ $lib_args $udev_args # this fails without my fix in https://github.com/jordansissel/fpm/pull/2082 fpm --architecture x86_64 --version $version \ -t rpm \ --no-auto-depends \ --depends openssl-libs \ --depends libevdev \ --depends libusbx \ --depends json-c \ --depends libcurl \ --depends libwayland-client \ --depends systemd-libs \ $lib_args $udev_args fi if [[ "$1" == "aarch64" || -z "$1" ]]; then sudo rm -rf build/ docker run --rm -t -v ./:/source --platform linux/arm64 -e UA_API_SECRET -e UA_API_SECRET_INTENTIONALLY_EMPTY "xr-driver:arm64" ./fpm/build lib_args=$(libs_to_fpm_args "build/xr_driver/lib") udev_args=$(udev_files_to_fpm_args "build/xr_driver/udev") fpm --architecture aarch64 --version $version \ -t deb \ --no-auto-depends \ --depends libssl3 \ --depends libevdev2 \ --depends libusb-1.0-0 \ --depends libjson-c5 \ --depends libcurl4 \ --depends libwayland-client0 \ --depends libsystemd0 \ $lib_args $udev_args # this fails without my fix in https://github.com/jordansissel/fpm/pull/2082 fpm --architecture aarch64 --version $version \ -t rpm \ --no-auto-depends \ --depends openssl-libs \ --depends libevdev \ --depends libusbx \ --depends json-c \ --depends libcurl \ --depends libwayland-client \ --depends systemd-libs \ $lib_args $udev_args fi mv xr-driver*.deb out/ mv xr-driver*.rpm out/ # build directory structure is all owned by root because of docker, delete it all now sudo rm -rf build/ ================================================ FILE: docs/6dof-from-3dof-opentrack-neuralnet.md ================================================ # Getting 6DoF from 3DoF glasses (OpenTrack + NeuralNet) This guide describes how to get **6DoF positional tracking** from any supported **3DoF glasses** by combining: - **XR Linux Driver** (for the glasses’ 3DoF IMU + runtime) - **OpenTrack** (for filtering/mapping and UDP output) - **NeuralNet Tracker** (OpenTrack input, for camera-based position tracking) The high-level idea: 1. Have XR Linux Driver consume a pose orientation from a set of 3DoF glasses acting as a "primary" device. 2. Use a webcam + NeuralNet in OpenTrack to estimate a 6DoF pose, including **position** (XYZ). 3. Have XR Linux Driver’s **OpenTrack listener** ingest that pose as a synthetic "supplemental" device. 4. Merge the glasses' 3DoF orientation + OpenTrack's 6DoF position for use with Breezy Desktop, XR Gaming, or other external applications. ## Prereqs - A working XR Linux Driver install (if you're installed Breezy Desktop or XR Gaming, you already have this) - A webcam (for NeuralNet position tracking) ## Install OpenTrack (+ NeuralNet input) ### Use the experimental AppImage I have an experimental AppImage CI build that may prevent the need for a more complicated installation on your system. 1. Visit [the latest wheaney/opentrack-appimage-ci Release](https://github.com/wheaney/opentrack-appimage-ci/releases/latest) and download the ONNX-GPU build. 2. If you've ever launched another version of OpenTrack on this machine before, you may want to delete (backup first, if you want) the config files found with `find ~/.config/opentrack-*`. 3. If you plan on kicking it off from the command line (better to see log output, if debugging), first set the execute flag on the file: `chmod +x ~/Downloads/OpenTrack-*.AppImage` 4. Run it. 5. If it doesn't work (or the `Start` button causes an error later on in the instructions), you might want to try the ONNX-CPU build. Otherwise, you'll need to try to install via your package manager. ### Setup via package manager OpenTrack won't typically come with NeuralNet out of the box. You'll need to make sure the appropriate `onnxruntime` is installed. Look up the necessary OpenTrack and ONNX runtime package names for your package manager and install them. For ONNX you may be able to choose between CPU and GPU variants; it's up to you which to choose but CPU is the easiest choice and it won't typically be very demanding from a resource perspective. #### Arch Linux installation example ```bash sudo pacman -S onnxruntime yay -S opentrack ``` ## Apply the recommended OpenTrack profile (one-liner) This script configures an OpenTrack profile tuned for the XR Linux Driver listener. Before running this script, you will need to launch OpenTrack at least once to create the default profile. ```bash curl -fsSL https://github.com/wheaney/XRLinuxDriver/releases/latest/download/xr_driver_ot_profile_setup | bash ``` Note: piping a remote script to `bash` trades convenience for auditability. If you prefer to review it first, download it and inspect before running. ## Enable the XR Linux Driver OpenTrack listener Enable the listener (input): ```bash xr_driver_cli --opentrack-listener ``` If you changed the OpenTrack UDP output port, update the listener to match: ```bash xr_driver_cli --opentrack-listen-port 4242 ``` ## Run it 1. Plug in your glasses first (confirm normal **3DoF** tracking is working). 2. Launch OpenTrack and select the Profile named "xr-driver.ini". Hit the settings icon next to the NeuralNet input and make sure the appropriate camera is selected, set the `Diagonal FOV` and `Resolution` values to match your camera. 3. Click **Start** in OpenTrack. 4. Launch Breezy Desktop and enable the effect. You should now be able to lean in to see a closer view of your screens. **Note** - This will also be available in a future update of XR Gaming, if you've set up your deck with a webcam or you're sending the UDP data over the network. ## Troubleshooting - View XR Linux Driver logs: ```bash xr_driver_cli --view-log ``` - Confirm the listener is bound: ```bash ss -u -lpn | grep 4242 ``` - If OpenTrack is running but the listener never “connects”, double-check: - OpenTrack output is **UDP over network** - remote IP/port match the listener’s bind port - you didn’t accidentally enable XR Linux Driver’s OpenTrack **app/output** mode at the same time (see the feedback-loop guard notes in the listener page) ================================================ FILE: docs/development.md ================================================ # Development (Docker Buildx) This repo includes a Docker-based build pipeline that produces release artifacts for multiple architectures using Docker **Buildx**. The main scripts are: - `docker-build/init.sh`: sets up a Buildx builder and builds the per-arch build images - `docker-build/run-build.sh`: runs the build inside those images and writes artifacts to `out/` - *Needs work* `docker-build/run-fpm.sh`: runs the build and produces `.deb` / `.rpm` packages (written to `out/`) ## Requirements - Docker - Docker Buildx (`docker buildx version` should work) For cross-arch builds (e.g. building `linux/arm64` on an x86_64 machine), you also need binfmt/qemu emulation enabled. The init script will attempt to install this via privileged containers. ## 1) Initialize Buildx + build the build images Run from the repo root: ```bash ./docker-build/init.sh --init ``` This will: - install binfmt/qemu handlers (for cross-arch builds) - create or recreate a Buildx builder named `xrdriverbuilder` - build and `--load` two images locally: - `xr-driver:amd64` - `xr-driver:arm64` If you already have the builder and just want to reuse it, you can run: ```bash ./docker-build/init.sh ``` ## 2) Build artifacts (tarball output) After the images exist, run: ```bash ./docker-build/run-build.sh ``` To build only one architecture: ```bash ./docker-build/run-build.sh x86_64 ./docker-build/run-build.sh aarch64 ``` Build outputs are written under `out/`. Notes: - The build runs in containers, so intermediate files under `build/` may be owned by root; the script cleans `build/` afterwards. - The build passes through `UA_API_SECRET` (and `UA_API_SECRET_INTENTIONALLY_EMPTY`) as environment variables when running containers. ## 3) Build distro packages (.deb / .rpm) If you want Debian/RPM packages, run: ```bash ./docker-build/run-fpm.sh ``` Or per-arch: ```bash ./docker-build/run-fpm.sh x86_64 ./docker-build/run-fpm.sh aarch64 ``` The resulting packages are moved to `out/`. ## Troubleshooting - If `linux/arm64` builds fail on x86_64, rerun init: ```bash ./docker-build/init.sh --init ``` - Confirm Buildx sees the builder: ```bash docker buildx ls docker buildx inspect xrdriverbuilder ``` ================================================ FILE: docs/index.md ================================================ # XR Linux Driver Docs This site documents selected XR Linux Driver features and integrations. ## OpenTrack integrations There are two separate OpenTrack-related components: - **OpenTrack app (output/source):** the driver **sends** pose data over UDP to an OpenTrack instance. - **OpenTrack listener (input):** the driver **receives** pose data over UDP (in the OpenTrack payload format) and exposes it as a synthetic IMU device. ### Quick links - [Mouse / joystick modes](mouse-and-joystick-modes.md) - [OpenTrack app (output/source)](opentrack-app.md) - [OpenTrack listener (input)](opentrack-listener.md) - [6DoF with any supported 3DoF glasses + a webcam (OpenTrack + NeuralNet)](6dof-from-3dof-opentrack-neuralnet.md) - [Development](development.md) ## Where settings live Most configuration is written by `xr_driver_cli` into: - `$XDG_CONFIG_HOME/xr_driver/config.ini` (usually `~/.config/xr_driver/config.ini`) Logs are written to: - `$XDG_STATE_HOME/xr_driver/driver.log` (usually `~/.local/state/xr_driver/driver.log`) Tip: `xr_driver_cli --view-log` tails the log in `less`. ================================================ FILE: docs/mouse-and-joystick-modes.md ================================================ # Mouse / joystick modes XR Linux Driver turns head movement into input that games and apps can use. Most commonly that’s **mouse movement**, but you can also switch to a **virtual joystick** mode. ## Mouse mode (default) Since device movements are converted to mouse movements, they should be recognized by any PC game that supports keyboard/mouse input. This will work most naturally for games where mouse movements is used to control "look"/camera movements. For point-and-click style games, you may want to disable the driver so your glasses act as just a simple display. To adjust sensitivity, use the Decky UI on Steam Deck, or: ```bash xr_driver_cli --mouse-sensitivity 20 ``` If you're using keyboard and mouse to control your games, then the mouse movements from this driver will simply add to your own mouse movements and they should work naturally together. If you're using a game controller, Valve pushes pretty heavily for PC games support mouse input *in addition to* controller input, so you should find that most modern games will just work with this driver straight out of the box. ## Controller mappings (Steam) 1. Open your game's controller configuration in Steam 2. Open the Layouts view 3. Choose a keyboard/mouse template (e.g. "Keyboard (WASD) and Mouse"). Be sure to edit the configuration and set "Gyro Behavior" to "As Mouse" for any games where you want to use gyro. ## Controller mappings (non-Steam) You'll probably want to use a utility that does what Steam's controller layouts are doing behind the scenes: mapping controller buttons, joystick, and gyro inputs to keyboard/mouse inputs. One popular tool is [JoyShockMapper](https://github.com/Electronicks/JoyShockMapper). ## Joystick mode If mouse input just won't work for a specific game, you can enable joystick mode using the Decky UI on Steam Deck, or: ```bash xr_driver_cli --use-joystick ``` Revert back to mouse mode with: ```bash xr_driver_cli --use-mouse ``` Joystick mode creates a virtual gamepad whose right joystick is driven by movements from the glasses. Notes: - Joystick movement is capped (you can only move a joystick so far). - This creates a *second* controller on your PC. - If the game interprets another controller as a second player, its movements won't get combined with your real controller's movements. ================================================ FILE: docs/opentrack-app.md ================================================ # OpenTrack app (output/source) The **OpenTrack app** integration makes the driver send pose data over UDP in an OpenTrack-compatible payload format. This is useful when you want to consume the driver’s tracking in other applications via OpenTrack’s ecosystem (mappings, output protocols, etc.). ## Enable it (via `xr_driver_cli`) Enable the OpenTrack external mode (this sets `output_mode=external_only` and `external_mode=opentrack`): ```bash xr_driver_cli --opentrack-app ``` Configure the UDP target (where OpenTrack is listening): ```bash xr_driver_cli --opentrack-app-ip 127.0.0.1 xr_driver_cli --opentrack-app-port 4242 ## OpenTrack side setup On the OpenTrack machine: 1. Configure OpenTrack to **receive** UDP pose data (exact UI wording varies by OpenTrack version). 2. Set the listening **port** to match `--opentrack-app-port` (default: `4242`). 3. If OpenTrack is on a different machine, make sure firewalls allow inbound UDP on that port. ## Data format and notes The driver sends a UDP packet containing: - 6 × `double`: `(x, y, z, yaw, pitch, roll)` - 1 × `uint32`: frame number Angles are in **degrees**. The implementation converts the driver’s coordinate system into what OpenTrack expects (see the implementation in the OpenTrack source plugin). ## Troubleshooting - Confirm the driver is running: `systemctl --user status xr-driver` - Check logs: `xr_driver_cli --view-log` - Verify packets are being sent (localhost example): ```bash sudo tcpdump -n -i lo udp port 4242 ``` - If nothing arrives in OpenTrack, verify: - the IP/port in `xr_driver_cli --opentrack-app-ip/--opentrack-app-port` - OpenTrack is actually listening on that port - you’re not trying to “receive from yourself” through the listener at the same time (see the listener page for the feedback-loop guard) ================================================ FILE: docs/opentrack-listener.md ================================================ # OpenTrack listener (input) The **OpenTrack listener** integration makes the driver listen for OpenTrack UDP packets and expose them as a **synthetic IMU device** or as a **supplemental device** if a primary IMU device is already connected (see [6DoF from 3DoF](6dof-from-3dof-opentrack-neuralnet.md)). This is primarily useful for: - Feeding externally-tracked pose data into the XR Linux Driver for use with Breezy Desktop or XR Gaming - Testing/debugging pose ingestion without relying on a physical glasses IMU ## Enable it (via `xr_driver_cli`) Turn the listener on: ```bash xr_driver_cli --opentrack-listener ``` Bind address / port: ```bash # Listen on all interfaces (default is typically 0.0.0.0) xr_driver_cli --opentrack-listen-ip 0.0.0.0 # Default port used by the OpenTrack integrations xr_driver_cli --opentrack-listen-port 4242 ``` Disable it: ```bash xr_driver_cli --no-opentrack-listener ``` ### What do these flags change? `xr_driver_cli` writes these keys into `~/.config/xr_driver/config.ini`: - `opentrack_listener_enabled=true|false` - `opentrack_listen_ip=...` - `opentrack_listen_port=...` ## OpenTrack side setup On the machine that will **send** tracking: 1. Configure OpenTrack to **output** pose data via UDP. 2. Set the destination IP to the machine running XR Linux Driver. 3. Set the destination port to match `--opentrack-listen-port` (default: `4242`). If you are sending from another host, ensure UDP traffic on that port is allowed. ## Payload expectations The listener expects packets containing at least: - 6 × `double`: `(x, y, z, yaw, pitch, roll)` It will ignore packets smaller than that. (If your sender includes a trailing frame number, that’s fine — it will be ignored.) Angles are treated as **degrees**. ## Feedback-loop guard (important) The driver also has an OpenTrack **app/output** mode that can send UDP packets. To prevent an accidental “send → receive → send …” feedback loop when both features are enabled on the same machine, the listener will **discard all packets** when: - the listener is enabled, **and** - OpenTrack app/output mode is enabled (`external_mode` includes `opentrack`), **and** - `opentrack_app_ip` is set to a localhost/unspecified address (e.g. `127.0.0.1`, `localhost`, `0.0.0.0`, `::1`, `::`), **and** - `opentrack_app_port` matches `opentrack_listen_port` (both default to `4242`). If you want to use the listener, typically you should: - disable OpenTrack app/output mode: `xr_driver_cli --disable-external` …or run the sender on a different machine. ## Troubleshooting - Check logs: `xr_driver_cli --view-log` - Confirm the socket is bound (example): ```bash ss -u -lpn | grep 4242 ``` - If it binds but never connects, confirm OpenTrack is actually sending UDP packets to the correct IP/port. ================================================ FILE: docs/requirements.txt ================================================ mkdocs>=1.6.0 mkdocs-material>=9.5.0 pymdown-extensions>=10.8 ================================================ FILE: fpm/build ================================================ #!/usr/bin/env bash # exit when any command fails set -e USER=${SUDO_USER:-$USER} GROUP=$(id -gn $USER) source bin/inject_ua if [ -z "$UA_API_SECRET" ] && [ -z "$UA_API_SECRET_INTENTIONALLY_EMPTY" ]; then echo "UA_API_SECRET isn't set. If this is intentional, set UA_API_SECRET_INTENTIONALLY_EMPTY to a non-empty value." exit 1 fi ARCH=$(uname -m) echo "Building for $ARCH" # build the driver BUILD_PATH=build if [ ! -d "$BUILD_PATH" ]; then mkdir $BUILD_PATH fi pushd $BUILD_PATH cmake .. make # create package PACKAGE_DIR=xr_driver PACKAGE_BIN_DIR=$PACKAGE_DIR/bin mkdir -p $PACKAGE_BIN_DIR # copy bin files mv xrDriver $PACKAGE_BIN_DIR cp ../bin/xr_driver_cli $PACKAGE_BIN_DIR # copy the systemd files needed to run our service cp -r ../systemd $PACKAGE_DIR sed -i -e '/ExecStart/c\ExecStart=xrDriver' \ -e '/WantedBy/c\WantedBy=default.target' \ -e '/Environment/d' \ $PACKAGE_DIR/systemd/xr-driver.service cp -r ../udev $PACKAGE_DIR # copy the shared library files if [ ! -d "$PACKAGE_DIR/lib" ]; then mkdir $PACKAGE_DIR/lib fi cp ../lib/$ARCH/*.so $PACKAGE_DIR/lib || true popd exit 0 ================================================ FILE: fpm/postinstall ================================================ #!/usr/bin/env bash if ! lsmod | grep -q uinput; then echo "Setting up uinput kernel module" modprobe uinput fi if [ -x "$(command -v udevadm)" ]; then udevadm control --reload-rules udevadm trigger fi # Try multiple methods to detect the real user SUDO_USER="${SUDO_USER:-}" DBUS_USER="${DBUS_SESSION_BUS_ADDRESS%%,*}" DBUS_USER="${DBUS_USER#unix:user=}" X11_USER=$(who | grep -F '(:0)' | head -n1 | cut -d' ' -f1) # Try each method in order of preference REAL_USER="${SUDO_USER:-${X11_USER:-$DBUS_USER}}" if [ -n "$REAL_USER" ] && [ -x "$(command -v systemctl)" ]; then REAL_UID=$(id -u "$REAL_USER") XDG_RUNTIME_DIR="/run/user/$REAL_UID" echo "Setting up the systemd service for $REAL_USER ($XDG_RUNTIME_DIR)" OUTPUT=$(su -l --shell /bin/sh -c "export XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR; systemctl --user daemon-reload && systemctl --user start xr-driver" "$REAL_USER" 2>&1) EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "Command failed with exit code $EXIT_CODE. Output was:" echo "$OUTPUT" exit $EXIT_CODE fi else echo "Unable to detect user, skipping systemd service restart" echo "Debug info: SUDO_USER=$SUDO_USER, X11_USER=$X11_USER, DBUS_USER=$DBUS_USER" fi exit 0 ================================================ FILE: fpm/postupgrade ================================================ #!/usr/bin/env bash if [ -x "$(command -v udevadm)" ]; then udevadm control --reload-rules udevadm trigger fi # Try multiple methods to detect the real user SUDO_USER="${SUDO_USER:-}" DBUS_USER="${DBUS_SESSION_BUS_ADDRESS%%,*}" DBUS_USER="${DBUS_USER#unix:user=}" X11_USER=$(who | grep -F '(:0)' | head -n1 | cut -d' ' -f1) # Try each method in order of preference REAL_USER="${SUDO_USER:-${X11_USER:-$DBUS_USER}}" if [ -n "$REAL_USER" ] && [ -x "$(command -v systemctl)" ]; then REAL_UID=$(id -u "$REAL_USER") XDG_RUNTIME_DIR="/run/user/$REAL_UID" echo "Setting up the systemd service for $REAL_USER ($XDG_RUNTIME_DIR)" OUTPUT=$(su -l --shell /bin/sh -c "export XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR; systemctl --user daemon-reload && systemctl --user restart xr-driver" "$REAL_USER" 2>&1) EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "Command failed with exit code $EXIT_CODE. Output was:" echo "$OUTPUT" exit $EXIT_CODE fi else echo "Unable to detect user, skipping systemd service restart" fi exit 0 ================================================ FILE: fpm/preinstall ================================================ #!/usr/bin/env bash # Try multiple methods to detect the real user SUDO_USER="${SUDO_USER:-}" DBUS_USER="${DBUS_SESSION_BUS_ADDRESS%%,*}" DBUS_USER="${DBUS_USER#unix:user=}" X11_USER=$(who | grep -F '(:0)' | head -n1 | cut -d' ' -f1) # Try each method in order of preference REAL_USER="${SUDO_USER:-${X11_USER:-$DBUS_USER}}" if [ -n "$REAL_USER" ]; then REAL_UID=$(id -u "$REAL_USER") USER_HOME=$(getent passwd $REAL_USER | cut -d: -f6) if [ -f "$USER_HOME/.local/bin/breezy_gnome_uninstall" ]; then echo "Uninstalling old Breezy GNOME setup" $USER_HOME/.local/bin/breezy_gnome_uninstall fi if [ -f "$USER_HOME/.local/bin/breezy_vulkan_uninstall" ]; then echo "Uninstalling old Breezy Vulkan setup" $USER_HOME/.local/bin/breezy_vulkan_uninstall fi if [ -f "$USER_HOME/.local/bin/xr_driver_uninstall" ]; then echo "Uninstalling old XR Driver setup" $USER_HOME/.local/bin/xr_driver_uninstall fi else echo "Unable to detect user, skipping xr_driver_uninstall check" echo "Debug info: SUDO_USER=$SUDO_USER, X11_USER=$X11_USER, DBUS_USER=$DBUS_USER" fi exit 0 ================================================ FILE: fpm/preuninstall ================================================ #!/usr/bin/env bash # Try multiple methods to detect the real user SUDO_USER="${SUDO_USER:-}" DBUS_USER="${DBUS_SESSION_BUS_ADDRESS%%,*}" DBUS_USER="${DBUS_USER#unix:user=}" X11_USER=$(who | grep -F '(:0)' | head -n1 | cut -d' ' -f1) # Try each method in order of preference REAL_USER="${SUDO_USER:-${X11_USER:-$DBUS_USER}}" if [ -n "$REAL_USER" ] && [ -x "$(command -v systemctl)" ]; then REAL_UID=$(id -u "$REAL_USER") XDG_RUNTIME_DIR="/run/user/$REAL_UID" echo "Stopping the systemd service for $REAL_USER ($XDG_RUNTIME_DIR)" OUTPUT=$(su -l --shell /bin/sh -c "export XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR; systemctl --user stop xr-driver && systemctl --user disable xr-driver" "$REAL_USER" 2>&1) EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "Command failed with exit code $EXIT_CODE. Output was:" echo "$OUTPUT" exit $EXIT_CODE fi else echo "Unable to detect user, skipping systemd service restart" fi rm -f /tmp/shader_runtime_* rm -f /dev/shm/xr_* rm -f /dev/shm/breezy_desktop_imu exit 0 ================================================ FILE: include/buffer.h ================================================ #pragma once #include #include #define GYRO_BUFFERS_COUNT 5 // quat values: x, y, z, w, timestamp struct buffer_t { int size; float* values; int index; int count; }; typedef struct buffer_t buffer_type; struct imu_buffer_t { buffer_type **stage_1; buffer_type **stage_2; }; typedef struct imu_buffer_t imu_buffer_type; struct imu_buffer_response_t { bool ready; float *data; }; typedef struct imu_buffer_response_t imu_buffer_response_type; buffer_type *create_buffer(int size); void free_buffer(buffer_type *buffer); bool is_full(buffer_type *buffer); // push a new value, pop the oldest value and return it float push(buffer_type *buffer, float next_value); imu_buffer_type *create_imu_buffer(int buffer_size); void free_imu_buffer(imu_buffer_type *gyro_buffer); int imu_buffer_size(imu_buffer_type *gyro_buffer); imu_buffer_response_type *push_to_imu_buffer(imu_buffer_type *gyro_buffer, imu_quat_type quat, float timestamp_ms); ================================================ FILE: include/config.h ================================================ #pragma once #include #include struct driver_config_t { bool disabled; bool mouse_mode; bool joystick_mode; bool external_mode; bool use_roll_axis; bool vr_lite_invert_x; bool vr_lite_invert_y; int mouse_sensitivity; char *output_mode; bool multi_tap_enabled; bool metrics_disabled; float dead_zone_threshold_deg; bool debug_threads; bool debug_joystick; bool debug_multi_tap; bool debug_ipc; bool debug_license; bool debug_device; bool debug_connections; }; typedef struct driver_config_t driver_config_type; extern const char *joystick_output_mode; extern const char *mouse_output_mode; extern const char *external_only_output_mode; driver_config_type *default_config(); void update_config(driver_config_type *config, driver_config_type *new_config); driver_config_type* parse_config_file(FILE *fp); void boolean_config(char* key, char *value, bool *config_value); void float_config(char* key, char *value, float *config_value); void int_config(char* key, char *value, int *config_value); void string_config(char* key, char *value, char **config_value); ================================================ FILE: include/connection_pool.h ================================================ #pragma once #include "devices.h" #include "imu.h" #include #include #include typedef struct connection_t { const device_driver_type* driver; device_properties_type* device; // owned by pool bool supplemental; bool active; pthread_t thread; bool thread_running; } connection_t; struct connection_pool_t { pthread_mutex_t mutex; connection_t** list; int count; int capacity; int primary_index; // index in list or -1 int supplemental_index; // index in list or -1 }; // Connection pool type that manages multiple device connections. typedef struct connection_pool_t connection_pool_type; // Create/destroy a connection pool instance typedef void (*pose_handler_t)(imu_pose_type pose); typedef bool (*reference_pose_getter_t)(imu_pose_type* out_pose, bool* pose_updated); void connection_pool_init(pose_handler_t pose_handler_callback, reference_pose_getter_t reference_pose_getter); // Append a new connection (driver + device). The pool retains the driver pointer and // takes ownership of the device pointer. It will decide whether to make it the primary // (non-supplemental) or use it as a supplemental connection. void connection_pool_handle_device_added(const device_driver_type* driver, device_properties_type* device); // Delegate helpers the main driver uses (these generally forward to the primary connection) bool connection_pool_is_connected(); bool connection_pool_device_is_sbs_mode(); bool connection_pool_device_set_sbs_mode(bool enabled); void connection_pool_disconnect_all(bool soft); // Start blocking on active connections (primary and at most one supplemental). This function // will create per-connection threads and return when the primary connection stops blocking // (e.g., due to disconnect). void connection_pool_block_on_active(); // Attempt to connect active connections (primary and, if present, supplemental). Returns true // if the primary connection connected successfully (supplemental is best-effort). bool connection_pool_connect_active(); // Get the current primary device properties (borrowed; do not free). Returns NULL if none. device_properties_type* connection_pool_primary_device(); device_properties_type* connection_pool_supplemental_device(); // Get the primary driver pointer (borrowed; do not free). Returns NULL if none. const device_driver_type* connection_pool_primary_driver(); // Remove a connection by its unique source id. If the removed connection is currently // primary or supplemental, the pool will re-evaluate selection. If a thread is running for the // removed connection, it will be disconnected; cleanup occurs when the thread exits. void connection_pool_handle_device_removed(const char* driver_id); connection_t* connection_pool_find_hid_connection(uint16_t id_vendor, int16_t id_product); connection_t* connection_pool_find_driver_connection(const char* driver_id); void connection_pool_ingest_pose(const char* driver_id, imu_pose_type pose); // Returns true if the given driver id is currently the primary connection bool connection_pool_is_primary_driver_id(const char* driver_id); ================================================ FILE: include/curl.h ================================================ #pragma once void curl_init(); void curl_cleanup(); ================================================ FILE: include/devices/rayneo.h ================================================ #pragma once extern const device_properties_type rayneo_properties; extern const device_driver_type rayneo_driver; ================================================ FILE: include/devices/rokid.h ================================================ #pragma once extern const device_properties_type rokid_properties; extern const device_driver_type rokid_driver; ================================================ FILE: include/devices/viture.h ================================================ #pragma once #include #include #include "devices.h" #include "imu.h" extern const device_properties_type viture_one_properties; extern const device_driver_type viture_driver; ================================================ FILE: include/devices/xreal.h ================================================ #pragma once extern const device_properties_type xreal_air_properties; extern const device_driver_type xreal_driver; ================================================ FILE: include/devices.h ================================================ #pragma once #include #include enum calibration_setup_t { CALIBRATION_SETUP_AUTOMATIC, CALIBRATION_SETUP_INTERACTIVE }; typedef enum calibration_setup_t calibration_setup_type; // Standard display resolutions #define RESOLUTION_1080P_W 1920 #define RESOLUTION_1080P_H 1080 #define RESOLUTION_1200P_W 1920 #define RESOLUTION_1200P_H 1200 // distance from the pivot point (neck) to the lenses, in cm, typically ~5 inches #define LENS_TO_PIVOT_CM (5.0f * 2.54f) struct device_properties_t { char* brand; char* model; // USB information int hid_vendor_id; int hid_product_id; uint8_t usb_bus; uint8_t usb_address; calibration_setup_type calibration_setup; // resolution width and height int resolution_w; int resolution_h; // FOV for diagonal, in degrees float fov; // ratio representing (from the center of the axes of rotation): lens distance / perceived display distance float lens_distance_ratio; int calibration_wait_s; int imu_cycles_per_s; // how many events to buffer for velocity smoothing int imu_buffer_size; // look-ahead = look_ahead_ftm * frametime + look_ahead_constant // where frametime is the duration of a frame e.g. 33ms for 30Hz framerate float look_ahead_constant; float look_ahead_frametime_multiplier; // if top and bottom rows of the display require different look-ahead float look_ahead_scanline_adjust; // maximum look-ahead for best experience, the shader may also provide an upper bound float look_ahead_ms_cap; bool sbs_mode_supported; bool firmware_update_recommended; // Tracking capabilities exposed by this device bool provides_orientation; // 3DoF available bool provides_position; // 6DoF available // Whether this device may be used as a supplemental device alongside a primary one. // When true, the driver may be run in a supplemental mode and will not be registered // as the primary runtime device in the global context. bool can_be_supplemental; }; typedef struct device_properties_t device_properties_type; // if this driver supports the device, return the device properties, otherwise NULL typedef device_properties_type* (*supported_device_func)(uint16_t id_vendor, uint16_t id_product, uint8_t usb_bus, uint8_t usb_address); // open device connection, expected to perform cleanup on failure typedef bool (*device_connect_func)(); // hold open the connection while the device is present and disconnect_func has not been called typedef void (*block_on_device_func)(); // return true if device is in SBS mode typedef bool (*device_is_sbs_mode_func)(); // set SBS mode on device, return true on success typedef bool (*device_set_sbs_mode_func)(bool enabled); // whether the driver is currently holding open a connection to the device typedef bool (*is_connected_func)(); // tells the driver to release its connection to the device, `soft` describes whether this is a // software-only disconnect, true means the device is still physically connected typedef void (*disconnect_func)(bool soft); struct device_driver_t { char* id; supported_device_func supported_device_func; device_connect_func device_connect_func; block_on_device_func block_on_device_func; device_is_sbs_mode_func device_is_sbs_mode_func; device_set_sbs_mode_func device_set_sbs_mode_func; is_connected_func is_connected_func; disconnect_func disconnect_func; }; typedef struct device_driver_t device_driver_type; struct connected_device_t { const device_driver_type* driver; device_properties_type* device; }; typedef struct connected_device_t connected_device_type; bool device_equal(device_properties_type* device, device_properties_type* device2); void handle_device_connection_changed(bool is_added, connected_device_type* device); void init_devices(); void deinit_devices(); connected_device_type* find_connected_device(); void handle_device_connection_events(); ================================================ FILE: include/driver.h ================================================ #pragma once #include "devices.h" #include "imu.h" #include #include bool driver_reference_pose(imu_pose_type* out_pose, bool* pose_updated); void driver_handle_pose(imu_pose_type pose); bool driver_disabled(); ================================================ FILE: include/epoch.h ================================================ #pragma once #include uint64_t get_epoch_time_ms(); ================================================ FILE: include/features/breezy_desktop.h ================================================ #include extern const char* productivity_basic_feature_name; extern const char* productivity_pro_feature_name; bool is_productivity_basic_granted(); bool is_productivity_pro_granted(); bool is_productivity_granted(); void reset_productivity_features(); ================================================ FILE: include/features/sbs.h ================================================ #include extern const char* sbs_feature_name; bool is_sbs_granted(); void reset_sbs_features(); ================================================ FILE: include/features/smooth_follow.h ================================================ #include extern const char* smooth_follow_feature_name; bool is_smooth_follow_granted(); void reset_smooth_follow_features(); ================================================ FILE: include/files.h ================================================ #pragma once #include #include #include extern const char* XDG_STATE_ENV_VAR; extern const char* XDG_RUNTIME_ENV_VAR; extern const char* XDG_CONFIG_ENV_VAR; extern const char* XDG_DATA_ENV_VAR; extern const char* XDG_STATE_FALLBACK_DIR; extern const char* XDG_CONFIG_FALLBACK_DIR; extern const char* XDG_RUNTIME_FALLBACK_DIR; extern const char* XDG_DATA_FALLBACK_DIR; char* get_xdg_file_path_for_app(const char *app_name, const char *filename, const char *xdg_env_var, const char *xdg_fallback_dir); char* get_state_file_path(const char *filename); char* get_runtime_file_path(const char *filename); char* get_config_file_path(const char *filename); FILE* get_or_create_file(const char *full_path, mode_t directory_mode, const char *file_mode, bool *file_created); FILE* get_or_create_state_file(const char *filename, const char *mode, char **full_path, bool *created); FILE* get_or_create_runtime_file(const char *filename, const char *mode, char **full_path, bool *created); FILE* get_or_create_config_file(const char *filename, const char *mode, char **full_path, bool *created); ================================================ FILE: include/imu.h ================================================ #pragma once #include #include struct imu_euler_t { float roll; float pitch; float yaw; }; struct imu_quat_t { float x; float y; float z; float w; }; struct imu_vec3_t { float x; float y; float z; }; struct imu_pose_t { struct imu_quat_t orientation; struct imu_vec3_t position; struct imu_euler_t euler; bool has_orientation; bool has_position; uint32_t timestamp_ms; }; extern const float pose_orientation_reset_data[16]; extern const float pose_position_reset_data[3]; typedef struct imu_euler_t imu_euler_type; typedef struct imu_quat_t imu_quat_type; typedef struct imu_vec3_t imu_vec3_type; typedef struct imu_pose_t imu_pose_type; float degree_to_radian(float deg); float radian_to_degree(float rad); imu_quat_type normalize_quaternion(imu_quat_type q); imu_quat_type conjugate(imu_quat_type q); imu_quat_type multiply_quaternions(imu_quat_type q1, imu_quat_type q2); imu_quat_type euler_to_quaternion_xyz(imu_euler_type euler); imu_quat_type euler_to_quaternion_zyx(imu_euler_type euler); imu_quat_type euler_to_quaternion_zxy(imu_euler_type euler); imu_euler_type quaternion_to_euler_xyz(imu_quat_type q); imu_euler_type quaternion_to_euler_zyx(imu_quat_type q); imu_euler_type quaternion_to_euler_zxy(imu_quat_type q); imu_quat_type device_pitch_adjustment(float adjustment_degrees); imu_vec3_type vector_rotate(imu_vec3_type v, imu_quat_type q); bool quat_equal(imu_quat_type q1, imu_quat_type q2); static inline void imu_pose_sync_euler_from_orientation(imu_pose_type *p) { if (!p) return; if (p->has_orientation) { p->euler = quaternion_to_euler_zyx(p->orientation); } } static inline void imu_pose_sync_orientation_from_euler(imu_pose_type *p) { if (!p) return; if (p->has_orientation) { p->orientation = euler_to_quaternion_zyx(p->euler); } } float quat_small_angle_rad(imu_quat_type q1, imu_quat_type q2); ================================================ FILE: include/ipc.h ================================================ #pragma once #include #include #include // TODO - this is specific to the sombrero integration, either provide no default or move to a plug-in system where // the plug-in library would be expected to provide this default, if this functionality is used extern const char *sombrero_ipc_file_prefix; extern const char *display_res_ipc_name; extern const char *disabled_ipc_name; extern const char *date_ipc_name; extern const char *pose_orientation_ipc_name; extern const char *pose_orientation_mutex_ipc_name; extern const char *pose_position_data_ipc_name; // deprecated - can be removed once this version is widely distributed extern const char *display_fov_ipc_name; extern const char *lens_distance_ratio_ipc_name; struct ipc_values_t { float *display_res; bool *disabled; float *date; float *pose_orientation; float *pose_position; pthread_mutex_t *pose_orientation_mutex; float *display_fov; float *lens_distance_ratio; }; typedef struct ipc_values_t ipc_values_type; bool setup_ipc_values(ipc_values_type *ipc_values, bool debug); void setup_ipc_value(const char *name, void **shmemValue, size_t size, bool debug); void cleanup_ipc(char* file_prefix, bool debug); ================================================ FILE: include/logging.h ================================================ #pragma once void log_init(); void log_message(const char* format, ...); void log_error(const char* format, ...); void log_debug(const char* format, ...); ================================================ FILE: include/memory.h ================================================ #pragma once #include #define free_and_clear(ptr) do { \ if (ptr != NULL && *ptr != NULL) { \ free(*ptr); \ *ptr = NULL; \ } \ } while(0) // Free an array of strings static inline void free_string_array(char** array, int count) { if (!array) return; for (int i = 0; i < count; i++) { free(array[i]); } free(array); } ================================================ FILE: include/multitap.h ================================================ #pragma once #include "imu.h" #include #include void init_multi_tap(int init_imu_cycles_per_s); int detect_multi_tap(imu_euler_type velocities, uint32_t timestamp, bool debug); ================================================ FILE: include/outputs.h ================================================ #pragma once #include "imu.h" #include "ipc.h" #include #include #define MS_PER_SEC 1000 #define IMU_CHECKPOINT_MS MS_PER_SEC / 4 void init_outputs(); void deinit_outputs(); void reinit_outputs(); // return the rate-of-change of the euler value against the previous euler value, in degrees/sec imu_euler_type get_euler_velocities(imu_euler_type* previous, imu_euler_type current, int imu_cycles_per_sec); void handle_imu_update(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values); void reset_pose_data(ipc_values_type *ipc_values); bool wait_for_imu_start(); bool is_imu_alive(); ================================================ FILE: include/plugins/breezy_desktop.h ================================================ #pragma once #include "plugins.h" struct breezy_desktop_config_t { bool enabled; float look_ahead_override; float display_distance; float display_size; bool sbs_content; bool sbs_mode_stretched; }; typedef struct breezy_desktop_config_t breezy_desktop_config; extern const plugin_type breezy_desktop_plugin; ================================================ FILE: include/plugins/custom_banner.h ================================================ #pragma once #include "plugins.h" struct custom_banner_ipc_values_t { bool *enabled; }; typedef struct custom_banner_ipc_values_t custom_banner_ipc_values_type; extern custom_banner_ipc_values_type *custom_banner_ipc_values; extern const plugin_type custom_banner_plugin; ================================================ FILE: include/plugins/device_license.h ================================================ #pragma once #include "plugins.h" extern const plugin_type device_license_plugin; ================================================ FILE: include/plugins/gamescope_reshade_wayland.h ================================================ #pragma once #include "plugins.h" #include #include struct gamescope_reshade_wayland_config_t { bool disabled; }; typedef struct gamescope_reshade_wayland_config_t gamescope_reshade_wayland_config; typedef void (*gamescope_reshade_effect_ready_callback)(); bool is_gamescope_reshade_ipc_connected(); void set_gamescope_reshade_effect_uniform_variable(const char *variable_name, const void *data, int entries, size_t size, bool flush); // will skip if there's already a lock on the wayland client, for values that are set repeatedly, like IMU data void set_skippable_gamescope_reshade_effect_uniform_variable(const char *variable_name, const void *data, int entries, size_t size, bool flush); extern const plugin_type gamescope_reshade_wayland_plugin; ================================================ FILE: include/plugins/metrics.h ================================================ #pragma once #include "plugins.h" extern const plugin_type metrics_plugin; ================================================ FILE: include/plugins/neck_saver.h ================================================ #pragma once #include "plugins.h" typedef struct neck_saver_config_t { float horizontal_multiplier; // applied to yaw (rotation about up axis) float vertical_multiplier; // applied to pitch (rotation about east/west axis) } neck_saver_config_type; extern const plugin_type neck_saver_plugin; ================================================ FILE: include/plugins/opentrack_listener.h ================================================ #pragma once #include #include "plugins.h" struct opentrack_listener_config_t { bool enabled; char *ip; int port; }; typedef struct opentrack_listener_config_t opentrack_listener_config; extern const plugin_type opentrack_listener_plugin; ================================================ FILE: include/plugins/opentrack_source.h ================================================ #pragma once #include #include "plugins.h" struct opentrack_source_config_t { bool enabled; char *ip; int port; }; typedef struct opentrack_source_config_t opentrack_source_config; extern const plugin_type opentrack_source_plugin; ================================================ FILE: include/plugins/sideview.h ================================================ #pragma once #include "plugins.h" #define SIDEVIEW_POSITION_COUNT 5 extern const char *sideview_position_names[SIDEVIEW_POSITION_COUNT]; struct sideview_ipc_values_t { bool *enabled; float *position; }; typedef struct sideview_ipc_values_t sideview_ipc_values_type; struct sideview_config_t { bool enabled; int position; bool smooth_follow_enabled; }; typedef struct sideview_config_t sideview_config; extern const plugin_type sideview_plugin; ================================================ FILE: include/plugins/smooth_follow.h ================================================ #pragma once #include "plugins.h" #include struct smooth_follow_ipc_values_t { bool *enabled; }; typedef struct smooth_follow_ipc_values_t smooth_follow_ipc_values_type; struct smooth_follow_config_t { bool virtual_display_enabled; bool virtual_display_follow_enabled; bool sideview_enabled; bool sideview_follow_enabled; float sideview_follow_threshold; bool breezy_desktop_enabled; float display_distance; float display_size; bool track_roll; bool track_pitch; // vertical bool track_yaw; // horizontal }; typedef struct smooth_follow_config_t smooth_follow_config; struct smooth_follow_params_t { // The distance threshold at which a time-delayed trigger will begin counting down float lower_angle_threshold; uint32_t delay_ms; // The distance threshold at which movement is immediately triggered float upper_angle_threshold; // The angle to slerp to once a threshold is triggered float return_to_angle; // value is compounding, so 1.0 - pow(1.0 - interpolation_ratio_ms, 1000) is the effective ratio for a full second, // closer to 1.0 means faster acceleration towards the current position float interpolation_ratio_ms; }; typedef struct smooth_follow_params_t smooth_follow_params; extern const plugin_type smooth_follow_plugin; ================================================ FILE: include/plugins/virtual_display.h ================================================ #pragma once #include "plugins.h" extern const char *virtual_display_look_ahead_cfg_ipc_name; extern const char *virtual_display_display_size_ipc_name; extern const char *virtual_display_display_north_offset_ipc_name; extern const char *virtual_display_sbs_enabled_ipc_name; extern const char *virtual_display_sbs_content_ipc_name; extern const char *virtual_display_sbs_mode_stretched_ipc_name; extern const char *virtual_display_curved_display_ipc_name; extern const char *virtual_display_half_fov_z_rads_ipc_name; extern const char *virtual_display_half_fov_y_rads_ipc_name; extern const char *virtual_display_fov_half_widths_ipc_name; extern const char *virtual_display_fov_widths_ipc_name; extern const char *virtual_display_texcoord_x_limits_ipc_name; extern const char *virtual_display_texcoord_x_limits_r_ipc_name; extern const char *virtual_display_lens_vector_ipc_name; extern const char *virtual_display_lens_vector_r_ipc_name; struct virtual_display_ipc_values_t { bool *enabled; bool *show_banner; float *look_ahead_cfg; float *display_size; float *display_north_offset; bool *sbs_enabled; bool *sbs_content; bool *sbs_mode_stretched; bool *curved_display; float *half_fov_z_rads; float *half_fov_y_rads; float *fov_half_widths; float *fov_widths; float *texcoord_x_limits; float *texcoord_x_limits_r; float *lens_vector; float *lens_vector_r; }; typedef struct virtual_display_ipc_values_t virtual_display_ipc_values_type; struct virtual_display_config_t { bool enabled; float look_ahead_override; float display_size; float display_distance; bool sbs_content; bool sbs_mode_stretched; bool follow_mode_enabled; bool passthrough_smooth_follow_enabled; bool curved_display; }; typedef struct virtual_display_config_t virtual_display_config; extern const plugin_type virtual_display_plugin; ================================================ FILE: include/plugins.h ================================================ #pragma once #include "imu.h" #include "ipc.h" #include #include // config and control flag parsing/handling functions typedef void* (*default_config_func)(); typedef void (*handle_config_line_func)(void* config, char* key, char* value); typedef void (*handle_control_flag_line_func)(char* key, char* value); typedef void (*set_config_func)(void* config); // hook functions typedef void (*start_func)(); typedef bool (*setup_ipc_func)(); typedef void (*handle_ipc_change_func)(); typedef bool (*modify_reference_pose_func)(imu_pose_type pose, imu_pose_type* ref_pose); typedef void (*handle_reference_pose_updated_func)(imu_pose_type old_reference_pose, imu_pose_type new_reference_pose); typedef void (*modify_pose_func)(imu_pose_type* pose); typedef void (*handle_pose_data_func)(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values); typedef void (*reset_pose_data_func)(); typedef void (*handle_state_func)(); typedef void (*handle_device_connect_func)(); typedef void (*handle_device_disconnect_func)(); struct plugin_t { char* id; start_func start; default_config_func default_config; handle_config_line_func handle_config_line; handle_control_flag_line_func handle_control_flag_line; set_config_func set_config; setup_ipc_func setup_ipc; handle_ipc_change_func handle_ipc_change; modify_reference_pose_func modify_reference_pose; handle_reference_pose_updated_func handle_reference_pose_updated; modify_pose_func modify_pose; handle_pose_data_func handle_pose_data; reset_pose_data_func reset_pose_data; handle_state_func handle_state; handle_device_connect_func handle_device_connect; handle_device_disconnect_func handle_device_disconnect; // TODO handle feature access change }; typedef struct plugin_t plugin_type; extern const plugin_type plugins; ================================================ FILE: include/runtime_context.h ================================================ #pragma once #include "config.h" #include "connection_pool.h" #include "devices.h" #include "state.h" struct runtime_context_t { // user-controlled, read-only driver configurations (plugin configs not present), persistent driver_config_type *config; // properties of the currently connected device, modified only by the device driver module device_properties_type *device; // live view of the state of the driver, reflects real-world state, not intentions driver_state_type *state; connection_pool_type *conn_pool; }; typedef struct runtime_context_t runtime_context; // Global runtime context instance. // This is intentionally exposed so the most frequently-called accessors below can be // `static inline` and compile down to a single load/store even without LTO. extern runtime_context g_runtime_context; static inline void set_state(driver_state_type *state) { g_runtime_context.state = state; } static inline driver_state_type* state(void) { return g_runtime_context.state; } static inline void set_config(driver_config_type *config) { g_runtime_context.config = config; } static inline driver_config_type* config(void) { return g_runtime_context.config; } static inline void set_connection_pool(connection_pool_type *pool) { g_runtime_context.conn_pool = pool; } static inline connection_pool_type* connection_pool(void) { return g_runtime_context.conn_pool; } // device is so heavily used across threads that it becomes difficult to find a good time to free() it, // so the below functions keep a reference count and free it when the count reaches 0 // // if a device is already set, this will queue it and set it after the current device is released. // once set, it's considered checked out by the setting thread and the reference count is initialized at 1 void set_device_and_checkout(device_properties_type *device); // returns the current device properties and increments the reference count device_properties_type* device_checkout(); // decrements the reference count for the current device properties, releasing the device if the count reaches 0 void device_checkin(device_properties_type* device); bool device_present(); typedef void (*on_device_change_callback)(); void set_on_device_change_callback(on_device_change_callback callback); ================================================ FILE: include/sdks/rayneo.h ================================================ #ifndef XR_MINI_SDK_H #define XR_MINI_SDK_H #include "base/FXRError.h" #include "base/FXRMacro.h" #include "device/usb/XRDeviceState.h" void RegisterIMUEventCallback(IMUEventCallback callback); void UnregisterIMUEventCallback(IMUEventCallback callback); void RegisterStateEventCallback(StateEventCallback callback); void UnregisterStateEventCallback(StateEventCallback callback); int EstablishUsbConnection(int32_t vid, int32_t pid); int ResetUsbConnection(); void NotifyDeviceConnected(); void NotifyDeviceDisconnected(); void StartXR(); void StopXR(); void SwitchTo2D(); void SwitchTo3D(); void OpenIMU(); void CloseIMU(); void Recenter(); void GetHeadTrackerPose(float rotation[4], float position[3], uint64_t* timeNsInDevice); uint64_t ConvertHostTime2DeviceTime(uint64_t timeNsInHost); void GetDeviceType(char* device); void AcquireDeviceInfo(); int8_t GetSideBySideStatus(); #endif ================================================ FILE: include/sdks/rokid.h ================================================ // // Created by 曾滔 on 6/8/21. // #ifndef _GLASS_SDK_H_ #define _GLASS_SDK_H_ #define GLASS_SDK_NATIVE_VERSION "2.1.9" #define ROKID_GLASS_VID (1234) /* * Sensor Event Type. */ enum EVENT_TYPE{ ACC_EVENT = 0x1<<0, GYRO_EVENT = 0x1<<1, FUSION_EVENT= 0x1<<2, KEY_EVENT= 0x1<<3, P_SENSOR_EVENT= 0x1<<4, TOUCH_EVENT = 0x1<<5, ROTATION_EVENT=0x1<<6, GAME_ROTATION_EVENT=0x1<<7, L_SENSOR_EVENT = 0x1<<8, MAGNET_EVENT = 0x1<<9, VSYNC_EVENT = 0x1<<10, RAW_EVENT=0x1<<31, }; /* * Represent a vector in 3D space. */ typedef struct Axes{ double x; double y; double z; }_Axes; /* * Sensor Data Type. */ typedef struct SensorData { uint64_t system_timestamp; // timestamp in nanoseconds when it's received (phone clock) uint64_t sensor_timestamp_ns; // sensor timestamp in nanoseconds (glass clock) uint32_t sequence; // reserved struct Axes data; // sensor data }_SensorData; /* * Represent fusion data, including accelerometer, gyroscope, and magnetometer data. * deprecated */ typedef struct FusionData{ uint64_t system_timestamp; uint64_t sensor_timestamp_ns; uint32_t sequence; struct Axes acc; struct Axes gyro; struct Axes magnet; }_FusionData; /* * Represent rotation vector and game rotation vector */ typedef struct RotationData{ uint64_t system_timestamp; // timestamp in nanoseconds when it's received (phone clock) uint64_t sensor_timestamp_ns; // sensor timestamp in nanoseconds (glass clock) uint32_t sequence; // reserved float Q[4]; // sensor data in quaternion int status; // reserved }_RotationData; /* * Represent key data * deprecated */ typedef struct KeyData{ int keyCode; bool status; }_KeyData; /* * Represent event data * deprecated */ typedef struct EventData{ uint32_t type; union{ struct SensorData acc; // Accelerometer data struct SensorData gyro; // Gyroscope data struct SensorData magnet; // Magnetometer data struct FusionData imu; // FusionData, reserved struct RotationData rotation; // Rotation data uint64_t vsync_timestamp_ns; // VSync timestamp in nanoseconds int KeyData; // Key data, reserved bool pSensor; // Proximity sensor data, reserved uint8_t raw_data[64]; // Raw data in 64 bytes }; }_EventData; /* Get usb context * Call after GlassEventInit or GlassControlInit * * \returns libusb_context* */ void* _Z21GlassSDKGetUsbContextv(); /* Init glass event and create instance * * \returns glass event instance */ void* _Z14GlassEventInitv(void); /* * Open glass event instance with fd * * \param handle a glass event instance * \param fd the new file descriptor * \returns true on success, false on failure */ bool _Z14GlassEventOpenPvi(void* handle, int fd); /* * Open glass event instance with vid and pid * * \param handle a glass event instance * \param vid usb vendor id * \param pid usb product id * \returns true on success, false on failure */ bool _Z14GlassEventOpenPvii(void* handle, int vid, int pid); /* * Close glass event instance * * \param handle a glass event instance * \returns true on success, false on failure */ bool _Z15GlassEventClosePv(void* handle); /* * Release glass event instance * * \param handle a glass event instance * \returns true on success, false on failure */ bool _Z17GlassEventReleasePv(void* handle); /*event queue interface*/ /* * Register sensor event with required type * * \param handle a glass event instance * \param EVENT_TYPE the sensor event type * \returns a registered event */ void *GlassRegisterEvent(void* handle, enum EVENT_TYPE type); /* * Register sensor event with required type and size * * \param handle a glass event instance * \param type the sensor event type * \param size the event number * \returns a registered event */ void *_Z26GlassRegisterEventWithSizePv10EVENT_TYPEi(void* handle, enum EVENT_TYPE type, int size); /* * UnRegister sensor event * * \param handle a glass event instance * \param type the sensor event type * \returns true on success, false on failure */ bool _Z20GlassUnRegisterEventPvS_(void* handle, void* eventHandle); /* * Get sensor event * * \param handle a glass event instance * \param eventHandle the sensor event handle * \param data the event data * \param timeout operation timed out * \returns true on success, false on failure */ bool _Z14GlassWaitEventPvS_P9EventDatai(void* handle, void* eventHandle, struct EventData* data, int timeout); /* * Get sensor event * * \param handle a glass event instance * \param eventHandle the sensor event handle * \param data the event data * \param timeout operation timed out * \returns 0 get event success * 1 timeout * -1 GlassEvent closed * -2 invalid param or GlassEventRelease */ int _Z14GlassWaitEventPvS_P9EventDatai2(void* handle, void* ehandle, struct EventData* data, int timeout); /* * enable or close fusion event * * \param handle a glass event instance * \param enable whether enable the fusion event or not */ void _Z14AddFusionEventPvi(void* handle, int enable); /* Init glass control and create instance * * \returns glass control instance */ void* _Z16GlassControlInitv (void); /* * Open glass control instance with fd * * \param handle a glass control instance * \param fd the new file descriptor * \returns true on success, false on failure */ bool _Z16GlassControlOpenPvi (void* handle, int fd); /* * Open glass control instance with fd * * \param handle a glass control instance * \param vid usb vendor id * \param pid usb product id * \returns true on success, false on failure */ bool _Z16GlassControlOpenPvii (void* handle, int vid, int pid); /* * Close glass control instance * * \param handle a glass control instance * \returns true on success, false on failure */ bool _Z17GlassControlClosePv (void* handle); /* * Release glass control instance * * \param handle a glass control instance * \returns true on success, false on failure */ bool _Z19GlassControlReleasePv(void* handle); /* * Glass control interface */ /* * Set glass display mode * * \param handle a glass control instance * \param mode * 0 2D_3840*1080_60Hz * 1 3D_3840*1080_60Hz * 2 SBS //deprecated in some devices * 3 deprecated * 4 3D_3840*1200_90Hz * 5 3D_3840*1200_60Hz * \returns true on success, false on failure */ bool _Z19GlassSetDisplayModePvi(void*handle, int mode); /* * Set glass volume * * \param handle a glass control instance * \param volume range from 0 to 100 * \returns true on success, false on failure */ bool SetVolume (void*handle, int level); /* * Set glass brightness * * \param handle a glass control instance * \param channel always 0 * \param level range from 0 to 100 * \returns true on success, false on failure */ bool SetBrightness (void*handle, int channel, int level); /* * Get glass vsync status * * \param handle a glass control instance * \returns * true glass display is on * false glass display is off */ bool GetVsyncStatus (void*handle); /* * Sync glass timestamp in us (glass clock) with target device(phone clock) * deprecated * * \param handle a glass control instance * \returns true on success, false on failure */ bool GlassSyncTimeStamp (void*handle); /* * Get glass brightness * * \param handle a glass control instance * \param channel always 0 * \returns brightness, see \ref SetBrightness */ int GetBrightness (void*handle, int channel); /* * Get glass volume * * \param handle a glass control instance * \returns volume, see \ref SetVolume */ int GetVolume (void*handle); /* * Get glass display mode * * \param handle a glass control instance * \returns display mode, see \ref GetDisplayMode */ int _Z14GetDisplayModePv (void*handle); /* * Get glass serial number * * \param handle a glass control instance * \returns serial number in char* */ char* GetSerialNumber (void*handle); /* * Get glass seed * * \param handle a glass control instance * \returns seed in char* */ char* GetSeed (void*handle); /* * Get glass firmware version * * \param handle a glass control instance * \returns firmware version in char* */ char* GetFirmwareVersion(void*handle); /* * Get glass hardware version * * \param handle a glass control instance * \returns hardware version in char* */ char* GetHardwareVersion(void*handle); /* * Get glass product name * * \param handle a glass control instance * \returns product name in char* */ char* _Z14GetProductNamePv(void* handle); /* * Get glass product id * * \param handle a glass control instance * \returns product id in char* */ int GetProductId(void* handle); /* * Get glass vendor id * * \param handle a glass control instance * \returns vendor id in char* */ int GetVendorId(void* handle); /* * Get timestamp in nano to sync glass time & phone time * * for example: * long long delta_t_glass_to_phone = sysTimestamp - hmdTimestamp; * long long timestamp = curTimestamp + detla_t_glass_to_phone; * * curTimestamp means actual timestamp in nano (imu or camera on phone clock) * timestamp means calculated timestamp in nano, reflect glass clock sensor data to phone clock * * \param handle a glass control instance * \param hmdTimestamp [out] glass timestamp in nano * \param sysTimestamp [out] phone timestamp in nano * \returns true on success, false on failure */ int GlassGetTimeNano(void *handle, long long *hmdTimestamp, long long *sysTimestamp); // redefine the mangled function names here so we can use the API as intended typedef bool (*GlassControlCloseFunc)(void* handle); typedef bool (*GlassControlReleaseFunc)(void* handle); typedef void* (*GlassControlInitFunc)(void); typedef bool (*GlassControlOpenFunc)(void* handle, int vid, int pid); typedef bool (*GlassSetDisplayModeFunc)(void* handle, int mode); typedef void* (*GlassEventInitFunc)(void); typedef void* (*GlassRegisterEventWithSizeFunc)(void* handle, enum EVENT_TYPE type, int size); typedef bool (*GlassUnRegisterEventFunc)(void* handle, void* eventHandle); typedef bool (*GlassWaitEventFunc)(void* handle, void* eventHandle, struct EventData* data, int timeout); typedef void* (*GlassSDKGetUsbContextFunc)(void); typedef void (*GlassAddFusionEventFunc)(void* handle, int enable); typedef bool (*GlassEventOpenFunc)(void* handle, int vid, int pid); typedef bool (*GlassEventCloseFunc)(void* handle); typedef int (*GetDisplayModeFunc)(void* handle); typedef char* (*GetProductNameFunc)(void* handle); extern GlassControlCloseFunc GlassControlClose; extern GlassControlReleaseFunc GlassControlRelease; extern GlassControlInitFunc GlassControlInit; extern GlassControlOpenFunc GlassControlOpen; extern GlassSetDisplayModeFunc GlassSetDisplayMode; extern GlassEventInitFunc GlassEventInit; extern GlassRegisterEventWithSizeFunc GlassRegisterEventWithSize; extern GlassUnRegisterEventFunc GlassUnRegisterEvent; extern GlassWaitEventFunc GlassWaitEvent; extern GlassSDKGetUsbContextFunc GlassSDKGetUsbContext; extern GlassAddFusionEventFunc GlassAddFusionEvent; extern GlassEventOpenFunc GlassEventOpen; extern GlassEventCloseFunc GlassEventClose; extern GetDisplayModeFunc GetDisplayMode; extern GetProductNameFunc GetProductName; // retrieved using readelf (e.g. `readelf -W -s lib/x86_64/libGlassSDK.so | grep GlassControlClose`) #define GlassControlClose ((GlassControlCloseFunc)_Z17GlassControlClosePv) #define GlassControlRelease ((GlassControlReleaseFunc)_Z19GlassControlReleasePv) #define GlassControlInit ((GlassControlInitFunc)_Z16GlassControlInitv) #define GlassControlOpen ((GlassControlOpenFunc)_Z16GlassControlOpenPvii) #define GlassSetDisplayMode ((GlassSetDisplayModeFunc)_Z19GlassSetDisplayModePvi) #define GlassEventInit ((GlassEventInitFunc)_Z14GlassEventInitv) #define GlassRegisterEventWithSize ((GlassRegisterEventWithSizeFunc)_Z26GlassRegisterEventWithSizePv10EVENT_TYPEi) #define GlassUnRegisterEvent ((GlassUnRegisterEventFunc)_Z20GlassUnRegisterEventPvS_) #define GlassWaitEvent ((GlassWaitEventFunc)_Z14GlassWaitEventPvS_P9EventDatai) #define GlassSDKGetUsbContext ((GlassSDKGetUsbContextFunc)_Z21GlassSDKGetUsbContextv) #define GlassAddFusionEvent ((GlassAddFusionEventFunc)_Z14AddFusionEventPvi) #define GlassEventOpen ((GlassEventOpenFunc)_Z14GlassEventOpenPvii) #define GlassEventClose ((GlassEventCloseFunc)_Z15GlassEventClosePv) #define GetDisplayMode ((GetDisplayModeFunc)_Z14GetDisplayModePv) #define GetProductName ((GetProductNameFunc)_Z14GetProductNamePv) #endif //_GLASS_SDK_H_ ================================================ FILE: include/sdks/viture_device.h ================================================ /** * @file * @brief Non-carina device API and callback types. * @copyright 2025 VITURE Inc. All rights reserved. * * These callbacks are only applicable when the provider was created * for `XR_DEVICE_TYPE_VITURE_GEN1` or `XR_DEVICE_TYPE_VITURE_GEN2`. */ #ifndef VITURE_DEVICE_H #define VITURE_DEVICE_H #include "viture_glasses_provider.h" /** * @brief Callback function type for imu raw data. * * @param data Pointer to raw data buffer (device-defined layout). * @param timestamp Timestamp in device timebase for IMU sample. * @param vsync VSync timestamp associated with the sample. * * Should be set before calling open_imu with Imu::Mode::MODE_RAW * Data format: * 1. Viture One / Pro / Lite: [gyroscope_raw_x, gyroscope_raw_y, gyroscope_raw_z, * accelerometer_raw_x, accelerometer_raw_y, accelerometer_raw_z, * 0, 0, 0, * temperature] * 2. Viture Luma / Luma Pro / Beast: [gyroscope_raw_x, gyroscope_raw_y, gyroscope_raw_z, * accelerometer_raw_x, accelerometer_raw_y, accelerometer_raw_z, * magnetometer_raw_x, magnetometer_raw_y, magnetometer_raw_z, * temperature] */ typedef void (*VitureImuRawCallback)(float* data, uint64_t timestamp, uint64_t vsync); /** * @brief Callback function type for imu pose data. * * @param data Pointer to pose data buffer * @param timestamp Timestamp in device timebase for IMU sample. * * Should be set before calling open_imu with Imu::Mode::MODE_POSE * Data format: [roll, pitch, yaw, quaternion_0, quaternion_1, quaternion_2, quaternion_3] */ typedef void (*VitureImuPoseCallback)(float* data, uint64_t timestamp); #ifdef __cplusplus extern "C" { #endif /** * @brief Register imu raw data callback. * * This function associates a user-provided callback with the device * identified by `handle`. The callback will be invoked from the internal * imu read thread when imu raw data is available. * * @param handle Handle to the `XRDeviceProvider` instance. * @param imu_raw_callback Callback function pointer. * @return 0 on success, -1 on failure. */ VITURE_API int register_raw_callback(XRDeviceProviderHandle handle, VitureImuRawCallback imu_raw_callback); /** * @brief Register a combined IMU + VSync callback for a Viture device. * * This function associates a user-provided callback with the device * identified by `handle`. The callback will be invoked from the internal * imu read thread when imu pose data is available. * * @param handle Handle to the `XRDeviceProvider` instance. * @param imu_pose_callback Callback function pointer. * @return 0 on success, -1 on failure. */ VITURE_API int register_pose_callback(XRDeviceProviderHandle handle, VitureImuPoseCallback imu_pose_callback); /** * @brief Open imu (no effect for carina device) * @param handle Handle to the XRDeviceProvider instance * @param imu_mode viture::protocol::imu::Mode * @param imu_report_frequency viture::protocol::imu::Frequency * @return 0: Success, -1: Param error, -2: USB execution error * @return -3: Device type not supported, -4: Other error */ VITURE_API int open_imu(XRDeviceProviderHandle handle, uint8_t imu_mode, uint8_t imu_report_frequency); /** * @brief Close IMU (no effect for Carina device) * @param handle Handle to the XRDeviceProvider instance * @param imu_mode viture::protocol::imu::Mode * @return 0: Success, -1: Param error, -2: USB execution error * @return -3: Device type not supported, -4: Other error */ VITURE_API int close_imu(XRDeviceProviderHandle handle, uint8_t imu_mode); #ifdef __cplusplus } #endif #endif // VITURE_DEVICE_H ================================================ FILE: include/sdks/viture_device_carina.h ================================================ /** * @file * @brief Carina-specific device API and callback types. * @copyright 2025 VITURE Inc. All rights reserved. * * The Carina device (Viture Luma Ultra) provides higher-level callbacks for * pose, IMU, VSync and camera frames. These callbacks are only applicable * when the provider was created for `XR_DEVICE_TYPE_VITURE_CARINA`. */ #ifndef VITURE_DEVICE_CARINA_H #define VITURE_DEVICE_CARINA_H #include "viture_glasses_provider.h" /** * @brief Callback invoked when a new pose sample is available. * * @param pose Array of 7 floats: position (x,y,z) and quaternion (w,x,y,z). * @param timestamp Monotonic timestamp in seconds. */ typedef void (*XRPoseCallback)(float* pose, double timestamp); /** * @brief VSync notification callback. * * @param timestamp Monotonic timestamp in seconds when VSync occurred. */ typedef void (*XRVSyncCallback)(double timestamp); /** * @brief IMU data callback for Carina device. * * @param imu Pointer to IMU buffer (device-defined layout). * @param timestamp Timestamp in seconds for the IMU sample. */ typedef void (*XRImuCallback)(float* imu, double timestamp); /** * @brief Camera frame callback for stereo frames. * * @param image_left0 Pointer to left image buffer (frame 0). * @param image_right0 Pointer to right image buffer (frame 0). * @param image_left1 Pointer to left image buffer (frame 1). * @param image_right1 Pointer to right image buffer (frame 1). * @param timestamp Frame timestamp. * @param width Frame width in pixels. * @param height Frame height in pixels. */ typedef void (*XRCameraCallback)(char* image_left0, char* image_right0, char* image_left1, char* image_right1, double timestamp, int width, int height); #ifdef __cplusplus extern "C" { #endif /** * @brief Register callbacks for a Carina device instance. * * Callbacks registered here are ignored for devices that are not * `XR_DEVICE_TYPE_VITURE_CARINA`. * * @param handle Opaque device provider handle. * @param pose_callback Callback for pose samples. * @param vsync_callback Callback for VSync events. * @param imu_callback Callback for IMU samples. * @param camera_callback Callback for stereo camera frames. * @return 0 on success, -1 on failure. */ VITURE_API int register_callbacks_carina(XRDeviceProviderHandle handle, XRPoseCallback pose_callback, XRVSyncCallback vsync_callback, XRImuCallback imu_callback, XRCameraCallback camera_callback); /** * @brief Reset position * @param handle Handle to the XRDeviceProvider instance * @return 0 on success, -1 on failure */ VITURE_API int reset_pose_carina(XRDeviceProviderHandle handle); /** * @brief Get IMU pose data with prediction time (Twb matrix in OpenGL coordinate system: x -> right, y -> up, z -> backward) * @param handle Handle to the XRDeviceProvider instance * @param pose Array to store pose data (7 floats for position and quaternion) * @param predict_time Prediction time in nanoseconds, 0 for current pose data * @return 0 on success, -1 on failure */ VITURE_API int get_gl_pose_carina(XRDeviceProviderHandle handle, float* pose, double predict_time); /** * Toggle glasses status report * @param handle Handle to the XRDeviceProvider instance * @param toggle Enable / disable * @return 0 on success */ VITURE_API int toggle_status_report_carina(XRDeviceProviderHandle handle, bool toggle); #ifdef __cplusplus } #endif #endif // VITURE_DEVICE_CARINA_H ================================================ FILE: include/sdks/viture_glasses_constants.h ================================================ #ifndef VITURE_GLASSES_CONSTANTS_H #define VITURE_GLASSES_CONSTANTS_H #include namespace viture { namespace product { namespace VendorId { constexpr std::uint16_t VITURE = 0x35CA; } // namespace VendorId } // namespace product } // namespace viture #endif // VITURE_GLASSES_CONSTANTS_H ================================================ FILE: include/sdks/viture_glasses_provider.h ================================================ /** * @file * @brief Public C API for Viture Glasses device providers. * @copyright 2025 VITURE Inc. All rights reserved. * * This header defines the public C API used to create, control and query * XR device provider instances. It provides lifecycle functions, command * submission entry points, and callback registration for external clients. */ #ifndef VITURE_GLASSES_PROVIDER_H #define VITURE_GLASSES_PROVIDER_H #include "viture_macros.h" /** * @brief Handle type for XRDeviceProvider instances. This is an opaque pointer * returned by `xr_device_provider_create` and consumed by other API calls. */ typedef void* XRDeviceProviderHandle; #ifdef __cplusplus extern "C" { #endif /** * @brief Callback for reporting glass state changes (brightness, volume, display mode, etc.) * * See `viture::protocol::Callback::ID` for detailed id and values * * @param glass_state_id Identifier for the state being reported. * @param glass_value Integer value associated with the state. */ typedef void (*GlassStateCallback)(int glass_state_id, int glass_value); /** * @brief Device types supported by the SDK. * * Use these values to determine device-specific behavior after creating an * `XRDeviceProvider` instance, e.g. registering callbacks. */ typedef enum { XR_DEVICE_TYPE_VITURE_GEN1 = 0, XR_DEVICE_TYPE_VITURE_GEN2 = 1, XR_DEVICE_TYPE_VITURE_CARINA = 2 } XRDeviceType; #ifdef __ANDROID__ /** * @brief Android variant: Create an XRDeviceProvider instance * * Due to Android restrictions, detailed usb information is needed for creation * * @param product_id Product ID of the opened usb device * @param file_descriptor File descriptor of the opened usb device * @param bus_num Bus number for viture carina device * @param dev_addr Device address for viture carina device * @return Handle to the created instance, or NULL on failure */ VITURE_API XRDeviceProviderHandle xr_device_provider_create(int product_id, int file_descriptor, int bus_num, int dev_addr); #else /** * @brief Non-Android variant: Create an XRDeviceProvider instance * * The non-Android signature accepts only `product_id` * * @param product_id Product ID of the opened usb device * @return Handle to the created instance, or NULL on failure */ VITURE_API XRDeviceProviderHandle xr_device_provider_create(int product_id); #endif /** * @brief Initialize the XRDeviceProvider * @param handle Handle to the XRDeviceProvider instance * @param custom_config Optional custom configuration string (can be NULL) * @return 0: Success, -1: Param error, -2: Other error */ VITURE_API int xr_device_provider_initialize(XRDeviceProviderHandle handle, const char* custom_config); /** * @brief Start the XRDeviceProvider * @param handle Handle to the XRDeviceProvider instance * @return 0: Success, -1: Param error, -2: Other error */ VITURE_API int xr_device_provider_start(XRDeviceProviderHandle handle); /** * @brief Stop the XRDeviceProvider * @param handle Handle to the XRDeviceProvider instance * @return 0: Success, -1: Param error, -2: Other error */ VITURE_API int xr_device_provider_stop(XRDeviceProviderHandle handle); /** * @brief Shutdown the XRDeviceProvider * @param handle Handle to the XRDeviceProvider instance * @return 0: Success, -1: Param error, -2: Other error */ VITURE_API int xr_device_provider_shutdown(XRDeviceProviderHandle handle); /** * @brief Destroy the XRDeviceProvider instance * @param handle Handle to the XRDeviceProvider instance */ VITURE_API void xr_device_provider_destroy(XRDeviceProviderHandle handle); /** * @brief Register glass state callback * @param handle Handle to the XRDeviceProvider instance * @param callback Called when glass state changes * @return 0: Success, -1: Param error, -2: USB not available, -3: Other error */ VITURE_API int xr_device_provider_register_state_callback(XRDeviceProviderHandle handle, GlassStateCallback callback); /** * @brief Execute a USB control command synchronously * @param handle Handle to the XRDeviceProvider instance * @param msgId Message ID for the command * @param data Command data to send * @param length Length of the command data * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Other error */ VITURE_API int xr_device_provider_execute_usb_command(XRDeviceProviderHandle handle, int msgId, const char* data, int length); /** * @brief Execute a USB control command synchronously and return response data * @param handle Handle to the XRDeviceProvider instance * @param msgId Message ID for the command * @param data Command data to send * @param length Length of the command data * @param response_data Buffer to store response data * @param response_length Pointer to store the length of response data * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Result cast success but execution is not success * @return -5: Result not casteded and execution is not success, -6: Other error */ VITURE_API int xr_device_provider_execute_usb_command_with_response( XRDeviceProviderHandle handle, int msgId, const char* data, int length, char* response_data, int* response_length); /** * @brief Get electrochomic film mode synchronously * @param handle Handle to the XRDeviceProvider instance * @param voltage Pointer to store voltage data. * Gen1 devices: 0.0F / 1.0F; * Gen2 devices: 0F / 0.125F ... / 0.875F / 1.0F. * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Other error */ VITURE_API int xr_device_provider_get_film_mode(XRDeviceProviderHandle handle, float* voltage); /** * @brief Set electrochomic film mode synchronously * @param handle Handle to the XRDeviceProvider instance * @param voltage Voltage parameter (0.0 - 1.0). Interpretation differs by * generation: on Gen1 a non-zero value enables the film; * Gen2 uses ranges to map to discrete levels. * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Other error */ VITURE_API int xr_device_provider_set_film_mode(XRDeviceProviderHandle handle, float voltage); /** * @brief Get screen duty cycle * @param handle Handle to the XRDeviceProvider instance * @return Duty cycle value, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: No valid data, -5: Other error */ VITURE_API int xr_device_provider_get_duty_cycle(XRDeviceProviderHandle handle); /** * @brief Set screen duty cycle * @param handle Handle to the XRDeviceProvider instance * @param duty_cycle Duty cycle value (0-100) * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Duty cycle value incorrect, -5: Other error */ VITURE_API int xr_device_provider_set_duty_cycle(XRDeviceProviderHandle handle, int duty_cycle); /** * @brief Get display mode * @param handle Handle to the XRDeviceProvider instance * @return Display mode value (see viture::protocol::DisplayMode), -1: Param error, -2: USB not available * @return -3: USB execution error, -4: No valid data, -5: Other error */ VITURE_API int xr_device_provider_get_display_mode(XRDeviceProviderHandle handle); /** * @brief Set display mode synchronously * @param handle Handle to the XRDeviceProvider instance * @param display_mode Display mode value (see viture::protocol::DisplayMode) * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Display mode value incorrect, -4: USB execution error * @return -5: Other error */ VITURE_API int xr_device_provider_set_display_mode(XRDeviceProviderHandle handle, int display_mode); /** * @brief Get display mode and native dof type (only for devices with native 3DOF, e.g. Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @param display_mode Pointer to store display mode data * @param dof_type Pointer to store dof data * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: USB execution error * @return -5: No valid data, -6: Other error */ VITURE_API int xr_device_provider_get_display_mode_and_native_dof(XRDeviceProviderHandle handle, int* display_mode, int* dof_type); /** * @brief Set display mode and dof type (only for devices with native 3DOF, e.g. Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @param display_mode Display mode value * @param dof_type Dof value * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: Display mode value incorrect * @return -5: USB execution error, -6: Other error */ VITURE_API int xr_device_provider_set_display_mode_and_native_dof(XRDeviceProviderHandle handle, int display_mode, int dof_type); /** * @brief Get display distance (only for Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @param distance Pointer to store display distance data * @return [1, 10]: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: USB execution error * @return -5: No valid data, -6: Other error */ VITURE_API int xr_device_provider_get_display_distance(XRDeviceProviderHandle handle); /** * @brief Set display distance (only for Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @param distance Range [1, 10] * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: Display mode value incorrect * @return -5: USB execution error, -6: Other error */ VITURE_API int xr_device_provider_set_display_distance(XRDeviceProviderHandle handle, int distance); /** * @brief Get display mode and native dof type (only for devices with native 3DOF, e.g. Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @return [0, 4]: Success (viture::protocol::DisplaySize), -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: USB execution error * @return -5: No valid data, -6: Other error */ VITURE_API int xr_device_provider_get_display_size(XRDeviceProviderHandle handle); /** * @brief Set display size (only for Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @param size See viture::protocol::DisplaySize * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: Display mode value incorrect * @return -5: USB execution error, -6: Other error */ VITURE_API int xr_device_provider_set_display_size(XRDeviceProviderHandle handle, int size); /** * @brief Recenter display (only for devices with native 3DOF, e.g. Viture Beast) * @param handle Handle to the XRDeviceProvider instance * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Interface not support for device, -4: USB execution error * @return -5: Other error */ VITURE_API int xr_device_provider_native_dof_recenter(XRDeviceProviderHandle handle); /** * @brief Switch between 2D (1920 x 1080 @ 60Hz) / 3D (3840 x 1080 @ 60Hz) * * If higher resolution or refresh rate is needed, use xr_device_provider_set_display_mode * Note that when already at the same display mode and refresh rate, the return * is 0 and nothing will happen * * @param handle Handle to the XRDeviceProvider instance * @param is_3d true: switch to 3D, false: switch to 2D * @return 0: Success, -1: Param error, -2: USB not available * @return -3: Display mode value incorrect, -4: USB execution error * @return -5: Other error */ VITURE_API int xr_device_provider_switch_dimension(XRDeviceProviderHandle handle, bool is_3d); /** * @brief Get screen brightness level * @param handle Handle to the XRDeviceProvider instance * @return Brightness level, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Response length incorrect * @return -5: Response cast error, -6: Other error */ VITURE_API int xr_device_provider_get_brightness_level(XRDeviceProviderHandle handle); /** * @brief Set screen brightness level * @param handle Handle to the XRDeviceProvider instance * @param level Brightness level to set * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Other error */ VITURE_API int xr_device_provider_set_brightness_level(XRDeviceProviderHandle handle, int level); /** * @brief Get speaker volume level * @param handle Handle to the XRDeviceProvider instance * @return Volume level, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Other error */ VITURE_API int xr_device_provider_get_volume_level(XRDeviceProviderHandle handle); /** * @brief Set speaker volume level * @param handle Handle to the XRDeviceProvider instance * @param level Volume level to set * @return 0: Success, -1: Param error, -2: USB not available * @return -3: USB execution error, -4: Response length incorrect, * @return -5: Response cast error, -6: Other error */ VITURE_API int xr_device_provider_set_volume_level(XRDeviceProviderHandle handle, int level); /** * @brief Get the device type * @param handle Handle to the XRDeviceProvider instance * @return XRDeviceType enum value, or -1 on failure */ VITURE_API int xr_device_provider_get_device_type(XRDeviceProviderHandle handle); /** * @brief Get glasses firmware version * @param handle Handle to the XRDeviceProvider instance * @param response Store response * @param length Store response length * @return 0: Success, -1: Parameter error, -2: USB protocol not available * @return -3: USB response error, -4: No valid data, -5: Exception happened */ VITURE_API int xr_device_provider_get_glasses_version(XRDeviceProviderHandle handle, char* response, int* length); /** * Check if product id is valid * @param product_id Product id to check * @return Product id is valid or not */ VITURE_API bool xr_device_provider_is_product_id_valid(int product_id); /** * Get glasses market name * @param product_id Viture product id * @param response_data Buffer to store market name * @param response_length Pointer to store the length of market name */ VITURE_API int xr_device_provider_get_market_name(int product_id, char* market_name, int* length); /** * Set log level * @param level 0: No log, 1: Error, 2: Info, 3: Debug */ VITURE_API void xr_device_provider_set_log_level(int level); /** * Get log level * @return 0: No log, 1: Error, 2: Info, 3: Debug */ VITURE_API int xr_device_provider_get_log_level(); #ifdef __cplusplus } #endif #endif // VITURE_GLASSES_PROVIDER_H ================================================ FILE: include/sdks/viture_macros.h ================================================ /* * Copyright (C) 2025 VITURE Inc. All rights reserved. */ #pragma once // Unified platform-specific export macro // Always exports (dllexport), never imports (no dllimport) #if defined(_WIN32) || defined(__CYGWIN__) # define VITURE_API __declspec(dllexport) #else # if defined(__GNUC__) || defined(__clang__) # define VITURE_API __attribute__((visibility("default"))) # else # define VITURE_API # endif #endif ================================================ FILE: include/sdks/viture_protocol.h ================================================ /** * @file * @brief Protocol constants and identifiers used by the Viture USB protocol. * @copyright 2025 VITURE Inc. All rights reserved. * * This header exposes constants for display modes, DOF settings, IMU modes * and callback identifiers. These constants are intended for use by * application code and protocol builders/parsers. */ #ifndef VITURE_PROTOCOL_H #define VITURE_PROTOCOL_H #include namespace viture::protocol { /** * @brief Product market names */ namespace MarketName { constexpr const char* ONE = "One"; constexpr const char* PRO = "Pro"; constexpr const char* LITE = "Lite"; constexpr const char* LUMA = "Luma"; constexpr const char* LUMA_PRO = "Luma Pro"; constexpr const char* LUMA_ULTRA = "Luma Ultra"; constexpr const char* LUMA_CYBER = "Luma Cyber"; constexpr const char* BEAST = "Beast"; } // namespace MarketName /** * @brief Result codes used by various protocol helpers and APIs. */ namespace Result { constexpr int SUCCESS = 0; /**< Success code */ constexpr int FAILURE = 1; /**< Failure code */ }; // namespace Result namespace DisplaySize { constexpr uint8_t SMALL = 0x00; constexpr uint8_t MEDIUM = 0x01; constexpr uint8_t LARGE = 0x02; constexpr uint8_t EXTRA = 0x03; constexpr uint8_t ULTRA = 0x04; } // namespace DisplaySize /** * @brief Display mode identifiers for switching device display output * and refresh-rate configurations. */ namespace DisplayMode { constexpr uint8_t MODE_1920_1080_60HZ = 0x31; /**< 1920x1080 @ 60Hz */ constexpr uint8_t MODE_3840_1080_60HZ = 0x32; /**< 3840x1080 @ 60Hz */ constexpr uint8_t MODE_1920_1080_90HZ = 0x33; /**< 1920x1080 @ 90Hz */ constexpr uint8_t MODE_1920_1080_120HZ = 0x34; /**< 1920x1080 @ 120Hz */ constexpr uint8_t MODE_3840_1080_90HZ = 0x35; /**< 3840x1080 @ 90Hz */ constexpr uint8_t MODE_1920_1080_60HZ_120HZ = 0x36; /**< 1920x1080, input is 60Hz, output is 120Hz (frame interpolation) */ constexpr uint8_t MODE_1920_1200_60HZ = 0x41; /**< 1920x1200 @ 60Hz */ constexpr uint8_t MODE_3840_1200_60HZ = 0x42; /**< 3840x1200 @ 60Hz */ constexpr uint8_t MODE_1920_1200_90HZ = 0x43; /**< 1920x1200 @ 90Hz */ constexpr uint8_t MODE_1920_1200_120HZ = 0x44; /**< 1920x1200 @ 120Hz */ constexpr uint8_t MODE_3840_1200_90HZ = 0x45; /**< 3840x1200 @ 90Hz */ constexpr uint8_t MODE_1920_1200_60HZ_120HZ = 0x46; /**< 1920x1280, input is 60Hz, output is 120Hz (frame interpolation) */ /** * Added for Beast */ constexpr uint8_t MODE_ULTRAWIDE_60HZ_120HZ = 0x51; /**< Ultrawide mode, input is 60Hz, output is 120Hz (frame interpolation) */ constexpr uint8_t MODE_SIDEMODE_60HZ = 0x61; /**< Side-by-side mode @ 60Hz */ } // namespace DisplayMode /** * @brief Native device DOF modes (used for devices that support native 3DOF, e.g. Viture Beast). */ namespace NativeDOF { constexpr uint8_t DOF_0 = 0x00; /**< No native DOF */ constexpr uint8_t DOF_3 = 0x01; /**< Native 3DOF */ constexpr uint8_t DOF_SMOOTH_FOLLOW = 0x02; /**< Smooth follow mode */ } // namespace NativeDOF /** * @brief Duty cycle presets used by the display controller. */ namespace DutyCycle { constexpr uint8_t H = 98; /**< High duty cycle */ constexpr uint8_t M = 42; /**< Medium duty cycle */ constexpr uint8_t L = 30; /**< Low duty cycle */ } // namespace DutyCycle /** * @brief IMU configuration options. */ namespace Imu { namespace Mode { constexpr uint8_t MODE_RAW = 0; /**< Report IMU raw data */ constexpr uint8_t MODE_POSE = 1; /**< Report IMU pose data */ } // namespace Mode namespace Frequency { constexpr uint8_t LOW = 0; /**< 60Hz */ constexpr uint8_t MEDIUM_LOW = 1; /**< 90Hz */ constexpr uint8_t MEDIUM = 2; /**< 120Hz */ constexpr uint8_t MEDIUM_HIGH = 3; /**< 240Hz */ constexpr uint8_t HIGH = 4; /**< 500Hz */ } // namespace Frequency } // namespace Imu /** * @brief Callback identifiers used when reporting glass state changes. */ namespace Callback { namespace ID { /** * @brief Brightness change * * | Device Model | Value Range | * |-------------------------|-------------| * | Viture One & Viture Pro | [0, 6] | * | Viture Luma Series | [0, 8] | * | Viture Beast | [0, 8] | */ constexpr uint8_t BRIGHTNESS = 0; /** * @brief Volume change * * | Device Model | Value Range | * |--------------------|-------------| * | Viture One | [0, 7] | * | Viture Pro | [0, 8] | * | Viture Luma Series | [0, 8] | * | Viture Beast | [0, 15] | */ constexpr uint8_t VOLUME = 1; /** * @brief Volume change * * See `DisplayMode` for possible values. */ constexpr uint8_t DISPLAY_MODE = 2; /** * @brief Electronchromic film status change * * | Device Model | Value Range | * |-------------------------|-------------| * | Viture One & Viture Pro | [0, 1] | * | Viture Luma Series | [0, 1] | * | Viture Beast | [0, 8] | */ constexpr uint8_t ELECTROCHROMIC_FILM = 3; /** * @brief Native dof type change * * See `NativeDOF` for possible values. */ constexpr uint8_t NATIVE_DOF = 4; } // namespace ID } // namespace Callback } // namespace viture::protocol #endif // VITURE_PROTOCOL_H ================================================ FILE: include/sdks/viture_version.h ================================================ /* * Copyright (C) 2025 VITURE Inc. All rights reserved. */ #pragma once #include "viture_macros.h" // Version defined as macros so they can be used in preprocessor checks #define VITURE_VERSION_MAJOR 2 #define VITURE_VERSION_MINOR 0 #define VITURE_VERSION_PATCH 0 // Helper macros to stringify numeric macros after expansion. #define VITURE_STRINGIFY_IMPL(x) #x #define VITURE_STRINGIFY(x) VITURE_STRINGIFY_IMPL(x) // Compose the version string from the three numeric macros. #define VITURE_VERSION_STRING \ VITURE_STRINGIFY(VITURE_VERSION_MAJOR) \ "." VITURE_STRINGIFY(VITURE_VERSION_MINOR) "." VITURE_STRINGIFY(VITURE_VERSION_PATCH) // C-style accessor exported with C linkage. Returns a pointer to a // null-terminated static string owned by the library; callers must not free it. extern "C" VITURE_API const char* GetVersionString(); namespace viture::version { // Expose version pieces as compile-time constants constexpr int kMajor = VITURE_VERSION_MAJOR; constexpr int kMinor = VITURE_VERSION_MINOR; constexpr int kPatch = VITURE_VERSION_PATCH; } // namespace viture::version ================================================ FILE: include/state.h ================================================ #pragma once #include "devices.h" // for calibration_setup_type #include "imu.h" // for imu_quat_type #include #include #include enum calibration_state_t { NOT_CALIBRATED, CALIBRATED, CALIBRATING, WAITING_ON_USER }; typedef enum calibration_state_t calibration_state_type; struct driver_state_t { uint32_t heartbeat; char* connected_device_brand; char* connected_device_model; float connected_device_full_distance_cm; float connected_device_full_size_cm; bool connected_device_pose_has_position; calibration_setup_type calibration_setup; calibration_state_type calibration_state; bool sbs_mode_supported; bool sbs_mode_enabled; bool breezy_desktop_smooth_follow_enabled; float breezy_desktop_follow_threshold; float *smooth_follow_origin; bool smooth_follow_origin_ready; float breezy_desktop_display_distance; bool firmware_update_recommended; bool is_gamescope_reshade_ipc_connected; int granted_features_count; char** granted_features; int license_features_count; char** license_features; char* device_license; }; typedef struct driver_state_t driver_state_type; enum sbs_control_t { SBS_CONTROL_UNSET, SBS_CONTROL_ENABLE, SBS_CONTROL_DISABLE }; typedef enum sbs_control_t sbs_control_type; struct control_flags_t { bool recenter_screen; bool recalibrate; bool force_quit; sbs_control_type sbs_mode; char* request_features; }; typedef struct control_flags_t control_flags_type; extern const char* state_files_directory; extern const char* state_filename; extern const char* control_flags_filename; FILE* get_driver_state_file(const char *filename, char *mode, char **full_path); void write_state(driver_state_type *state); void read_control_flags(FILE *fp, control_flags_type *flags); void update_state_from_device(driver_state_type *state, device_properties_type *primary_device, device_properties_type *supplemental_device, device_driver_type *device_driver); ================================================ FILE: include/strings.h ================================================ #pragma once #include #include bool equal(const char *a, const char *b); bool in_array(const char *str, const char **array, int size); bool list_string_contains(const char* str, const char* list_string); const char* concat(const char* path, const char* extension); // Parse comma-separated string into array of strings // Returns number of strings parsed, or 0 on error // Caller must free the returned array and its elements int parse_comma_separated_string(const char* str, char*** result); // Deep copy an array of strings // Returns NULL on error or if input is NULL/empty // Caller must free the returned array and its elements char** deep_copy_string_array(char** array, int count); // Comparison function intended for qsort int compare_strings(const void* a, const void* b); ================================================ FILE: include/system.h ================================================ #pragma once char *get_hardware_id(); ================================================ FILE: include/version.h.in ================================================ #define PROJECT_VERSION "@PROJECT_VERSION@" ================================================ FILE: include/wl_client/gamescope_reshade.h ================================================ /* Generated by wayland-scanner 1.23.0 */ #ifndef GAMESCOPE_RESHADE_CLIENT_PROTOCOL_H #define GAMESCOPE_RESHADE_CLIENT_PROTOCOL_H #include #include #include "wayland-client.h" #ifdef __cplusplus extern "C" { #endif /** * @page page_gamescope_reshade The gamescope_reshade protocol * gamescope-specific reshade integration * * @section page_desc_gamescope_reshade Description * * This protocol allows applications to load and interact with a reshade FX shader in gamescope. * * @section page_ifaces_gamescope_reshade Interfaces * - @subpage page_iface_gamescope_reshade - * @section page_copyright_gamescope_reshade Copyright *
 *
 * Copyright © 2024 Wayne Heaney
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 * 
*/ struct gamescope_reshade; #ifndef GAMESCOPE_RESHADE_INTERFACE #define GAMESCOPE_RESHADE_INTERFACE /** * @page page_iface_gamescope_reshade gamescope_reshade * @section page_iface_gamescope_reshade_api API * See @ref iface_gamescope_reshade. */ /** * @defgroup iface_gamescope_reshade The gamescope_reshade interface */ extern const struct wl_interface gamescope_reshade_interface; #endif /** * @ingroup iface_gamescope_reshade * @struct gamescope_reshade_listener */ struct gamescope_reshade_listener { /** * alerts when the requested effect is ready * * This event alerts the client when an effect has been enabled. * @param effect_path Path to the FX file */ void (*effect_ready)(void *data, struct gamescope_reshade *gamescope_reshade, const char *effect_path); }; /** * @ingroup iface_gamescope_reshade */ static inline int gamescope_reshade_add_listener(struct gamescope_reshade *gamescope_reshade, const struct gamescope_reshade_listener *listener, void *data) { return wl_proxy_add_listener((struct wl_proxy *) gamescope_reshade, (void (**)(void)) listener, data); } #define GAMESCOPE_RESHADE_DESTROY 0 #define GAMESCOPE_RESHADE_SET_EFFECT 1 #define GAMESCOPE_RESHADE_ENABLE_EFFECT 2 #define GAMESCOPE_RESHADE_SET_UNIFORM_VARIABLE 3 #define GAMESCOPE_RESHADE_DISABLE_EFFECT 4 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_EFFECT_READY_SINCE_VERSION 1 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_DESTROY_SINCE_VERSION 1 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_SET_EFFECT_SINCE_VERSION 1 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_ENABLE_EFFECT_SINCE_VERSION 1 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_SET_UNIFORM_VARIABLE_SINCE_VERSION 1 /** * @ingroup iface_gamescope_reshade */ #define GAMESCOPE_RESHADE_DISABLE_EFFECT_SINCE_VERSION 1 /** @ingroup iface_gamescope_reshade */ static inline void gamescope_reshade_set_user_data(struct gamescope_reshade *gamescope_reshade, void *user_data) { wl_proxy_set_user_data((struct wl_proxy *) gamescope_reshade, user_data); } /** @ingroup iface_gamescope_reshade */ static inline void * gamescope_reshade_get_user_data(struct gamescope_reshade *gamescope_reshade) { return wl_proxy_get_user_data((struct wl_proxy *) gamescope_reshade); } static inline uint32_t gamescope_reshade_get_version(struct gamescope_reshade *gamescope_reshade) { return wl_proxy_get_version((struct wl_proxy *) gamescope_reshade); } /** * @ingroup iface_gamescope_reshade */ static inline void gamescope_reshade_destroy(struct gamescope_reshade *gamescope_reshade) { wl_proxy_marshal_flags((struct wl_proxy *) gamescope_reshade, GAMESCOPE_RESHADE_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) gamescope_reshade), WL_MARSHAL_FLAG_DESTROY); } /** * @ingroup iface_gamescope_reshade * * The effect will be disabled to allow an opportunity to set uniform variables before enabling it. */ static inline void gamescope_reshade_set_effect(struct gamescope_reshade *gamescope_reshade, const char *path) { wl_proxy_marshal_flags((struct wl_proxy *) gamescope_reshade, GAMESCOPE_RESHADE_SET_EFFECT, NULL, wl_proxy_get_version((struct wl_proxy *) gamescope_reshade), 0, path); } /** * @ingroup iface_gamescope_reshade * * Enables the effect that was previously loaded by set_effect. */ static inline void gamescope_reshade_enable_effect(struct gamescope_reshade *gamescope_reshade) { wl_proxy_marshal_flags((struct wl_proxy *) gamescope_reshade, GAMESCOPE_RESHADE_ENABLE_EFFECT, NULL, wl_proxy_get_version((struct wl_proxy *) gamescope_reshade), 0); } /** * @ingroup iface_gamescope_reshade * * Set the value of a uniform variable. Can be called before or after enabling the effect. */ static inline void gamescope_reshade_set_uniform_variable(struct gamescope_reshade *gamescope_reshade, const char *key, struct wl_array *value) { wl_proxy_marshal_flags((struct wl_proxy *) gamescope_reshade, GAMESCOPE_RESHADE_SET_UNIFORM_VARIABLE, NULL, wl_proxy_get_version((struct wl_proxy *) gamescope_reshade), 0, key, value); } /** * @ingroup iface_gamescope_reshade * * Disables the effect that was previously enabled by enable_effect. */ static inline void gamescope_reshade_disable_effect(struct gamescope_reshade *gamescope_reshade) { wl_proxy_marshal_flags((struct wl_proxy *) gamescope_reshade, GAMESCOPE_RESHADE_DISABLE_EFFECT, NULL, wl_proxy_get_version((struct wl_proxy *) gamescope_reshade), 0); } #ifdef __cplusplus } #endif #endif ================================================ FILE: lib/x86_64/viture/libopencv_core.so.4.2 ================================================ [File too large to display: 18.5 MB] ================================================ FILE: lib/x86_64/viture/libopencv_core.so.4.2.0 ================================================ [File too large to display: 18.5 MB] ================================================ FILE: lib/x86_64/viture/libopencv_imgproc.so.4.2 ================================================ [File too large to display: 24.5 MB] ================================================ FILE: lib/x86_64/viture/libopencv_imgproc.so.4.2.0 ================================================ [File too large to display: 24.5 MB] ================================================ FILE: license_public_key.pem ================================================ -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuJuIZFWthQEOn4KbYYs70aMk9sna QT+7sDCZEEjpVyRPZQHP3zkY55jwNCzyCzZpdTDf3PHYHACvx3PT9wttUQ== -----END PUBLIC KEY----- ================================================ FILE: mkdocs.yml ================================================ site_name: XR Linux Driver site_description: Documentation for the XR Linux Driver project repo_url: https://github.com/wheaney/XRLinuxDriver repo_name: wheaney/XRLinuxDriver docs_dir: docs theme: name: material features: - navigation.instant - navigation.tracking - navigation.tabs - navigation.top - content.code.copy plugins: - search markdown_extensions: - admonition - toc: permalink: true - tables - pymdownx.highlight - pymdownx.superfences nav: - Home: index.md - Usage: - Mouse / joystick modes: mouse-and-joystick-modes.md - OpenTrack: - Listener (Input): opentrack-listener.md - App (Output): opentrack-app.md - 6DoF from 3DoF glasses + a webcam: 6dof-from-3dof-opentrack-neuralnet.md - Development: development.md ================================================ FILE: modules/rayneoSDKHeaders/base/FXRDebug.h ================================================ #ifndef FFALCONXR_DEBUG_H #define FFALCONXR_DEBUG_H #ifndef LOG_TAG #define LOG_TAG "RayNeoXR" #endif #ifdef ANDROID #include #ifdef __cplusplus extern "C" { #endif #ifndef NDEBUG #define FXR_LOG(LEVEL, format, ...) \ ((void) __android_log_print(ANDROID_LOG_##LEVEL, LOG_TAG, "[%s:%d] " format, __FILE__, __LINE__, ##__VA_ARGS__)) #else #define FXR_LOG(LEVEL, format, ...) ((void) __android_log_print(ANDROID_LOG_##LEVEL, LOG_TAG, format, ##__VA_ARGS__)) #ifndef LOGD #define LOGD(format, ...) #endif #endif #define FXR_LOG_FATAL(condition, format, ...) ((void) __android_log_assert(condition, LOG_TAG, format, ##__VA_ARGS__)) #define FXR_CHECK(condition, format, ...) \ (__predict_false(condition)) ? FXR_LOG_FATAL(condition, format, ##__VA_ARGS__) : ((void)0)) #ifndef LOGD #define LOGD(format, ...) FXR_LOG(DEBUG, format, ##__VA_ARGS__) #endif #ifndef LOGI #define LOGI(format, ...) FXR_LOG(INFO, format, ##__VA_ARGS__) #endif #ifndef LOGW #define LOGW(format, ...) FXR_LOG(WARN, format, ##__VA_ARGS__) #endif #ifndef LOGE #define LOGE(format, ...) FXR_LOG(ERROR, format, ##__VA_ARGS__) #endif #ifndef LOG_FATAL #define LOG_FATAL(format, ...) FXR_LOG_FATAL(NULL, format, ##__VA_ARGS__) #endif #ifdef __cplusplus } #endif #else #include "stdio.h" #define FXR_LOG(LEVEL, format, ...) printf("[%s]" format "\r\n", LEVEL, ##__VA_ARGS__) #ifndef LOGD #define LOGD(format, ...) FXR_LOG("DEBUG", format, ##__VA_ARGS__) #endif #ifndef LOGI #define LOGI(format, ...) FXR_LOG("INFO", format, ##__VA_ARGS__) #endif #ifndef LOGW #define LOGW(format, ...) FXR_LOG("WARN", format, ##__VA_ARGS__) #endif #ifndef LOGE #define LOGE(format, ...) FXR_LOG("ERROR", format, ##__VA_ARGS__) #endif #endif // ANDROID #include extern const char* GetEventStateName(int32_t state); extern int32_t GetFFalconErrorCode(int32_t libusbErrCode); #endif //FFALCONXR_DEBUG_H ================================================ FILE: modules/rayneoSDKHeaders/base/FXRError.h ================================================ #ifndef FFALCONXR_ERROR_H #define FFALCONXR_ERROR_H #ifdef __cplusplus extern "C" { #endif #include #include typedef enum { OK = 0, UNKNOWN_ERROR = INT32_MIN, FAILED = -EPERM, NO_MEMORY = -ENOMEM, UNSUPPORTED = -ENOSYS, INVALID_ARGS = -EINVAL, NOT_FOUND = -ENOENT, NO_DEVICE = -ENODEV, ALREADY_EXISTS = -EEXIST, DEAD_PIPE = -EPIPE, DATA_OVERFLOW = -EOVERFLOW, NO_DATA = -ENODATA, TRY_AGAIN = -EAGAIN, TIMED_OUT = -ETIMEDOUT, BAD_MSG = -EBADMSG, BAD_FD = -EBADFD, } FXRResult; #ifdef __cplusplus } #endif #endif //FFALCONXR_ERROR_H ================================================ FILE: modules/rayneoSDKHeaders/base/FXRMacro.h ================================================ #ifndef FFALCONXR_MACR_H #define FFALCONXR_MACR_H #include "base/FXRError.h" #include #include #ifdef ANDROID #include #endif typedef void (*IMUEventCallback)(const float acc[3], const float gyro[3], const float mag[3], uint64_t timeInNs); typedef void (*VsyncEventCallback)(); typedef void (*StateEventCallback)(uint32_t state, uint64_t timestamp, size_t length, const void* data); typedef void* (*SensorFusionFactory)(); typedef void (*XRConfigBroadcastCallback)(); typedef FXRResult (*XRConfigExternalReader)(const char* item, void*); #ifdef ANDROID typedef void (*FrameEventCallback)(AHardwareBuffer* buffer, int64_t timestamp, int64_t exposureTime); #else typedef void (*FrameEventCallback)(void* buffer, int64_t timestamp, int64_t exposureTime); #endif typedef void (*FrameDataCallback)(uint8_t* data, uint32_t w, uint32_t h, int64_t timestamp, int64_t exposureTime); #define XR_CHARACTER_ARRAYS_MAX_LEN (256) #define XR_PLANE_ARRAY_DEFAULT_SIZE (15) #if defined(__CYGWIN32__) #define RAYNEO_API_CALL __stdcall #define RAYNEO_API_EXPORT __declspec(dllexport) #define RAYNEO_API_PTR RAYNEO_API_CALL #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY) #define RAYNEO_API_CALL __stdcall #define RAYNEO_API_EXPORT __declspec(dllexport) #define RAYNEO_API_PTR RAYNEO_API_CALL #elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(LUMIN) #define RAYNEO_API_CALL #define RAYNEO_API_EXPORT __attribute__((visibility("default"))) #define RAYNEO_API_PTR #else #define RAYNEO_API_CALL #define RAYNEO_API_EXPORT #define RAYNEO_API_PTR #endif #define AUTO_GENERATED #endif //FFALCONXR_MACR_H ================================================ FILE: modules/rayneoSDKHeaders/base/FXRType.h ================================================ #ifndef FFALCONXR_TYPE_H #define FFALCONXR_TYPE_H #include "base/FXRMacro.h" #include #include #ifdef __cplusplus extern "C" { #endif typedef struct FXRRuntimeVersion { char commitTime[XR_CHARACTER_ARRAYS_MAX_LEN]; //build time char branch[XR_CHARACTER_ARRAYS_MAX_LEN]; //code branch char version[XR_CHARACTER_ARRAYS_MAX_LEN]; char buildTime[XR_CHARACTER_ARRAYS_MAX_LEN]; } FXRRuntimeVersion; enum FXRRuntimeStateType { kDevice = 0, kImu = 1 }; typedef enum FXRDeviceType { kProductUnknown = 0x00, kProductNextViewPro = 0x20, //一代眼镜nextviewpro kProductAries = 0x21, //二代眼镜白羊 kProductAries1p5Seeya = 0x22, //白羊1.5 Seeya屏 kProductAries1p5Sony = 0x23, //白羊1.5 Sony屏 kProductAries1p8 = 0x24, //白羊1.8 kProductTaurus = 0x30, //金牛 kProductMercury = 0x1000, //水星 } FXRDeviceType; typedef enum FXREye { kEyeLeft = 0, kEyeRight, kNumEyes, kEyeMono = kEyeLeft, kEyeMultiview = kEyeLeft, } FXREye; typedef enum { PLANE_HORIZONTAL_UP, /*like ceiling */ PLANE_HORIZONTAL_DOWN, /*like floor or table*/ PLANE_VERTICAL, /*like wall*/ PLANE_NON } XRPlaneProperty; enum FXRDistortionParamIndex { K1 = 0, K2 = 1, K3 = 2, P1 = 3, P2 = 4 }; typedef struct { bool deviceConnected; bool imuEnabled; } XRRuntimeStateInfo; typedef struct { uint64_t timestamp; float rotation[4]; //x,y,z,w float position[3]; } XRPoseInfo; typedef struct XRINFO4PREDICTPOSE { float latestGyro[3]; uint64_t latestSensorTimeStamp; //in nanoseconds XRPoseInfo latestPose; } XRInfo4PredictPose; typedef struct XRALGOSTATE { #ifdef __cplusplus XRALGOSTATE() { ffvinsStatus = -1; predictInfo = {.latestSensorTimeStamp = INT_MAX}; } #endif int32_t ffvinsStatus; XRInfo4PredictPose predictInfo; //for pose prediction } XRAlgoState; typedef struct { struct { float x, y, z, w; } rotation; struct { float x, y, z; } position; } HeadPose; typedef struct { HeadPose pose; //!< Head pose int32_t poseStatus; //!< Bit field (sxrTrackingMode) indicating pose status uint64_t poseTimeStampNs; //!< Time stamp in which the head pose was generated (nanoseconds) uint64_t poseFetchTimeNs; //!< Time stamp when this pose was retrieved uint64_t expectedDisplayTimeNs; //!< Expected time when this pose should be on screen (nanoseconds) } HeadPoseState; typedef struct { XRPoseInfo pose; float azimuth; float mag_field_strength; int mag_sensor_accuracy; } XRNineAxisPoseInfo; typedef struct { XRPlaneProperty property; XRPoseInfo pose; struct { float x, z; } local_range; float local_polygon[100]; int32_t local_polygon_size; } XRPlaneInfo; typedef struct { XRPlaneInfo data[XR_PLANE_ARRAY_DEFAULT_SIZE]; int32_t size; } XRPlaneArray; #ifdef __cplusplus } #endif #endif //FFALCONXR_TYPE_H ================================================ FILE: modules/rayneoSDKHeaders/device/XRDevice.h ================================================ #pragma once #include #include #include #include "xr/XRMacro.h" #include "base/FXRType.h" namespace ffalcon { struct XRDeviceStateCallback { virtual void OnConnected(int64_t id) = 0; virtual void OnDisconnect(int64_t id) = 0; }; class XRDeviceBase { PREVENT_COPY_AND_ASSIGN(XRDeviceBase); protected: using Callback = XRDeviceStateCallback; public: XRDeviceBase() = default; void SetId(int64_t id) { mId = id; } [[nodiscard]] inline int64_t Id() const { return mId; } [[nodiscard]] inline bool IsConnected() const { return mIsConnected; } void SetStateCallback(Callback* callback) { mCallback = callback; } virtual uint64_t Capabilities() { return 0; } virtual void Connect() = 0; virtual void Disconnect() = 0; virtual void Open() {} virtual void Close() {} protected: int64_t mId = -1; Callback* mCallback = nullptr; bool mIsConnected = false; }; class XRDeviceComponent : public XRDeviceBase { public: void SetParent(XRDeviceBase* parent) { mParent = parent; } [[nodiscard]] XRDeviceBase* GetParent() const { return mParent; } void Connect() override {} void Disconnect() override {} void Open() override { XRDeviceBase::Open(); } void Close() override { XRDeviceBase::Close(); } protected: XRDeviceBase* mParent = nullptr; }; class XRDeviceEntity : public XRDeviceBase, public XRDeviceStateCallback { public: uint64_t Capabilities() override { uint64_t cap = 0; for (auto& c: mComponents) { cap |= c->Capabilities(); } return cap; } protected: std::vector> mComponents; }; class DevCapImu { public: using ImuEventCallback = std::function& acc, std::array& gyro, std::array& mag)>; void SetImuEventCallback(ImuEventCallback&& callback) { mImuEventCallback = callback; } protected: ImuEventCallback mImuEventCallback; }; class DevCapCamera { public: using PreviewFrameCallback = std::function; using SnapshotCallback = std::function; const static uint64_t kCapMask = kCamera; void SetPreviewFrameCallback(PreviewFrameCallback&& callback) { mPreviewFrameCallback = callback; } void SetSnapshotCallback(SnapshotCallback&& callback) { mSnapshotCallback = callback; } [[nodiscard]] inline float FocalLength() const { return mFocalLengthMM; } [[nodiscard]] inline bool FacingFront() const { return mFacingFront; } virtual void StartPreview(int32_t width, int32_t height, int32_t frameRate) = 0; virtual void StopPreview() = 0; virtual void TakePhoto(int32_t width, int32_t height) = 0; protected: PreviewFrameCallback mPreviewFrameCallback; SnapshotCallback mSnapshotCallback; float mFocalLengthMM = 0; bool mFacingFront = false; }; class DevCapDisplay { public: using VsyncEventCallback = std::function; [[nodiscard]] inline uint32_t GetDisplayWidth() const { return mDisplayWidth; } [[nodiscard]] inline uint32_t GetDisplayHeight() const { return mDisplayHeight; } void SetVsyncEventCallback(VsyncEventCallback&& callback) { mVsyncEventCallback = callback; } virtual int32_t GetRefreshRate() = 0; virtual int64_t GetLatestVsync() = 0; protected: uint32_t mDisplayWidth = 0; uint32_t mDisplayHeight = 0; VsyncEventCallback mVsyncEventCallback; }; template class Component : public Caps..., public XRDeviceComponent {}; } // namespace ffalcon ================================================ FILE: modules/rayneoSDKHeaders/device/usb/XRDeviceState.h ================================================ #pragma once #include "base/FXRType.h" #define FXR_HID_SEND_MAGIC 0x66 #define FXR_HID_ACK_MAGIC 0x99 #ifdef __cplusplus extern "C" { #endif enum FXRColorAdjustOp { opWhiteBalanceWx = 0x01, opWhiteBalanceWy = 0x02, opColorGainR = 0x03, opColorGainG = 0x04, opColorGainB = 0x05, opColorEnhancementR = 0x06, opColorEnhancementG = 0x07, opColorEnhancementB = 0x08, opContrast = 0x09, opColorTemperature = 0x0A, opHue = 0x0B, opLoad = 0xF0, opReset = 0xFE, opSave = 0xFF, }; //kCmd* 为双向命令 //kAck* 为单向命令, 眼镜端->设备端 enum FXRUsbCommand { kCmdDeviceInfo = 0, kCmdImuOn = 1, kCmdImuOff = 2, kCmdSensorGyroCorrection = 3, kCmdDisplay3dMode = 6, kCmdDisplay2dMode = 7, kCmdPanelPresetSet = 9, kCmdSetPanelRotation = 0xA, kCmdPanelLumaSave = 0xD, kCmdPanelPowerOn = 0xE, kCmdPanelPowerOff = 0xF, kCmdPanelPowerSwitch = 0x10, kCmdPanelSwap = 0x12, kCmdAccelerateRate = 0x19, kCmdGyroRate = 0x1A, kCmdMagnetRate = 0x1B, kCmdParamReset = 0x1D, kCmdParamSave = 0x1F, kCmdPanelSet60fps = 0x20, kCmdPanelSet120fps = 0x21, kAckWheelKeyDoublePressed = 0x22, kCmdPanelGetFov = 0x23, KCmdAudioEnablePersistence = 0x25, //静音模式, 仅白羊1.0支持 kCmdSideBySideChange = 0x30, kCmdTraceReport = 0x33, //设备ID kCmdAudioEnable = 0x34, kCmdPsensorEnable = 0x38, kCmdImuCalibration = 0x3C, kCmdGetGyroBias = 0x3E, kCmdSetGyroBias = 0x3F, kAckGlassesSleepNotify = 0x41, kAckGlassesWakeupNotify = 0x42, kCmdAudioMode = 0x49, kCmdVolumeSet = 0x50, kCmdVolumeUp = 0x51, kCmdVolumeDown = 0x52, kAckWheelKeyPressed = 0x54, kCmdLuminanceUp = 0x55, kCmdLuminanceDown = 0x56, kAckWheelKeyLongPressed = 0x57, kCmdWheelKeySideBySideDisable = 0x58, kAckImuData = 0x65, kCmdReboot2Bootloader = 0x66, kCmdCaluLum = 0x67, kCmdGetLT7211Version = 0x6A, kCmdPanelColorAdjust = 0x73, kAckCommand = 0xC8, kAckUsbCommandLog = 0xC9, kAckTraceReport = 0xCA, kCmdUsbCommandPARGESDump = 0xCB, kCmdTimeSynchronize = 0xE1, //设备间时钟同步 }; typedef struct { float tsb[3][3]; float ta[3]; float tg[3]; } XRImuCalibrateInfo; /** * 新增成员请在结构体底部增加来确保向前兼容!!! * 并且修改ipc/XRRuntimeStateDesc.hpp涉及的定义!!! */ typedef struct { int32_t year; int32_t month; int32_t day; } TIME; typedef struct { float horizontalLeft; float horizontalRight; float verticalUp; float verticalDown; } FOV; typedef struct { uint8_t whiteBalanceWx; uint8_t whiteBalanceWy; uint8_t colorGainR; uint8_t colorGainG; uint8_t colorGainB; uint8_t colorEnhancementR; uint8_t colorEnhancementG; uint8_t colorEnhancementB; uint8_t contrast; uint8_t colorTemperature; uint8_t hue; } XRPanelColorParms; typedef union { XRPanelColorParms params; uint8_t data[12]; } PANELPARAMS; typedef struct { char manufacturer[32]; char hostManufacturer[32]; //Server所运行的设备manufacturer char glassesId[64]; //device id, SN码 int32_t firmwareVersion; TIME time; bool wakeUp; //true: wakeup, false: sleep bool dpStatus; //dp信号 bool sideBySide; bool whisper; bool psensorState; bool psensorValid; //接近传感器使能状态, 0使能, 眼镜会自动休眠. 1关闭,眼镜always wakeup bool lsensorValid; bool gsensorValid; bool msensorValid; bool muteMode; //静音模式, 仅白羊1.0支持 FOV fov; //FOV, 数值采用角度制 uint8_t volume; //current, [0, 12] uint8_t maxVolume; uint8_t luminance; //current luminance level, [0, maxLuminance] uint8_t maxLuminance; //max luminance level uint8_t frameRate; //fps PANELPARAMS panelParams; //屏幕参数 bool supportPanelColorAdjust; } XRDeviceState, XRDeviceInfo; #ifdef __cplusplus } #endif ================================================ FILE: modules/rayneoSDKHeaders/device/usb/XRPacket.h ================================================ #ifndef FFALCONXR_PACKET_H #define FFALCONXR_PACKET_H #ifdef __cplusplus extern "C" { #endif #include typedef struct { uint8_t magic; uint8_t type; uint8_t value; uint8_t data[52]; uint8_t reserved[9]; } XrHidCommand; typedef struct { uint8_t magic; uint8_t type; uint16_t length; } XrHidMsgHeader; typedef struct { float acc[3]; float gyro[3]; float temperature; float magnet[2]; uint32_t tick; float psensor; float lsensor; float magnet_2; //magnet第三个字节 } XrHidSensorData; typedef struct { XrHidMsgHeader head; XrHidSensorData sensor; union { struct { uint32_t count; uint8_t reserved[2]; uint8_t checksum; uint8_t flag; } normal; struct { uint32_t left; uint32_t right; } vsync; } end; } XrHidSensorEvent; typedef struct { XrHidMsgHeader head; uint32_t tick; uint8_t value; uint8_t cpuid[12]; //unique ID of MCU Device uint8_t board_id; //0x21 aries; //0x22 aries1p5_v1; //0x23 aries1p5 v2s uint8_t sensor_on; uint8_t support_fov; //1 for support, others for not support uint8_t date[12]; //example: “May 05 2020” uint16_t year; uint8_t month; uint8_t day; uint8_t glasses_fps; //120=120fps, others=60fps uint8_t luminance; uint8_t volume; // 0 ~ 12,0最小,12最大 uint8_t side_by_side; //1: sidebyside; 0: mirror uint8_t psesnor_enable; uint8_t audio_mode; //0 for normal mode; 1 for quiet mode uint8_t dp_status; //0 for dp not ready; 1 for dp ready uint8_t status3; uint8_t psensor_valid; uint8_t lsensor_valid; uint8_t gyro_valid; uint8_t magnet_valid; float reserve1; //smart PA left float reserve2; //smart PA right uint8_t max_luminance; uint8_t max_volume; uint8_t support_panel_color_adjust; uint8_t flag; } XrHidDeviceInfo; typedef struct { XrHidMsgHeader head; uint32_t tick; uint8_t value; uint8_t data[52]; uint8_t reserved; uint8_t checksum; uint8_t flag; } XrHidResponse; typedef struct { XrHidMsgHeader head; uint32_t tick; //此次消息由设备发往host时的时间戳 uint8_t value; uint8_t index; //时间同步response会连续发送10条 uint8_t reserve[2]; uint32_t receiveTick; //收到时间同步请求时的时间戳 uint8_t reserve2[48]; } XrHidTimeSyncResponse; typedef struct { uint32_t event; uint32_t length; uint64_t timestamp; uint8_t data[0]; } XrStateEvent; typedef struct { uint64_t host_time; //host time /** * 分体式 & 使用USB协议的设备, Vsync信号随IMU数据一起捎带给出 * 设计上携带了上一次Vsync的时间戳以及对应的SensorTime * 由这两个数据估计得到下一次vsync */ uint64_t last_vsync; //sensor time uint64_t sensor_time; //sensor time } XrVsyncEvent; typedef union { uint8_t data[64]; XrHidResponse response; XrHidSensorEvent sensor_data; XrHidDeviceInfo device_info; XrStateEvent state_event; XrVsyncEvent vsync_event; } XrDataPacket; static_assert(sizeof(XrDataPacket) == 64, "XrDataPacket size must be 64"); typedef struct { XrHidMsgHeader head; uint32_t tick; uint8_t type; uint8_t left_low; uint8_t left_high; uint8_t right_low; uint8_t right_high; uint8_t up_low; uint8_t up_high; uint8_t down_low; uint8_t down_high; } XrHidDeviceFov; typedef struct { uint8_t index; int64_t timestamp; int64_t exposure_time; } XrFrameEvent; #ifdef __cplusplus } #endif #endif //FFALCONXR_PACKET_H ================================================ FILE: modules/rayneoSDKHeaders/interface/FXRApi.h ================================================ #ifndef FFALCONXR_API_H #define FFALCONXR_API_H #include "base/FXRMacro.h" #include "base/FXRType.h" #include "device/usb/XRDeviceState.h" #include "ipc/FXRProtocol.h" extern "C" { /** * 初始化 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL InitInstance(); /** * IMU传感器的数据回调 * @param acc 加速度计数据 * @param gyro 陀螺仪数据 * @param mag 磁力计数据 * @param timeInNs 采集数据时间 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterIMUEventCallback(IMUEventCallback callback); RAYNEO_API_EXPORT void RAYNEO_API_CALL UnregisterIMUEventCallback(IMUEventCallback callback); /** * Vsync事件回调 * @param leftEyeInMs 左眼屏幕的Vsync时间 * @param rightEyeInMs 右眼屏幕的Vsync时间 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterVsyncEventCallback(VsyncEventCallback callback); RAYNEO_API_EXPORT void RAYNEO_API_CALL UnregisterVsyncEventCallback(VsyncEventCallback callback); /** * 运行状态事件回调 * @param state 状态编码 * @param data 状态信息 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterStateEventCallback(StateEventCallback callback); RAYNEO_API_EXPORT void RAYNEO_API_CALL UnregisterStateEventCallback(StateEventCallback callback); /** * 相机帧参数回调 (需先调用AcquireHardwareBuffer) * @param buffer 图像缓冲区 * @param timestamp 时间戳 * @param exposureTime 曝光时间 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterFrameEventCallback(FrameEventCallback callback); RAYNEO_API_EXPORT void RAYNEO_API_CALL UnregisterFrameEventCallback(FrameEventCallback callback); /** * 相机帧数据回调 * @param data 图像原始数据 * @param w 宽 * @param h 高 * @param timestamp 时间戳 * @param exposureTime 曝光时间 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterFrameDataCallback(FrameDataCallback callback); RAYNEO_API_EXPORT void RAYNEO_API_CALL UnregisterFrameDataCallback(FrameDataCallback callback); /** * 启动XR模式,进入Runtime的生命周期 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL StartXR(); /** * 停止XR模式,退出Runtime的生命周期 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL StopXR(); /** * 切换到2D镜像模式 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SwitchTo2D(); /** * 切换到3D的双目模式 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SwitchTo3D(); /** * 开启眼镜上报IMU数据 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL OpenIMU(); /** * 关闭眼镜上报IMU数据 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL CloseIMU(); /** * 设置声音模式 * @param mode 0 for 普通模式, 1 for 轻语模式 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SetAudioMode(uint8_t mode); /** * 设置音量 * @param val volume index (0~12) */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SetAudioVolume(uint8_t val); /** * Disable hardware SBS switch * @param seconds 时长 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL DisableWheelKeySideBySide(uint8_t seconds); /** * 保存设置 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SaveSettings(); /** * 请求设备信息 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL AcquireDeviceInfo(); /** * 读取设备信息 * @return 设备信息 */ RAYNEO_API_EXPORT XRDeviceInfo RAYNEO_API_CALL FetchDeviceInfo(); /** * Panel Display on */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelPowerOn(); /** * Panel Display off */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelPowerOff(); /** * Swap Two Panels Display Content */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelPowerSwap(); /** * set panel preset luminance * @param val */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelLunaSet(uint8_t val); /** * save luminance value to ROM */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelLunaSave(); /** * set frame rate of device * only support 120fps and 60fps * @param val 120 means 120fps, other value means 60fps */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelFrameRateSet(uint8_t val); /** * Reset all saved parameters */ RAYNEO_API_EXPORT void RAYNEO_API_CALL ResetSettings(); /** * Change SIDE_BY_SIDE on/off */ RAYNEO_API_EXPORT void RAYNEO_API_CALL SwitchSideBySide(); /** * 音频使能 * @param channel 0 for left, 1 for right * @param state 0 for disable, 1 for enable */ RAYNEO_API_EXPORT void RAYNEO_API_CALL EnableAudio(uint8_t channel, uint8_t state); /** * P-Sensor detect enable/disable * @param state 0 for enable P-Sensor, 1 for Always wakeup */ RAYNEO_API_EXPORT void RAYNEO_API_CALL EnablePSensorDetect(uint8_t state); /** * Reboot the device to boot loader * @param seconds */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RebootAndBootloader(); /** * set mute mode, 仅白羊1.0支持 * @param mute */ RAYNEO_API_EXPORT void RAYNEO_API_CALL EnableAudioPersistence(uint8_t mute); /** * 屏幕颜色参数设置 * @param op 具体操作 * @param value 值 */ RAYNEO_API_EXPORT void RAYNEO_API_CALL PanelColorParamsAdjust(uint8_t op, uint8_t value); //--------------------- Tracking ----------------------------- /** * Get/Predict pose of device * @param offsetInNs 0 means current pose, other means predict * @param rotation Quart(x, y, z, w) * @param position Vector3(x, y, z) */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetHeadTrackerPose(uint64_t offsetInNs, float* rotation, float* position); /** * Get the current pose of mobile device * @param rotation Quart(x, y, z, w) * @param position Vector3(x, y, z) */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetMobileTrackerPose(float* rotation, float* position); /** * Get current status of algo * @return status */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetHeadTrackerStatus(); RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetNineAxisOrientation(float* orientation); RAYNEO_API_EXPORT float RAYNEO_API_CALL GetNineAxisAzimuth(); RAYNEO_API_EXPORT float RAYNEO_API_CALL GetMagnetometerFieldStrength(); RAYNEO_API_EXPORT int RAYNEO_API_CALL GetMagnetometerSensorAccuracy(); /** * Recenter the internal head tracker pose */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RecenterHeadTracker(); RAYNEO_API_EXPORT void RAYNEO_API_CALL EnableSlamHeadTracker(); RAYNEO_API_EXPORT void RAYNEO_API_CALL DisableSlamHeadTracker(); RAYNEO_API_EXPORT void RAYNEO_API_CALL EnablePlaneDetection(); RAYNEO_API_EXPORT void RAYNEO_API_CALL DisablePlaneDetection(); /** * Get Plane Info * @param XRPlaneArray * @return */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetPlaneInfo(XRPlaneArray* planeInfo); // TODO:后续需要传入参数配置Camera输出流 RAYNEO_API_EXPORT void RAYNEO_API_CALL OpenCamera(); // 临时接口, 指定最大画幅比16:9分辨率打开相机 RAYNEO_API_EXPORT void RAYNEO_API_CALL OpenMaxResCamera(); RAYNEO_API_EXPORT void RAYNEO_API_CALL CloseCamera(); /** * Acquire hardware buffers * * @param buffers is a pointer to an array of AHardwareBuffer* used to store the acquired * hardware buffers. , but can be NULL if capacityInput is 0. * @param capacityInput is the capacity of the buffers array, or 0 to indicate a request to * retrieve the required capacity. * @param countOutput pointer to the count of buffers written, or a pointer to the required * capacity in the case that capacityInput is 0. * @return Error code or success flag. */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL AcquireHardwareBuffer(AHardwareBuffer** buffers, uint8_t capacityInput, uint8_t* countOutput); /** * Get the latest AHardwareBuffer * * @param buffer the latest AHardwareBuffer * @param timestamp the timestamp of the latest frame * @param exposureTime the exposure time of the latest frame * @return Error code or success flag. */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetLatestBuffer(AHardwareBuffer** buffer, int64_t* timestamp, int64_t* exposureTime); /** * Get the latest frame * * @param data the latest frame data * @param width the width of the latest frame * @param height the height of the latest frame * @param timestamp the timestamp of the latest frame * @param exposureTime the exposure time of the latest frame * @return Error code or success flag. */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetLatestFrame(uint8_t** data, uint32_t* width, uint32_t* height, int64_t* timestamp, int64_t* exposureTime); /** * Send command to runtime * @param unit runtime unit * @param command command detail * @param param * @param len * @return */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL SendCommand(FXRControlUnit unit, FXRControlCommand command, void* param = nullptr, uint32_t len = 0); /** * set property * @param item * @param value * @param len * @return */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL SetProp(const char* item, void* value, const int32_t len); /** * get set property * @param item * @param value * @param len * @return */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL GetProp(const char* item, void* value, int32_t& len); //--------------------- Query ----------------------------- /** * Query the specific type's code of Runtime state */ RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL QueryRuntimeState(FXRRuntimeStateType type); //--------------------- Configuration ---------------------- /** * read configuration from external * @param reader callback */ RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterXRConfigurationExternalReader(XRConfigExternalReader reader); } #endif //FFALCONXR_API_H ================================================ FILE: modules/rayneoSDKHeaders/interface/FXRClient.h ================================================ #ifndef FFALCONXR_CLIENT_H #define FFALCONXR_CLIENT_H #include "interface/FXRApi.h" #include extern "C" { RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL EstablishServiceConnection(int32_t fd); RAYNEO_API_EXPORT void RAYNEO_API_CALL ReleaseServiceConnection(); RAYNEO_API_EXPORT void RAYNEO_API_CALL NativeVsync(int64_t frameTimeNanos, float displayRefreshRateHz); RAYNEO_API_EXPORT void RAYNEO_API_CALL LoadConfigFromMemory(const uint8_t* buf, const uint32_t len); RAYNEO_API_EXPORT void RAYNEO_API_CALL SetSurface(ANativeWindow* window, int32_t width, int32_t height); RAYNEO_API_EXPORT void RAYNEO_API_CALL SetWindowFocus(bool hasFocus); } #endif //FFALCONXR_CLIENT_H ================================================ FILE: modules/rayneoSDKHeaders/interface/FXRServer.h ================================================ #ifndef FFALCONXR_SERVER_H #define FFALCONXR_SERVER_H #include "interface/FXRApi.h" extern "C" { RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL EstablishUsbConnection(int32_t fileDescriptor); RAYNEO_API_EXPORT void RAYNEO_API_CALL ReleaseUsbConnection(); RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL AcceptConnection(int32_t fd); RAYNEO_API_EXPORT int32_t RAYNEO_API_CALL LoadConfigFromStorage(const char* path); RAYNEO_API_EXPORT void RAYNEO_API_CALL SetSensorFusionFactory(SensorFusionFactory factory); RAYNEO_API_EXPORT void RAYNEO_API_CALL RegisterConfigChangesNotifier(XRConfigBroadcastCallback notifier); } #endif //FFALCONXR_SERVER_H ================================================ FILE: modules/rayneoSDKHeaders/ipc/FXRProtocol.h ================================================ #ifndef FFALCONXR_IPC_PROTOCOL_H #define FFALCONXR_IPC_PROTOCOL_H #ifdef __cplusplus extern "C" { #endif enum FXRStateEvent { kStateUnknown = 0, kStateDeviceConnected, kStateDeviceDisconnected, kStateImuOn, kStateImuOff, kStateVolumeChanged, kStateWheelKeyPressed, kStateWheelKeyLongPressed, kStateWheelKeyDoublePressed, kStateDeviceInterrupt, kStateDevicePlugged, kStateDeviceUnPlugged, kStatePanelLunaChanged, kStateAudioModeChanged, kStateGlassSleep, kStateGlassWakeup, //response kStateDeviceInfoResponseArrived = 0x4000, //Mag Calibration kStateMagNeedCalibrate = 0x6000, kStateMagDoingCalibrate = 0x6001, kStateMagCalibrateSuccess = 0x6002, kStateMagCalibrateFailed = 0x6003, //time sync kStateSynchronizeTime = 0x8001, }; //注意与FxrApi.java中的定义保持一致 enum CallbackType { IMUEvent = 0, StateEvent = 1, VsyncEvent = 2, FrameEvent = 3, }; enum FXRControlUnit { kUnitUnknown, kUnitHeadTracker, kUnitConfiguration, }; enum FXRControlCommand { kCtlCmdUnknown, kCtlCmdStartMagCalibration, kCtlCmdStopMagCalibration, kCtlCmdResetRenderParameters, kCtlCmdUseATW, kCtlCmdUseSinglePass, }; #ifdef __cplusplus } #endif #endif //FFALCONXR_IPC_PROTOCOL_H ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr.h ================================================ #ifndef OPENXR_H_ #define OPENXR_H_ 1 /* ** Copyright 2017-2023 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ /* ** This header is generated from the Khronos OpenXR XML API Registry. ** */ #ifdef __cplusplus extern "C" { #endif #define XR_VERSION_1_0 1 #include "openxr_platform_defines.h" #define XR_MAKE_VERSION(major, minor, patch) \ ((((major) & 0xffffULL) << 48) | (((minor) & 0xffffULL) << 32) | ((patch) & 0xffffffffULL)) // OpenXR current version number. #define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 28) #define XR_VERSION_MAJOR(version) (uint16_t)(((uint64_t)(version) >> 48)& 0xffffULL) #define XR_VERSION_MINOR(version) (uint16_t)(((uint64_t)(version) >> 32) & 0xffffULL) #define XR_VERSION_PATCH(version) (uint32_t)((uint64_t)(version) & 0xffffffffULL) #define XR_MIN_COMPOSITION_LAYERS_SUPPORTED 16 #if !defined(XR_NULL_HANDLE) #if (XR_PTR_SIZE == 8) && XR_CPP_NULLPTR_SUPPORTED #define XR_NULL_HANDLE nullptr #else #define XR_NULL_HANDLE 0 #endif #endif #define XR_NULL_SYSTEM_ID 0 #define XR_NULL_PATH 0 #define XR_SUCCEEDED(result) ((result) >= 0) #define XR_FAILED(result) ((result) < 0) #define XR_UNQUALIFIED_SUCCESS(result) ((result) == 0) #define XR_NO_DURATION 0 #define XR_INFINITE_DURATION 0x7fffffffffffffffLL #define XR_MIN_HAPTIC_DURATION -1 #define XR_FREQUENCY_UNSPECIFIED 0 #define XR_MAX_EVENT_DATA_SIZE sizeof(XrEventDataBuffer) #define XR_EXTENSION_ENUM_BASE 1000000000 #define XR_EXTENSION_ENUM_STRIDE 1000 #if !defined(XR_MAY_ALIAS) #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4)) #define XR_MAY_ALIAS __attribute__((__may_alias__)) #else #define XR_MAY_ALIAS #endif #endif #if !defined(XR_DEFINE_HANDLE) #if (XR_PTR_SIZE == 8) #define XR_DEFINE_HANDLE(object) typedef struct object##_T* object; #else #define XR_DEFINE_HANDLE(object) typedef uint64_t object; #endif #endif #if !defined(XR_DEFINE_ATOM) #define XR_DEFINE_ATOM(object) typedef uint64_t object; #endif typedef uint64_t XrVersion; typedef uint64_t XrFlags64; XR_DEFINE_ATOM(XrSystemId) typedef uint32_t XrBool32; XR_DEFINE_ATOM(XrPath) typedef int64_t XrTime; typedef int64_t XrDuration; XR_DEFINE_HANDLE(XrInstance) XR_DEFINE_HANDLE(XrSession) XR_DEFINE_HANDLE(XrSpace) XR_DEFINE_HANDLE(XrAction) XR_DEFINE_HANDLE(XrSwapchain) XR_DEFINE_HANDLE(XrActionSet) #define XR_TRUE 1 #define XR_FALSE 0 #define XR_MAX_EXTENSION_NAME_SIZE 128 #define XR_MAX_API_LAYER_NAME_SIZE 256 #define XR_MAX_API_LAYER_DESCRIPTION_SIZE 256 #define XR_MAX_SYSTEM_NAME_SIZE 256 #define XR_MAX_APPLICATION_NAME_SIZE 128 #define XR_MAX_ENGINE_NAME_SIZE 128 #define XR_MAX_RUNTIME_NAME_SIZE 128 #define XR_MAX_PATH_LENGTH 256 #define XR_MAX_STRUCTURE_NAME_SIZE 64 #define XR_MAX_RESULT_STRING_SIZE 64 #define XR_MAX_ACTION_SET_NAME_SIZE 64 #define XR_MAX_LOCALIZED_ACTION_SET_NAME_SIZE 128 #define XR_MAX_ACTION_NAME_SIZE 64 #define XR_MAX_LOCALIZED_ACTION_NAME_SIZE 128 typedef enum XrResult { XR_SUCCESS = 0, XR_TIMEOUT_EXPIRED = 1, XR_SESSION_LOSS_PENDING = 3, XR_EVENT_UNAVAILABLE = 4, XR_SPACE_BOUNDS_UNAVAILABLE = 7, XR_SESSION_NOT_FOCUSED = 8, XR_FRAME_DISCARDED = 9, XR_ERROR_VALIDATION_FAILURE = -1, XR_ERROR_RUNTIME_FAILURE = -2, XR_ERROR_OUT_OF_MEMORY = -3, XR_ERROR_API_VERSION_UNSUPPORTED = -4, XR_ERROR_INITIALIZATION_FAILED = -6, XR_ERROR_FUNCTION_UNSUPPORTED = -7, XR_ERROR_FEATURE_UNSUPPORTED = -8, XR_ERROR_EXTENSION_NOT_PRESENT = -9, XR_ERROR_LIMIT_REACHED = -10, XR_ERROR_SIZE_INSUFFICIENT = -11, XR_ERROR_HANDLE_INVALID = -12, XR_ERROR_INSTANCE_LOST = -13, XR_ERROR_SESSION_RUNNING = -14, XR_ERROR_SESSION_NOT_RUNNING = -16, XR_ERROR_SESSION_LOST = -17, XR_ERROR_SYSTEM_INVALID = -18, XR_ERROR_PATH_INVALID = -19, XR_ERROR_PATH_COUNT_EXCEEDED = -20, XR_ERROR_PATH_FORMAT_INVALID = -21, XR_ERROR_PATH_UNSUPPORTED = -22, XR_ERROR_LAYER_INVALID = -23, XR_ERROR_LAYER_LIMIT_EXCEEDED = -24, XR_ERROR_SWAPCHAIN_RECT_INVALID = -25, XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, XR_ERROR_ACTION_TYPE_MISMATCH = -27, XR_ERROR_SESSION_NOT_READY = -28, XR_ERROR_SESSION_NOT_STOPPING = -29, XR_ERROR_TIME_INVALID = -30, XR_ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, XR_ERROR_FILE_ACCESS_ERROR = -32, XR_ERROR_FILE_CONTENTS_INVALID = -33, XR_ERROR_FORM_FACTOR_UNSUPPORTED = -34, XR_ERROR_FORM_FACTOR_UNAVAILABLE = -35, XR_ERROR_API_LAYER_NOT_PRESENT = -36, XR_ERROR_CALL_ORDER_INVALID = -37, XR_ERROR_GRAPHICS_DEVICE_INVALID = -38, XR_ERROR_POSE_INVALID = -39, XR_ERROR_INDEX_OUT_OF_RANGE = -40, XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, XR_ERROR_NAME_DUPLICATED = -44, XR_ERROR_NAME_INVALID = -45, XR_ERROR_ACTIONSET_NOT_ATTACHED = -46, XR_ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, XR_ERROR_LOCALIZED_NAME_DUPLICATED = -48, XR_ERROR_LOCALIZED_NAME_INVALID = -49, XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, XR_ERROR_RUNTIME_UNAVAILABLE = -51, XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, XR_ERROR_SPACE_COMPONENT_NOT_SUPPORTED_FB = -1000113000, XR_ERROR_SPACE_COMPONENT_NOT_ENABLED_FB = -1000113001, XR_ERROR_SPACE_COMPONENT_STATUS_PENDING_FB = -1000113002, XR_ERROR_SPACE_COMPONENT_STATUS_ALREADY_SET_FB = -1000113003, XR_ERROR_UNEXPECTED_STATE_PASSTHROUGH_FB = -1000118000, XR_ERROR_FEATURE_ALREADY_CREATED_PASSTHROUGH_FB = -1000118001, XR_ERROR_FEATURE_REQUIRED_PASSTHROUGH_FB = -1000118002, XR_ERROR_NOT_PERMITTED_PASSTHROUGH_FB = -1000118003, XR_ERROR_INSUFFICIENT_RESOURCES_PASSTHROUGH_FB = -1000118004, XR_ERROR_UNKNOWN_PASSTHROUGH_FB = -1000118050, XR_ERROR_RENDER_MODEL_KEY_INVALID_FB = -1000119000, XR_RENDER_MODEL_UNAVAILABLE_FB = 1000119020, XR_ERROR_MARKER_NOT_TRACKED_VARJO = -1000124000, XR_ERROR_MARKER_ID_INVALID_VARJO = -1000124001, XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, XR_ERROR_SPACE_MAPPING_INSUFFICIENT_FB = -1000169000, XR_ERROR_SPACE_LOCALIZATION_FAILED_FB = -1000169001, XR_ERROR_SPACE_NETWORK_TIMEOUT_FB = -1000169002, XR_ERROR_SPACE_NETWORK_REQUEST_FAILED_FB = -1000169003, XR_ERROR_SPACE_CLOUD_STORAGE_DISABLED_FB = -1000169004, XR_ERROR_PASSTHROUGH_COLOR_LUT_BUFFER_SIZE_MISMATCH_META = -1000266000, XR_ERROR_HINT_ALREADY_SET_QCOM = -1000306000, XR_ERROR_SPACE_NOT_LOCATABLE_EXT = -1000429000, XR_ERROR_PLANE_DETECTION_PERMISSION_DENIED_EXT = -1000429001, XR_RESULT_MAX_ENUM = 0x7FFFFFFF } XrResult; typedef enum XrStructureType { XR_TYPE_UNKNOWN = 0, XR_TYPE_API_LAYER_PROPERTIES = 1, XR_TYPE_EXTENSION_PROPERTIES = 2, XR_TYPE_INSTANCE_CREATE_INFO = 3, XR_TYPE_SYSTEM_GET_INFO = 4, XR_TYPE_SYSTEM_PROPERTIES = 5, XR_TYPE_VIEW_LOCATE_INFO = 6, XR_TYPE_VIEW = 7, XR_TYPE_SESSION_CREATE_INFO = 8, XR_TYPE_SWAPCHAIN_CREATE_INFO = 9, XR_TYPE_SESSION_BEGIN_INFO = 10, XR_TYPE_VIEW_STATE = 11, XR_TYPE_FRAME_END_INFO = 12, XR_TYPE_HAPTIC_VIBRATION = 13, XR_TYPE_EVENT_DATA_BUFFER = 16, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING = 17, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED = 18, XR_TYPE_ACTION_STATE_BOOLEAN = 23, XR_TYPE_ACTION_STATE_FLOAT = 24, XR_TYPE_ACTION_STATE_VECTOR2F = 25, XR_TYPE_ACTION_STATE_POSE = 27, XR_TYPE_ACTION_SET_CREATE_INFO = 28, XR_TYPE_ACTION_CREATE_INFO = 29, XR_TYPE_INSTANCE_PROPERTIES = 32, XR_TYPE_FRAME_WAIT_INFO = 33, XR_TYPE_COMPOSITION_LAYER_PROJECTION = 35, XR_TYPE_COMPOSITION_LAYER_QUAD = 36, XR_TYPE_REFERENCE_SPACE_CREATE_INFO = 37, XR_TYPE_ACTION_SPACE_CREATE_INFO = 38, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING = 40, XR_TYPE_VIEW_CONFIGURATION_VIEW = 41, XR_TYPE_SPACE_LOCATION = 42, XR_TYPE_SPACE_VELOCITY = 43, XR_TYPE_FRAME_STATE = 44, XR_TYPE_VIEW_CONFIGURATION_PROPERTIES = 45, XR_TYPE_FRAME_BEGIN_INFO = 46, XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW = 48, XR_TYPE_EVENT_DATA_EVENTS_LOST = 49, XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING = 51, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED = 52, XR_TYPE_INTERACTION_PROFILE_STATE = 53, XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO = 55, XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO = 56, XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO = 57, XR_TYPE_ACTION_STATE_GET_INFO = 58, XR_TYPE_HAPTIC_ACTION_INFO = 59, XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO = 60, XR_TYPE_ACTIONS_SYNC_INFO = 61, XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO = 62, XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO = 63, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR = 1000006000, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR = 1000008000, XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR = 1000010000, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR = 1000014000, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT = 1000015000, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR = 1000017000, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR = 1000018000, XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000019000, XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000019001, XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000019002, XR_TYPE_DEBUG_UTILS_LABEL_EXT = 1000019003, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR = 1000023000, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR = 1000023001, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR = 1000023002, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR = 1000023003, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR = 1000023004, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR = 1000023005, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR = 1000024001, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR = 1000024002, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR = 1000024003, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR = 1000025000, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR = 1000025001, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR = 1000025002, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR = 1000027000, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR = 1000027001, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR = 1000027002, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR = 1000028000, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR = 1000028001, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR = 1000028002, XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT = 1000030000, XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT = 1000030001, XR_TYPE_VISIBILITY_MASK_KHR = 1000031000, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR = 1000031001, XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX = 1000033000, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX = 1000033003, XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR = 1000034000, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT = 1000039000, XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT = 1000039001, XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB = 1000040000, XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB = 1000041001, XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT = 1000046000, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX = 1000048004, XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT = 1000049000, XR_TYPE_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT = 1000049001, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT = 1000049002, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT = 1000049003, XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT = 1000051000, XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT = 1000051001, XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT = 1000051002, XR_TYPE_HAND_JOINT_LOCATIONS_EXT = 1000051003, XR_TYPE_HAND_JOINT_VELOCITIES_EXT = 1000051004, XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT = 1000052000, XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT = 1000052001, XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT = 1000052002, XR_TYPE_HAND_MESH_MSFT = 1000052003, XR_TYPE_HAND_POSE_TYPE_INFO_MSFT = 1000052004, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT = 1000053000, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT = 1000053001, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT = 1000053002, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT = 1000053003, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT = 1000053004, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT = 1000053005, XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT = 1000055000, XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT = 1000055001, XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT = 1000055002, XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT = 1000055003, XR_TYPE_CONTROLLER_MODEL_STATE_MSFT = 1000055004, XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC = 1000059000, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT = 1000063000, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT = 1000066000, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT = 1000066001, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB = 1000070000, XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB = 1000072000, XR_TYPE_BODY_TRACKER_CREATE_INFO_FB = 1000076001, XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB = 1000076002, XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_FB = 1000076004, XR_TYPE_BODY_JOINT_LOCATIONS_FB = 1000076005, XR_TYPE_BODY_SKELETON_FB = 1000076006, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT = 1000078000, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE = 1000079000, XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT = 1000080000, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR = 1000089000, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR = 1000090000, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR = 1000090001, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR = 1000090003, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR = 1000091000, XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT = 1000097000, XR_TYPE_SCENE_CREATE_INFO_MSFT = 1000097001, XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT = 1000097002, XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT = 1000097003, XR_TYPE_SCENE_COMPONENTS_MSFT = 1000097004, XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT = 1000097005, XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT = 1000097006, XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT = 1000097007, XR_TYPE_SCENE_OBJECTS_MSFT = 1000097008, XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT = 1000097009, XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT = 1000097010, XR_TYPE_SCENE_PLANES_MSFT = 1000097011, XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT = 1000097012, XR_TYPE_SCENE_MESHES_MSFT = 1000097013, XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT = 1000097014, XR_TYPE_SCENE_MESH_BUFFERS_MSFT = 1000097015, XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT = 1000097016, XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT = 1000097017, XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT = 1000097018, XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT = 1000098000, XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT = 1000098001, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB = 1000101000, XR_TYPE_VIVE_TRACKER_PATHS_HTCX = 1000103000, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX = 1000103001, XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC = 1000104000, XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC = 1000104001, XR_TYPE_FACIAL_EXPRESSIONS_HTC = 1000104002, XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB = 1000108000, XR_TYPE_HAND_TRACKING_MESH_FB = 1000110001, XR_TYPE_HAND_TRACKING_SCALE_FB = 1000110003, XR_TYPE_HAND_TRACKING_AIM_STATE_FB = 1000111001, XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB = 1000112000, XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB = 1000113004, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB = 1000113003, XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB = 1000113007, XR_TYPE_SPACE_COMPONENT_STATUS_FB = 1000113001, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB = 1000113005, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB = 1000113006, XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB = 1000114000, XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB = 1000114001, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB = 1000114002, XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB = 1000115000, XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB = 1000116009, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB = 1000116004, XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB = 1000116002, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB = 1000117001, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB = 1000118000, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB = 1000118001, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB = 1000118002, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB = 1000118003, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB = 1000118004, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB = 1000118005, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB = 1000118006, XR_TYPE_PASSTHROUGH_STYLE_FB = 1000118020, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB = 1000118021, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB = 1000118022, XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB = 1000118023, XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB = 1000118030, XR_TYPE_RENDER_MODEL_PATH_INFO_FB = 1000119000, XR_TYPE_RENDER_MODEL_PROPERTIES_FB = 1000119001, XR_TYPE_RENDER_MODEL_BUFFER_FB = 1000119002, XR_TYPE_RENDER_MODEL_LOAD_INFO_FB = 1000119003, XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB = 1000119004, XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB = 1000119005, XR_TYPE_BINDING_MODIFICATIONS_KHR = 1000120000, XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO = 1000121000, XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO = 1000121001, XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO = 1000121002, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO = 1000122000, XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO = 1000124000, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO = 1000124001, XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO = 1000124002, XR_TYPE_FRAME_END_INFO_ML = 1000135000, XR_TYPE_GLOBAL_DIMMER_FRAME_END_INFO_ML = 1000136000, XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML = 1000137000, XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT = 1000142000, XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT = 1000142001, XR_TYPE_SPACE_QUERY_INFO_FB = 1000156001, XR_TYPE_SPACE_QUERY_RESULTS_FB = 1000156002, XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB = 1000156003, XR_TYPE_SPACE_UUID_FILTER_INFO_FB = 1000156054, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB = 1000156052, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB = 1000156103, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB = 1000156104, XR_TYPE_SPACE_SAVE_INFO_FB = 1000158000, XR_TYPE_SPACE_ERASE_INFO_FB = 1000158001, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB = 1000158106, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB = 1000158107, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB = 1000160000, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB = 1000161000, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB = 1000162000, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB = 1000163000, XR_TYPE_SPACE_SHARE_INFO_FB = 1000169001, XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB = 1000169002, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB = 1000171000, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB = 1000171001, XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB = 1000173001, XR_TYPE_SEMANTIC_LABELS_FB = 1000175000, XR_TYPE_ROOM_LAYOUT_FB = 1000175001, XR_TYPE_BOUNDARY_2D_FB = 1000175002, XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB = 1000175010, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE = 1000196000, XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB = 1000198001, XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB = 1000198050, XR_TYPE_SPACE_CONTAINER_FB = 1000199000, XR_TYPE_FOVEATION_EYE_TRACKED_PROFILE_CREATE_INFO_META = 1000200000, XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META = 1000200001, XR_TYPE_SYSTEM_FOVEATION_EYE_TRACKED_PROPERTIES_META = 1000200002, XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_FB = 1000201004, XR_TYPE_FACE_TRACKER_CREATE_INFO_FB = 1000201005, XR_TYPE_FACE_EXPRESSION_INFO_FB = 1000201002, XR_TYPE_FACE_EXPRESSION_WEIGHTS_FB = 1000201006, XR_TYPE_EYE_TRACKER_CREATE_INFO_FB = 1000202001, XR_TYPE_EYE_GAZES_INFO_FB = 1000202002, XR_TYPE_EYE_GAZES_FB = 1000202003, XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB = 1000202004, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB = 1000203002, XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB = 1000204000, XR_TYPE_HAPTIC_PCM_VIBRATION_FB = 1000209001, XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB = 1000209002, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_FB = 1000212000, XR_TYPE_LOCAL_DIMMING_FRAME_END_INFO_META = 1000216000, XR_TYPE_SYSTEM_VIRTUAL_KEYBOARD_PROPERTIES_META = 1000219001, XR_TYPE_VIRTUAL_KEYBOARD_CREATE_INFO_META = 1000219002, XR_TYPE_VIRTUAL_KEYBOARD_SPACE_CREATE_INFO_META = 1000219003, XR_TYPE_VIRTUAL_KEYBOARD_LOCATION_INFO_META = 1000219004, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_VISIBILITY_SET_INFO_META = 1000219005, XR_TYPE_VIRTUAL_KEYBOARD_ANIMATION_STATE_META = 1000219006, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_ANIMATION_STATES_META = 1000219007, XR_TYPE_VIRTUAL_KEYBOARD_TEXTURE_DATA_META = 1000219009, XR_TYPE_VIRTUAL_KEYBOARD_INPUT_INFO_META = 1000219010, XR_TYPE_VIRTUAL_KEYBOARD_TEXT_CONTEXT_CHANGE_INFO_META = 1000219011, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_COMMIT_TEXT_META = 1000219014, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_BACKSPACE_META = 1000219015, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_ENTER_META = 1000219016, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_SHOWN_META = 1000219017, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_HIDDEN_META = 1000219018, XR_TYPE_EXTERNAL_CAMERA_OCULUS = 1000226000, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META = 1000227000, XR_TYPE_PERFORMANCE_METRICS_STATE_META = 1000232001, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META = 1000232002, XR_TYPE_SPACE_LIST_SAVE_INFO_FB = 1000238000, XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB = 1000238001, XR_TYPE_SPACE_USER_CREATE_INFO_FB = 1000241001, XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META = 1000245000, XR_TYPE_SYSTEM_PASSTHROUGH_COLOR_LUT_PROPERTIES_META = 1000266000, XR_TYPE_PASSTHROUGH_COLOR_LUT_CREATE_INFO_META = 1000266001, XR_TYPE_PASSTHROUGH_COLOR_LUT_UPDATE_INFO_META = 1000266002, XR_TYPE_PASSTHROUGH_COLOR_MAP_LUT_META = 1000266100, XR_TYPE_PASSTHROUGH_COLOR_MAP_INTERPOLATED_LUT_META = 1000266101, XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC = 1000317001, XR_TYPE_PASSTHROUGH_COLOR_HTC = 1000317002, XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC = 1000317003, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC = 1000317004, XR_TYPE_FOVEATION_APPLY_INFO_HTC = 1000318000, XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC = 1000318001, XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC = 1000318002, XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT = 1000373000, XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX = 1000375000, XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX = 1000375001, XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT = 1000428000, XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT = 1000428001, XR_TYPE_PLANE_DETECTOR_CREATE_INFO_EXT = 1000429001, XR_TYPE_PLANE_DETECTOR_BEGIN_INFO_EXT = 1000429002, XR_TYPE_PLANE_DETECTOR_GET_INFO_EXT = 1000429003, XR_TYPE_PLANE_DETECTOR_LOCATIONS_EXT = 1000429004, XR_TYPE_PLANE_DETECTOR_LOCATION_EXT = 1000429005, XR_TYPE_PLANE_DETECTOR_POLYGON_BUFFER_EXT = 1000429006, XR_TYPE_SYSTEM_PLANE_DETECTION_PROPERTIES_EXT = 1000429007, XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN2_KHR = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, XR_TYPE_DEVICE_PCM_SAMPLE_RATE_GET_INFO_FB = XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB, XR_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF } XrStructureType; typedef enum XrFormFactor { XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY = 1, XR_FORM_FACTOR_HANDHELD_DISPLAY = 2, XR_FORM_FACTOR_MAX_ENUM = 0x7FFFFFFF } XrFormFactor; typedef enum XrViewConfigurationType { XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO = 1, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO = 2, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO = 1000037000, XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT = 1000054000, XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM = 0x7FFFFFFF } XrViewConfigurationType; typedef enum XrEnvironmentBlendMode { XR_ENVIRONMENT_BLEND_MODE_OPAQUE = 1, XR_ENVIRONMENT_BLEND_MODE_ADDITIVE = 2, XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND = 3, XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM = 0x7FFFFFFF } XrEnvironmentBlendMode; typedef enum XrReferenceSpaceType { XR_REFERENCE_SPACE_TYPE_VIEW = 1, XR_REFERENCE_SPACE_TYPE_LOCAL = 2, XR_REFERENCE_SPACE_TYPE_STAGE = 3, XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT = 1000038000, XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO = 1000121000, XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT = 1000426000, XR_REFERENCE_SPACE_TYPE_MAX_ENUM = 0x7FFFFFFF } XrReferenceSpaceType; typedef enum XrActionType { XR_ACTION_TYPE_BOOLEAN_INPUT = 1, XR_ACTION_TYPE_FLOAT_INPUT = 2, XR_ACTION_TYPE_VECTOR2F_INPUT = 3, XR_ACTION_TYPE_POSE_INPUT = 4, XR_ACTION_TYPE_VIBRATION_OUTPUT = 100, XR_ACTION_TYPE_MAX_ENUM = 0x7FFFFFFF } XrActionType; typedef enum XrEyeVisibility { XR_EYE_VISIBILITY_BOTH = 0, XR_EYE_VISIBILITY_LEFT = 1, XR_EYE_VISIBILITY_RIGHT = 2, XR_EYE_VISIBILITY_MAX_ENUM = 0x7FFFFFFF } XrEyeVisibility; typedef enum XrSessionState { XR_SESSION_STATE_UNKNOWN = 0, XR_SESSION_STATE_IDLE = 1, XR_SESSION_STATE_READY = 2, XR_SESSION_STATE_SYNCHRONIZED = 3, XR_SESSION_STATE_VISIBLE = 4, XR_SESSION_STATE_FOCUSED = 5, XR_SESSION_STATE_STOPPING = 6, XR_SESSION_STATE_LOSS_PENDING = 7, XR_SESSION_STATE_EXITING = 8, XR_SESSION_STATE_MAX_ENUM = 0x7FFFFFFF } XrSessionState; typedef enum XrObjectType { XR_OBJECT_TYPE_UNKNOWN = 0, XR_OBJECT_TYPE_INSTANCE = 1, XR_OBJECT_TYPE_SESSION = 2, XR_OBJECT_TYPE_SWAPCHAIN = 3, XR_OBJECT_TYPE_SPACE = 4, XR_OBJECT_TYPE_ACTION_SET = 5, XR_OBJECT_TYPE_ACTION = 6, XR_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000019000, XR_OBJECT_TYPE_SPATIAL_ANCHOR_MSFT = 1000039000, XR_OBJECT_TYPE_SPATIAL_GRAPH_NODE_BINDING_MSFT = 1000049000, XR_OBJECT_TYPE_HAND_TRACKER_EXT = 1000051000, XR_OBJECT_TYPE_BODY_TRACKER_FB = 1000076000, XR_OBJECT_TYPE_SCENE_OBSERVER_MSFT = 1000097000, XR_OBJECT_TYPE_SCENE_MSFT = 1000097001, XR_OBJECT_TYPE_FACIAL_TRACKER_HTC = 1000104000, XR_OBJECT_TYPE_FOVEATION_PROFILE_FB = 1000114000, XR_OBJECT_TYPE_TRIANGLE_MESH_FB = 1000117000, XR_OBJECT_TYPE_PASSTHROUGH_FB = 1000118000, XR_OBJECT_TYPE_PASSTHROUGH_LAYER_FB = 1000118002, XR_OBJECT_TYPE_GEOMETRY_INSTANCE_FB = 1000118004, XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT = 1000142000, XR_OBJECT_TYPE_FACE_TRACKER_FB = 1000201000, XR_OBJECT_TYPE_EYE_TRACKER_FB = 1000202000, XR_OBJECT_TYPE_VIRTUAL_KEYBOARD_META = 1000219000, XR_OBJECT_TYPE_SPACE_USER_FB = 1000241000, XR_OBJECT_TYPE_PASSTHROUGH_COLOR_LUT_META = 1000266000, XR_OBJECT_TYPE_PASSTHROUGH_HTC = 1000317000, XR_OBJECT_TYPE_PLANE_DETECTOR_EXT = 1000429000, XR_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF } XrObjectType; typedef XrFlags64 XrInstanceCreateFlags; // Flag bits for XrInstanceCreateFlags typedef XrFlags64 XrSessionCreateFlags; // Flag bits for XrSessionCreateFlags typedef XrFlags64 XrSpaceVelocityFlags; // Flag bits for XrSpaceVelocityFlags static const XrSpaceVelocityFlags XR_SPACE_VELOCITY_LINEAR_VALID_BIT = 0x00000001; static const XrSpaceVelocityFlags XR_SPACE_VELOCITY_ANGULAR_VALID_BIT = 0x00000002; typedef XrFlags64 XrSpaceLocationFlags; // Flag bits for XrSpaceLocationFlags static const XrSpaceLocationFlags XR_SPACE_LOCATION_ORIENTATION_VALID_BIT = 0x00000001; static const XrSpaceLocationFlags XR_SPACE_LOCATION_POSITION_VALID_BIT = 0x00000002; static const XrSpaceLocationFlags XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT = 0x00000004; static const XrSpaceLocationFlags XR_SPACE_LOCATION_POSITION_TRACKED_BIT = 0x00000008; typedef XrFlags64 XrSwapchainCreateFlags; // Flag bits for XrSwapchainCreateFlags static const XrSwapchainCreateFlags XR_SWAPCHAIN_CREATE_PROTECTED_CONTENT_BIT = 0x00000001; static const XrSwapchainCreateFlags XR_SWAPCHAIN_CREATE_STATIC_IMAGE_BIT = 0x00000002; typedef XrFlags64 XrSwapchainUsageFlags; // Flag bits for XrSwapchainUsageFlags static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT = 0x00000001; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000002; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_UNORDERED_ACCESS_BIT = 0x00000004; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_TRANSFER_SRC_BIT = 0x00000008; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_TRANSFER_DST_BIT = 0x00000010; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_SAMPLED_BIT = 0x00000020; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT = 0x00000040; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND = 0x00000080; static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_KHR = 0x00000080; // alias of XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND typedef XrFlags64 XrCompositionLayerFlags; // Flag bits for XrCompositionLayerFlags static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT = 0x00000001; static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT = 0x00000002; static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT = 0x00000004; typedef XrFlags64 XrViewStateFlags; // Flag bits for XrViewStateFlags static const XrViewStateFlags XR_VIEW_STATE_ORIENTATION_VALID_BIT = 0x00000001; static const XrViewStateFlags XR_VIEW_STATE_POSITION_VALID_BIT = 0x00000002; static const XrViewStateFlags XR_VIEW_STATE_ORIENTATION_TRACKED_BIT = 0x00000004; static const XrViewStateFlags XR_VIEW_STATE_POSITION_TRACKED_BIT = 0x00000008; typedef XrFlags64 XrInputSourceLocalizedNameFlags; // Flag bits for XrInputSourceLocalizedNameFlags static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_USER_PATH_BIT = 0x00000001; static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_INTERACTION_PROFILE_BIT = 0x00000002; static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_COMPONENT_BIT = 0x00000004; typedef void (XRAPI_PTR *PFN_xrVoidFunction)(void); typedef struct XrApiLayerProperties { XrStructureType type; void *XR_MAY_ALIAS next; char layerName[XR_MAX_API_LAYER_NAME_SIZE]; XrVersion specVersion; uint32_t layerVersion; char description[XR_MAX_API_LAYER_DESCRIPTION_SIZE]; } XrApiLayerProperties; typedef struct XrExtensionProperties { XrStructureType type; void *XR_MAY_ALIAS next; char extensionName[XR_MAX_EXTENSION_NAME_SIZE]; uint32_t extensionVersion; } XrExtensionProperties; typedef struct XrApplicationInfo { char applicationName[XR_MAX_APPLICATION_NAME_SIZE]; uint32_t applicationVersion; char engineName[XR_MAX_ENGINE_NAME_SIZE]; uint32_t engineVersion; XrVersion apiVersion; } XrApplicationInfo; typedef struct XrInstanceCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrInstanceCreateFlags createFlags; XrApplicationInfo applicationInfo; uint32_t enabledApiLayerCount; const char *const *enabledApiLayerNames; uint32_t enabledExtensionCount; const char *const *enabledExtensionNames; } XrInstanceCreateInfo; typedef struct XrInstanceProperties { XrStructureType type; void *XR_MAY_ALIAS next; XrVersion runtimeVersion; char runtimeName[XR_MAX_RUNTIME_NAME_SIZE]; } XrInstanceProperties; typedef struct XrEventDataBuffer { XrStructureType type; const void *XR_MAY_ALIAS next; uint8_t varying[4000]; } XrEventDataBuffer; typedef struct XrSystemGetInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrFormFactor formFactor; } XrSystemGetInfo; typedef struct XrSystemGraphicsProperties { uint32_t maxSwapchainImageHeight; uint32_t maxSwapchainImageWidth; uint32_t maxLayerCount; } XrSystemGraphicsProperties; typedef struct XrSystemTrackingProperties { XrBool32 orientationTracking; XrBool32 positionTracking; } XrSystemTrackingProperties; typedef struct XrSystemProperties { XrStructureType type; void *XR_MAY_ALIAS next; XrSystemId systemId; uint32_t vendorId; char systemName[XR_MAX_SYSTEM_NAME_SIZE]; XrSystemGraphicsProperties graphicsProperties; XrSystemTrackingProperties trackingProperties; } XrSystemProperties; typedef struct XrSessionCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrSessionCreateFlags createFlags; XrSystemId systemId; } XrSessionCreateInfo; typedef struct XrVector3f { float x; float y; float z; } XrVector3f; // XrSpaceVelocity extends XrSpaceLocation typedef struct XrSpaceVelocity { XrStructureType type; void *XR_MAY_ALIAS next; XrSpaceVelocityFlags velocityFlags; XrVector3f linearVelocity; XrVector3f angularVelocity; } XrSpaceVelocity; typedef struct XrQuaternionf { float x; float y; float z; float w; } XrQuaternionf; typedef struct XrPosef { XrQuaternionf orientation; XrVector3f position; } XrPosef; typedef struct XrReferenceSpaceCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrReferenceSpaceType referenceSpaceType; XrPosef poseInReferenceSpace; } XrReferenceSpaceCreateInfo; typedef struct XrExtent2Df { float width; float height; } XrExtent2Df; typedef struct XrActionSpaceCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrAction action; XrPath subactionPath; XrPosef poseInActionSpace; } XrActionSpaceCreateInfo; typedef struct XrSpaceLocation { XrStructureType type; void *XR_MAY_ALIAS next; XrSpaceLocationFlags locationFlags; XrPosef pose; } XrSpaceLocation; typedef struct XrViewConfigurationProperties { XrStructureType type; void *XR_MAY_ALIAS next; XrViewConfigurationType viewConfigurationType; XrBool32 fovMutable; } XrViewConfigurationProperties; typedef struct XrViewConfigurationView { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t recommendedImageRectWidth; uint32_t maxImageRectWidth; uint32_t recommendedImageRectHeight; uint32_t maxImageRectHeight; uint32_t recommendedSwapchainSampleCount; uint32_t maxSwapchainSampleCount; } XrViewConfigurationView; typedef struct XrSwapchainCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrSwapchainCreateFlags createFlags; XrSwapchainUsageFlags usageFlags; int64_t format; uint32_t sampleCount; uint32_t width; uint32_t height; uint32_t faceCount; uint32_t arraySize; uint32_t mipCount; } XrSwapchainCreateInfo; typedef struct XR_MAY_ALIAS XrSwapchainImageBaseHeader { XrStructureType type; void *XR_MAY_ALIAS next; } XrSwapchainImageBaseHeader; typedef struct XrSwapchainImageAcquireInfo { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSwapchainImageAcquireInfo; typedef struct XrSwapchainImageWaitInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrDuration timeout; } XrSwapchainImageWaitInfo; typedef struct XrSwapchainImageReleaseInfo { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSwapchainImageReleaseInfo; typedef struct XrSessionBeginInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrViewConfigurationType primaryViewConfigurationType; } XrSessionBeginInfo; typedef struct XrFrameWaitInfo { XrStructureType type; const void *XR_MAY_ALIAS next; } XrFrameWaitInfo; typedef struct XrFrameState { XrStructureType type; void *XR_MAY_ALIAS next; XrTime predictedDisplayTime; XrDuration predictedDisplayPeriod; XrBool32 shouldRender; } XrFrameState; typedef struct XrFrameBeginInfo { XrStructureType type; const void *XR_MAY_ALIAS next; } XrFrameBeginInfo; typedef struct XR_MAY_ALIAS XrCompositionLayerBaseHeader { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; } XrCompositionLayerBaseHeader; typedef struct XrFrameEndInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrTime displayTime; XrEnvironmentBlendMode environmentBlendMode; uint32_t layerCount; const XrCompositionLayerBaseHeader *const *layers; } XrFrameEndInfo; typedef struct XrViewLocateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrViewConfigurationType viewConfigurationType; XrTime displayTime; XrSpace space; } XrViewLocateInfo; typedef struct XrViewState { XrStructureType type; void *XR_MAY_ALIAS next; XrViewStateFlags viewStateFlags; } XrViewState; typedef struct XrFovf { float angleLeft; float angleRight; float angleUp; float angleDown; } XrFovf; typedef struct XrView { XrStructureType type; void *XR_MAY_ALIAS next; XrPosef pose; XrFovf fov; } XrView; typedef struct XrActionSetCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; char actionSetName[XR_MAX_ACTION_SET_NAME_SIZE]; char localizedActionSetName[XR_MAX_LOCALIZED_ACTION_SET_NAME_SIZE]; uint32_t priority; } XrActionSetCreateInfo; typedef struct XrActionCreateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; char actionName[XR_MAX_ACTION_NAME_SIZE]; XrActionType actionType; uint32_t countSubactionPaths; const XrPath *subactionPaths; char localizedActionName[XR_MAX_LOCALIZED_ACTION_NAME_SIZE]; } XrActionCreateInfo; typedef struct XrActionSuggestedBinding { XrAction action; XrPath binding; } XrActionSuggestedBinding; typedef struct XrInteractionProfileSuggestedBinding { XrStructureType type; const void *XR_MAY_ALIAS next; XrPath interactionProfile; uint32_t countSuggestedBindings; const XrActionSuggestedBinding *suggestedBindings; } XrInteractionProfileSuggestedBinding; typedef struct XrSessionActionSetsAttachInfo { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t countActionSets; const XrActionSet *actionSets; } XrSessionActionSetsAttachInfo; typedef struct XrInteractionProfileState { XrStructureType type; void *XR_MAY_ALIAS next; XrPath interactionProfile; } XrInteractionProfileState; typedef struct XrActionStateGetInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrAction action; XrPath subactionPath; } XrActionStateGetInfo; typedef struct XrActionStateBoolean { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 currentState; XrBool32 changedSinceLastSync; XrTime lastChangeTime; XrBool32 isActive; } XrActionStateBoolean; typedef struct XrActionStateFloat { XrStructureType type; void *XR_MAY_ALIAS next; float currentState; XrBool32 changedSinceLastSync; XrTime lastChangeTime; XrBool32 isActive; } XrActionStateFloat; typedef struct XrVector2f { float x; float y; } XrVector2f; typedef struct XrActionStateVector2f { XrStructureType type; void *XR_MAY_ALIAS next; XrVector2f currentState; XrBool32 changedSinceLastSync; XrTime lastChangeTime; XrBool32 isActive; } XrActionStateVector2f; typedef struct XrActionStatePose { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 isActive; } XrActionStatePose; typedef struct XrActiveActionSet { XrActionSet actionSet; XrPath subactionPath; } XrActiveActionSet; typedef struct XrActionsSyncInfo { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t countActiveActionSets; const XrActiveActionSet *activeActionSets; } XrActionsSyncInfo; typedef struct XrBoundSourcesForActionEnumerateInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrAction action; } XrBoundSourcesForActionEnumerateInfo; typedef struct XrInputSourceLocalizedNameGetInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrPath sourcePath; XrInputSourceLocalizedNameFlags whichComponents; } XrInputSourceLocalizedNameGetInfo; typedef struct XrHapticActionInfo { XrStructureType type; const void *XR_MAY_ALIAS next; XrAction action; XrPath subactionPath; } XrHapticActionInfo; typedef struct XR_MAY_ALIAS XrHapticBaseHeader { XrStructureType type; const void *XR_MAY_ALIAS next; } XrHapticBaseHeader; typedef struct XR_MAY_ALIAS XrBaseInStructure { XrStructureType type; const struct XrBaseInStructure *next; } XrBaseInStructure; typedef struct XR_MAY_ALIAS XrBaseOutStructure { XrStructureType type; struct XrBaseOutStructure *next; } XrBaseOutStructure; typedef struct XrOffset2Di { int32_t x; int32_t y; } XrOffset2Di; typedef struct XrExtent2Di { int32_t width; int32_t height; } XrExtent2Di; typedef struct XrRect2Di { XrOffset2Di offset; XrExtent2Di extent; } XrRect2Di; typedef struct XrSwapchainSubImage { XrSwapchain swapchain; XrRect2Di imageRect; uint32_t imageArrayIndex; } XrSwapchainSubImage; typedef struct XrCompositionLayerProjectionView { XrStructureType type; const void *XR_MAY_ALIAS next; XrPosef pose; XrFovf fov; XrSwapchainSubImage subImage; } XrCompositionLayerProjectionView; typedef struct XrCompositionLayerProjection { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; uint32_t viewCount; const XrCompositionLayerProjectionView *views; } XrCompositionLayerProjection; typedef struct XrCompositionLayerQuad { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrEyeVisibility eyeVisibility; XrSwapchainSubImage subImage; XrPosef pose; XrExtent2Df size; } XrCompositionLayerQuad; typedef struct XR_MAY_ALIAS XrEventDataBaseHeader { XrStructureType type; const void *XR_MAY_ALIAS next; } XrEventDataBaseHeader; typedef struct XrEventDataEventsLost { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t lostEventCount; } XrEventDataEventsLost; typedef struct XrEventDataInstanceLossPending { XrStructureType type; const void *XR_MAY_ALIAS next; XrTime lossTime; } XrEventDataInstanceLossPending; typedef struct XrEventDataSessionStateChanged { XrStructureType type; const void *XR_MAY_ALIAS next; XrSession session; XrSessionState state; XrTime time; } XrEventDataSessionStateChanged; typedef struct XrEventDataReferenceSpaceChangePending { XrStructureType type; const void *XR_MAY_ALIAS next; XrSession session; XrReferenceSpaceType referenceSpaceType; XrTime changeTime; XrBool32 poseValid; XrPosef poseInPreviousSpace; } XrEventDataReferenceSpaceChangePending; typedef struct XrEventDataInteractionProfileChanged { XrStructureType type; const void *XR_MAY_ALIAS next; XrSession session; } XrEventDataInteractionProfileChanged; typedef struct XrHapticVibration { XrStructureType type; const void *XR_MAY_ALIAS next; XrDuration duration; float frequency; float amplitude; } XrHapticVibration; typedef struct XrOffset2Df { float x; float y; } XrOffset2Df; typedef struct XrRect2Df { XrOffset2Df offset; XrExtent2Df extent; } XrRect2Df; typedef struct XrVector4f { float x; float y; float z; float w; } XrVector4f; typedef struct XrColor4f { float r; float g; float b; float a; } XrColor4f; typedef XrResult (XRAPI_PTR *PFN_xrGetInstanceProcAddr)(XrInstance instance, const char *name, PFN_xrVoidFunction *function); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateApiLayerProperties)(uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrApiLayerProperties *properties); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateInstanceExtensionProperties)(const char *layerName, uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrExtensionProperties *properties); typedef XrResult (XRAPI_PTR *PFN_xrCreateInstance)(const XrInstanceCreateInfo *createInfo, XrInstance *instance); typedef XrResult (XRAPI_PTR *PFN_xrDestroyInstance)(XrInstance instance); typedef XrResult (XRAPI_PTR *PFN_xrGetInstanceProperties)(XrInstance instance, XrInstanceProperties *instanceProperties); typedef XrResult (XRAPI_PTR *PFN_xrPollEvent)(XrInstance instance, XrEventDataBuffer *eventData); typedef XrResult (XRAPI_PTR *PFN_xrResultToString)(XrInstance instance, XrResult value, char buffer[XR_MAX_RESULT_STRING_SIZE]); typedef XrResult (XRAPI_PTR *PFN_xrStructureTypeToString)(XrInstance instance, XrStructureType value, char buffer[XR_MAX_STRUCTURE_NAME_SIZE]); typedef XrResult (XRAPI_PTR *PFN_xrGetSystem)(XrInstance instance, const XrSystemGetInfo *getInfo, XrSystemId *systemId); typedef XrResult (XRAPI_PTR *PFN_xrGetSystemProperties)(XrInstance instance, XrSystemId systemId, XrSystemProperties *properties); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateEnvironmentBlendModes)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t environmentBlendModeCapacityInput, uint32_t *environmentBlendModeCountOutput, XrEnvironmentBlendMode *environmentBlendModes); typedef XrResult (XRAPI_PTR *PFN_xrCreateSession)(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session); typedef XrResult (XRAPI_PTR *PFN_xrDestroySession)(XrSession session); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateReferenceSpaces)(XrSession session, uint32_t spaceCapacityInput, uint32_t *spaceCountOutput, XrReferenceSpaceType *spaces); typedef XrResult (XRAPI_PTR *PFN_xrCreateReferenceSpace)(XrSession session, const XrReferenceSpaceCreateInfo *createInfo, XrSpace *space); typedef XrResult (XRAPI_PTR *PFN_xrGetReferenceSpaceBoundsRect)(XrSession session, XrReferenceSpaceType referenceSpaceType, XrExtent2Df *bounds); typedef XrResult (XRAPI_PTR *PFN_xrCreateActionSpace)(XrSession session, const XrActionSpaceCreateInfo *createInfo, XrSpace *space); typedef XrResult (XRAPI_PTR *PFN_xrLocateSpace)(XrSpace space, XrSpace baseSpace, XrTime time, XrSpaceLocation *location); typedef XrResult (XRAPI_PTR *PFN_xrDestroySpace)(XrSpace space); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateViewConfigurations)(XrInstance instance, XrSystemId systemId, uint32_t viewConfigurationTypeCapacityInput, uint32_t *viewConfigurationTypeCountOutput, XrViewConfigurationType *viewConfigurationTypes); typedef XrResult (XRAPI_PTR *PFN_xrGetViewConfigurationProperties)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, XrViewConfigurationProperties *configurationProperties); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateViewConfigurationViews)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t viewCapacityInput, uint32_t *viewCountOutput, XrViewConfigurationView *views); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSwapchainFormats)(XrSession session, uint32_t formatCapacityInput, uint32_t *formatCountOutput, int64_t *formats); typedef XrResult (XRAPI_PTR *PFN_xrCreateSwapchain)(XrSession session, const XrSwapchainCreateInfo *createInfo, XrSwapchain *swapchain); typedef XrResult (XRAPI_PTR *PFN_xrDestroySwapchain)(XrSwapchain swapchain); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSwapchainImages)(XrSwapchain swapchain, uint32_t imageCapacityInput, uint32_t *imageCountOutput, XrSwapchainImageBaseHeader *images); typedef XrResult (XRAPI_PTR *PFN_xrAcquireSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageAcquireInfo *acquireInfo, uint32_t *index); typedef XrResult (XRAPI_PTR *PFN_xrWaitSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageWaitInfo *waitInfo); typedef XrResult (XRAPI_PTR *PFN_xrReleaseSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageReleaseInfo *releaseInfo); typedef XrResult (XRAPI_PTR *PFN_xrBeginSession)(XrSession session, const XrSessionBeginInfo *beginInfo); typedef XrResult (XRAPI_PTR *PFN_xrEndSession)(XrSession session); typedef XrResult (XRAPI_PTR *PFN_xrRequestExitSession)(XrSession session); typedef XrResult (XRAPI_PTR *PFN_xrWaitFrame)(XrSession session, const XrFrameWaitInfo *frameWaitInfo, XrFrameState *frameState); typedef XrResult (XRAPI_PTR *PFN_xrBeginFrame)(XrSession session, const XrFrameBeginInfo *frameBeginInfo); typedef XrResult (XRAPI_PTR *PFN_xrEndFrame)(XrSession session, const XrFrameEndInfo *frameEndInfo); typedef XrResult (XRAPI_PTR *PFN_xrLocateViews)(XrSession session, const XrViewLocateInfo *viewLocateInfo, XrViewState *viewState, uint32_t viewCapacityInput, uint32_t *viewCountOutput, XrView *views); typedef XrResult (XRAPI_PTR *PFN_xrStringToPath)(XrInstance instance, const char *pathString, XrPath *path); typedef XrResult (XRAPI_PTR *PFN_xrPathToString)(XrInstance instance, XrPath path, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer); typedef XrResult (XRAPI_PTR *PFN_xrCreateActionSet)(XrInstance instance, const XrActionSetCreateInfo *createInfo, XrActionSet *actionSet); typedef XrResult (XRAPI_PTR *PFN_xrDestroyActionSet)(XrActionSet actionSet); typedef XrResult (XRAPI_PTR *PFN_xrCreateAction)(XrActionSet actionSet, const XrActionCreateInfo *createInfo, XrAction *action); typedef XrResult (XRAPI_PTR *PFN_xrDestroyAction)(XrAction action); typedef XrResult (XRAPI_PTR *PFN_xrSuggestInteractionProfileBindings)(XrInstance instance, const XrInteractionProfileSuggestedBinding *suggestedBindings); typedef XrResult (XRAPI_PTR *PFN_xrAttachSessionActionSets)(XrSession session, const XrSessionActionSetsAttachInfo *attachInfo); typedef XrResult (XRAPI_PTR *PFN_xrGetCurrentInteractionProfile)(XrSession session, XrPath topLevelUserPath, XrInteractionProfileState *interactionProfile); typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateBoolean)(XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateBoolean *state); typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateFloat)(XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateFloat *state); typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateVector2f)(XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateVector2f *state); typedef XrResult (XRAPI_PTR *PFN_xrGetActionStatePose)(XrSession session, const XrActionStateGetInfo *getInfo, XrActionStatePose *state); typedef XrResult (XRAPI_PTR *PFN_xrSyncActions)(XrSession session, const XrActionsSyncInfo *syncInfo); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateBoundSourcesForAction)(XrSession session, const XrBoundSourcesForActionEnumerateInfo *enumerateInfo, uint32_t sourceCapacityInput, uint32_t *sourceCountOutput, XrPath *sources); typedef XrResult (XRAPI_PTR *PFN_xrGetInputSourceLocalizedName)(XrSession session, const XrInputSourceLocalizedNameGetInfo *getInfo, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer); typedef XrResult (XRAPI_PTR *PFN_xrApplyHapticFeedback)(XrSession session, const XrHapticActionInfo *hapticActionInfo, const XrHapticBaseHeader *hapticFeedback); typedef XrResult (XRAPI_PTR *PFN_xrStopHapticFeedback)(XrSession session, const XrHapticActionInfo *hapticActionInfo); #ifndef XR_NO_PROTOTYPES XRAPI_ATTR __attribute__((unused)) XrResult XRAPI_CALL xrGetInstanceProcAddr( XrInstance instance, const char *name, PFN_xrVoidFunction *function); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateApiLayerProperties( uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrApiLayerProperties *properties); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateInstanceExtensionProperties( const char *layerName, uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrExtensionProperties *properties); XRAPI_ATTR XrResult XRAPI_CALL xrCreateInstance( const XrInstanceCreateInfo *createInfo, XrInstance *instance); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyInstance( XrInstance instance); XRAPI_ATTR XrResult XRAPI_CALL xrGetInstanceProperties( XrInstance instance, XrInstanceProperties *instanceProperties); XRAPI_ATTR XrResult XRAPI_CALL xrPollEvent( XrInstance instance, XrEventDataBuffer *eventData); XRAPI_ATTR XrResult XRAPI_CALL xrResultToString( XrInstance instance, XrResult value, char buffer[XR_MAX_RESULT_STRING_SIZE]); XRAPI_ATTR XrResult XRAPI_CALL xrStructureTypeToString( XrInstance instance, XrStructureType value, char buffer[XR_MAX_STRUCTURE_NAME_SIZE]); XRAPI_ATTR XrResult XRAPI_CALL xrGetSystem( XrInstance instance, const XrSystemGetInfo *getInfo, XrSystemId *systemId); XRAPI_ATTR XrResult XRAPI_CALL xrGetSystemProperties( XrInstance instance, XrSystemId systemId, XrSystemProperties *properties); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateEnvironmentBlendModes( XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t environmentBlendModeCapacityInput, uint32_t *environmentBlendModeCountOutput, XrEnvironmentBlendMode *environmentBlendModes); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSession( XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySession( XrSession session); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateReferenceSpaces( XrSession session, uint32_t spaceCapacityInput, uint32_t *spaceCountOutput, XrReferenceSpaceType *spaces); XRAPI_ATTR XrResult XRAPI_CALL xrCreateReferenceSpace( XrSession session, const XrReferenceSpaceCreateInfo *createInfo, XrSpace *space); XRAPI_ATTR XrResult XRAPI_CALL xrGetReferenceSpaceBoundsRect( XrSession session, XrReferenceSpaceType referenceSpaceType, XrExtent2Df *bounds); XRAPI_ATTR XrResult XRAPI_CALL xrCreateActionSpace( XrSession session, const XrActionSpaceCreateInfo *createInfo, XrSpace *space); XRAPI_ATTR XrResult XRAPI_CALL xrLocateSpace( XrSpace space, XrSpace baseSpace, XrTime time, XrSpaceLocation *location); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpace( XrSpace space); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViewConfigurations( XrInstance instance, XrSystemId systemId, uint32_t viewConfigurationTypeCapacityInput, uint32_t *viewConfigurationTypeCountOutput, XrViewConfigurationType *viewConfigurationTypes); XRAPI_ATTR XrResult XRAPI_CALL xrGetViewConfigurationProperties( XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, XrViewConfigurationProperties *configurationProperties); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViewConfigurationViews( XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t viewCapacityInput, uint32_t *viewCountOutput, XrViewConfigurationView *views); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSwapchainFormats( XrSession session, uint32_t formatCapacityInput, uint32_t *formatCountOutput, int64_t *formats); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchain( XrSession session, const XrSwapchainCreateInfo *createInfo, XrSwapchain *swapchain); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySwapchain( XrSwapchain swapchain); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSwapchainImages( XrSwapchain swapchain, uint32_t imageCapacityInput, uint32_t *imageCountOutput, XrSwapchainImageBaseHeader *images); XRAPI_ATTR XrResult XRAPI_CALL xrAcquireSwapchainImage( XrSwapchain swapchain, const XrSwapchainImageAcquireInfo *acquireInfo, uint32_t *index); XRAPI_ATTR XrResult XRAPI_CALL xrWaitSwapchainImage( XrSwapchain swapchain, const XrSwapchainImageWaitInfo *waitInfo); XRAPI_ATTR XrResult XRAPI_CALL xrReleaseSwapchainImage( XrSwapchain swapchain, const XrSwapchainImageReleaseInfo *releaseInfo); XRAPI_ATTR XrResult XRAPI_CALL xrBeginSession( XrSession session, const XrSessionBeginInfo *beginInfo); XRAPI_ATTR XrResult XRAPI_CALL xrEndSession( XrSession session); XRAPI_ATTR XrResult XRAPI_CALL xrRequestExitSession( XrSession session); XRAPI_ATTR XrResult XRAPI_CALL xrWaitFrame( XrSession session, const XrFrameWaitInfo *frameWaitInfo, XrFrameState *frameState); XRAPI_ATTR XrResult XRAPI_CALL xrBeginFrame( XrSession session, const XrFrameBeginInfo *frameBeginInfo); XRAPI_ATTR XrResult XRAPI_CALL xrEndFrame( XrSession session, const XrFrameEndInfo *frameEndInfo); XRAPI_ATTR XrResult XRAPI_CALL xrLocateViews( XrSession session, const XrViewLocateInfo *viewLocateInfo, XrViewState *viewState, uint32_t viewCapacityInput, uint32_t *viewCountOutput, XrView *views); XRAPI_ATTR XrResult XRAPI_CALL xrStringToPath( XrInstance instance, const char *pathString, XrPath *path); XRAPI_ATTR XrResult XRAPI_CALL xrPathToString( XrInstance instance, XrPath path, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer); XRAPI_ATTR XrResult XRAPI_CALL xrCreateActionSet( XrInstance instance, const XrActionSetCreateInfo *createInfo, XrActionSet *actionSet); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyActionSet( XrActionSet actionSet); XRAPI_ATTR XrResult XRAPI_CALL xrCreateAction( XrActionSet actionSet, const XrActionCreateInfo *createInfo, XrAction *action); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyAction( XrAction action); XRAPI_ATTR XrResult XRAPI_CALL xrSuggestInteractionProfileBindings( XrInstance instance, const XrInteractionProfileSuggestedBinding *suggestedBindings); XRAPI_ATTR XrResult XRAPI_CALL xrAttachSessionActionSets( XrSession session, const XrSessionActionSetsAttachInfo *attachInfo); XRAPI_ATTR XrResult XRAPI_CALL xrGetCurrentInteractionProfile( XrSession session, XrPath topLevelUserPath, XrInteractionProfileState *interactionProfile); XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateBoolean( XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateBoolean *state); XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateFloat( XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateFloat *state); XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateVector2f( XrSession session, const XrActionStateGetInfo *getInfo, XrActionStateVector2f *state); XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStatePose( XrSession session, const XrActionStateGetInfo *getInfo, XrActionStatePose *state); XRAPI_ATTR XrResult XRAPI_CALL xrSyncActions( XrSession session, const XrActionsSyncInfo *syncInfo); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateBoundSourcesForAction( XrSession session, const XrBoundSourcesForActionEnumerateInfo *enumerateInfo, uint32_t sourceCapacityInput, uint32_t *sourceCountOutput, XrPath *sources); XRAPI_ATTR XrResult XRAPI_CALL xrGetInputSourceLocalizedName( XrSession session, const XrInputSourceLocalizedNameGetInfo *getInfo, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer); XRAPI_ATTR XrResult XRAPI_CALL xrApplyHapticFeedback( XrSession session, const XrHapticActionInfo *hapticActionInfo, const XrHapticBaseHeader *hapticFeedback); XRAPI_ATTR XrResult XRAPI_CALL xrStopHapticFeedback( XrSession session, const XrHapticActionInfo *hapticActionInfo); #endif /* !XR_NO_PROTOTYPES */ #define XR_KHR_composition_layer_cube 1 #define XR_KHR_composition_layer_cube_SPEC_VERSION 8 #define XR_KHR_COMPOSITION_LAYER_CUBE_EXTENSION_NAME "XR_KHR_composition_layer_cube" typedef struct XrCompositionLayerCubeKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrEyeVisibility eyeVisibility; XrSwapchain swapchain; uint32_t imageArrayIndex; XrQuaternionf orientation; } XrCompositionLayerCubeKHR; #define XR_KHR_composition_layer_depth 1 #define XR_KHR_composition_layer_depth_SPEC_VERSION 6 #define XR_KHR_COMPOSITION_LAYER_DEPTH_EXTENSION_NAME "XR_KHR_composition_layer_depth" // XrCompositionLayerDepthInfoKHR extends XrCompositionLayerProjectionView typedef struct XrCompositionLayerDepthInfoKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrSwapchainSubImage subImage; float minDepth; float maxDepth; float nearZ; float farZ; } XrCompositionLayerDepthInfoKHR; #define XR_KHR_composition_layer_cylinder 1 #define XR_KHR_composition_layer_cylinder_SPEC_VERSION 4 #define XR_KHR_COMPOSITION_LAYER_CYLINDER_EXTENSION_NAME "XR_KHR_composition_layer_cylinder" typedef struct XrCompositionLayerCylinderKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrEyeVisibility eyeVisibility; XrSwapchainSubImage subImage; XrPosef pose; float radius; float centralAngle; float aspectRatio; } XrCompositionLayerCylinderKHR; #define XR_KHR_composition_layer_equirect 1 #define XR_KHR_composition_layer_equirect_SPEC_VERSION 3 #define XR_KHR_COMPOSITION_LAYER_EQUIRECT_EXTENSION_NAME "XR_KHR_composition_layer_equirect" typedef struct XrCompositionLayerEquirectKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrEyeVisibility eyeVisibility; XrSwapchainSubImage subImage; XrPosef pose; float radius; XrVector2f scale; XrVector2f bias; } XrCompositionLayerEquirectKHR; #define XR_KHR_visibility_mask 1 #define XR_KHR_visibility_mask_SPEC_VERSION 2 #define XR_KHR_VISIBILITY_MASK_EXTENSION_NAME "XR_KHR_visibility_mask" typedef enum XrVisibilityMaskTypeKHR { XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR = 1, XR_VISIBILITY_MASK_TYPE_VISIBLE_TRIANGLE_MESH_KHR = 2, XR_VISIBILITY_MASK_TYPE_LINE_LOOP_KHR = 3, XR_VISIBILITY_MASK_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF } XrVisibilityMaskTypeKHR; typedef struct XrVisibilityMaskKHR { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrVector2f *vertices; uint32_t indexCapacityInput; uint32_t indexCountOutput; uint32_t *indices; } XrVisibilityMaskKHR; typedef struct XrEventDataVisibilityMaskChangedKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrSession session; XrViewConfigurationType viewConfigurationType; uint32_t viewIndex; } XrEventDataVisibilityMaskChangedKHR; typedef XrResult (XRAPI_PTR *PFN_xrGetVisibilityMaskKHR)(XrSession session, XrViewConfigurationType viewConfigurationType, uint32_t viewIndex, XrVisibilityMaskTypeKHR visibilityMaskType, XrVisibilityMaskKHR *visibilityMask); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetVisibilityMaskKHR( XrSession session, XrViewConfigurationType viewConfigurationType, uint32_t viewIndex, XrVisibilityMaskTypeKHR visibilityMaskType, XrVisibilityMaskKHR* visibilityMask); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_KHR_composition_layer_color_scale_bias 1 #define XR_KHR_composition_layer_color_scale_bias_SPEC_VERSION 5 #define XR_KHR_COMPOSITION_LAYER_COLOR_SCALE_BIAS_EXTENSION_NAME "XR_KHR_composition_layer_color_scale_bias" // XrCompositionLayerColorScaleBiasKHR extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerColorScaleBiasKHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrColor4f colorScale; XrColor4f colorBias; } XrCompositionLayerColorScaleBiasKHR; #define XR_KHR_loader_init 1 #define XR_KHR_loader_init_SPEC_VERSION 1 #define XR_KHR_LOADER_INIT_EXTENSION_NAME "XR_KHR_loader_init" typedef struct XR_MAY_ALIAS XrLoaderInitInfoBaseHeaderKHR { XrStructureType type; const void *XR_MAY_ALIAS next; } XrLoaderInitInfoBaseHeaderKHR; typedef XrResult (XRAPI_PTR *PFN_xrInitializeLoaderKHR)( const XrLoaderInitInfoBaseHeaderKHR *loaderInitInfo); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrInitializeLoaderKHR( const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_KHR_composition_layer_equirect2 1 #define XR_KHR_composition_layer_equirect2_SPEC_VERSION 1 #define XR_KHR_COMPOSITION_LAYER_EQUIRECT2_EXTENSION_NAME "XR_KHR_composition_layer_equirect2" typedef struct XrCompositionLayerEquirect2KHR { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrEyeVisibility eyeVisibility; XrSwapchainSubImage subImage; XrPosef pose; float radius; float centralHorizontalAngle; float upperVerticalAngle; float lowerVerticalAngle; } XrCompositionLayerEquirect2KHR; #define XR_KHR_binding_modification 1 #define XR_KHR_binding_modification_SPEC_VERSION 1 #define XR_KHR_BINDING_MODIFICATION_EXTENSION_NAME "XR_KHR_binding_modification" typedef struct XR_MAY_ALIAS XrBindingModificationBaseHeaderKHR { XrStructureType type; const void *XR_MAY_ALIAS next; } XrBindingModificationBaseHeaderKHR; // XrBindingModificationsKHR extends XrInteractionProfileSuggestedBinding typedef struct XrBindingModificationsKHR { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t bindingModificationCount; const XrBindingModificationBaseHeaderKHR *const *bindingModifications; } XrBindingModificationsKHR; #define XR_KHR_swapchain_usage_input_attachment_bit 1 #define XR_KHR_swapchain_usage_input_attachment_bit_SPEC_VERSION 3 #define XR_KHR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_EXTENSION_NAME "XR_KHR_swapchain_usage_input_attachment_bit" #define XR_EXT_performance_settings 1 #define XR_EXT_performance_settings_SPEC_VERSION 4 #define XR_EXT_PERFORMANCE_SETTINGS_EXTENSION_NAME "XR_EXT_performance_settings" typedef enum XrPerfSettingsDomainEXT { XR_PERF_SETTINGS_DOMAIN_CPU_EXT = 1, XR_PERF_SETTINGS_DOMAIN_GPU_EXT = 2, XR_PERF_SETTINGS_DOMAIN_MAX_ENUM_EXT = 0x7FFFFFFF } XrPerfSettingsDomainEXT; typedef enum XrPerfSettingsSubDomainEXT { XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT = 1, XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT = 2, XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT = 3, XR_PERF_SETTINGS_SUB_DOMAIN_MAX_ENUM_EXT = 0x7FFFFFFF } XrPerfSettingsSubDomainEXT; typedef enum XrPerfSettingsLevelEXT { XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT = 0, XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT = 25, XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT = 50, XR_PERF_SETTINGS_LEVEL_BOOST_EXT = 75, XR_PERF_SETTINGS_LEVEL_MAX_ENUM_EXT = 0x7FFFFFFF } XrPerfSettingsLevelEXT; typedef enum XrPerfSettingsNotificationLevelEXT { XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT = 0, XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT = 25, XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT = 75, XR_PERF_SETTINGS_NOTIFICATION_LEVEL_MAX_ENUM_EXT = 0x7FFFFFFF } XrPerfSettingsNotificationLevelEXT; typedef struct XrEventDataPerfSettingsEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrPerfSettingsDomainEXT domain; XrPerfSettingsSubDomainEXT subDomain; XrPerfSettingsNotificationLevelEXT fromLevel; XrPerfSettingsNotificationLevelEXT toLevel; } XrEventDataPerfSettingsEXT; typedef XrResult (XRAPI_PTR *PFN_xrPerfSettingsSetPerformanceLevelEXT)(XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsLevelEXT level); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrPerfSettingsSetPerformanceLevelEXT( XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsLevelEXT level); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_thermal_query 1 #define XR_EXT_thermal_query_SPEC_VERSION 2 #define XR_EXT_THERMAL_QUERY_EXTENSION_NAME "XR_EXT_thermal_query" typedef XrResult (XRAPI_PTR *PFN_xrThermalGetTemperatureTrendEXT)(XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsNotificationLevelEXT *notificationLevel, float *tempHeadroom, float *tempSlope); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrThermalGetTemperatureTrendEXT( XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsNotificationLevelEXT* notificationLevel, float* tempHeadroom, float* tempSlope); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_debug_utils 1 XR_DEFINE_HANDLE(XrDebugUtilsMessengerEXT) #define XR_EXT_debug_utils_SPEC_VERSION 4 #define XR_EXT_DEBUG_UTILS_EXTENSION_NAME "XR_EXT_debug_utils" typedef XrFlags64 XrDebugUtilsMessageSeverityFlagsEXT; // Flag bits for XrDebugUtilsMessageSeverityFlagsEXT static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0x00000001; static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0x00000010; static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0x00000100; static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0x00001000; typedef XrFlags64 XrDebugUtilsMessageTypeFlagsEXT; // Flag bits for XrDebugUtilsMessageTypeFlagsEXT static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0x00000001; static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0x00000002; static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0x00000004; static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_CONFORMANCE_BIT_EXT = 0x00000008; typedef struct XrDebugUtilsObjectNameInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrObjectType objectType; uint64_t objectHandle; const char *objectName; } XrDebugUtilsObjectNameInfoEXT; typedef struct XrDebugUtilsLabelEXT { XrStructureType type; const void *XR_MAY_ALIAS next; const char *labelName; } XrDebugUtilsLabelEXT; typedef struct XrDebugUtilsMessengerCallbackDataEXT { XrStructureType type; const void *XR_MAY_ALIAS next; const char *messageId; const char *functionName; const char *message; uint32_t objectCount; XrDebugUtilsObjectNameInfoEXT *objects; uint32_t sessionLabelCount; XrDebugUtilsLabelEXT *sessionLabels; } XrDebugUtilsMessengerCallbackDataEXT; typedef XrBool32 (XRAPI_PTR *PFN_xrDebugUtilsMessengerCallbackEXT)( XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, XrDebugUtilsMessageTypeFlagsEXT messageTypes, const XrDebugUtilsMessengerCallbackDataEXT *callbackData, void *userData); // XrDebugUtilsMessengerCreateInfoEXT extends XrInstanceCreateInfo typedef struct XrDebugUtilsMessengerCreateInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrDebugUtilsMessageSeverityFlagsEXT messageSeverities; XrDebugUtilsMessageTypeFlagsEXT messageTypes; PFN_xrDebugUtilsMessengerCallbackEXT userCallback; void *XR_MAY_ALIAS userData; } XrDebugUtilsMessengerCreateInfoEXT; typedef XrResult (XRAPI_PTR *PFN_xrSetDebugUtilsObjectNameEXT)(XrInstance instance, const XrDebugUtilsObjectNameInfoEXT *nameInfo); typedef XrResult (XRAPI_PTR *PFN_xrCreateDebugUtilsMessengerEXT)(XrInstance instance, const XrDebugUtilsMessengerCreateInfoEXT *createInfo, XrDebugUtilsMessengerEXT *messenger); typedef XrResult (XRAPI_PTR *PFN_xrDestroyDebugUtilsMessengerEXT)( XrDebugUtilsMessengerEXT messenger); typedef XrResult (XRAPI_PTR *PFN_xrSubmitDebugUtilsMessageEXT)( XrInstance instance, XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, XrDebugUtilsMessageTypeFlagsEXT messageTypes, const XrDebugUtilsMessengerCallbackDataEXT *callbackData); typedef XrResult (XRAPI_PTR *PFN_xrSessionBeginDebugUtilsLabelRegionEXT)(XrSession session, const XrDebugUtilsLabelEXT *labelInfo); typedef XrResult (XRAPI_PTR *PFN_xrSessionEndDebugUtilsLabelRegionEXT)(XrSession session); typedef XrResult (XRAPI_PTR *PFN_xrSessionInsertDebugUtilsLabelEXT)(XrSession session, const XrDebugUtilsLabelEXT *labelInfo); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetDebugUtilsObjectNameEXT( XrInstance instance, const XrDebugUtilsObjectNameInfoEXT* nameInfo); XRAPI_ATTR XrResult XRAPI_CALL xrCreateDebugUtilsMessengerEXT( XrInstance instance, const XrDebugUtilsMessengerCreateInfoEXT* createInfo, XrDebugUtilsMessengerEXT* messenger); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyDebugUtilsMessengerEXT( XrDebugUtilsMessengerEXT messenger); XRAPI_ATTR XrResult XRAPI_CALL xrSubmitDebugUtilsMessageEXT( XrInstance instance, XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, XrDebugUtilsMessageTypeFlagsEXT messageTypes, const XrDebugUtilsMessengerCallbackDataEXT* callbackData); XRAPI_ATTR XrResult XRAPI_CALL xrSessionBeginDebugUtilsLabelRegionEXT( XrSession session, const XrDebugUtilsLabelEXT* labelInfo); XRAPI_ATTR XrResult XRAPI_CALL xrSessionEndDebugUtilsLabelRegionEXT( XrSession session); XRAPI_ATTR XrResult XRAPI_CALL xrSessionInsertDebugUtilsLabelEXT( XrSession session, const XrDebugUtilsLabelEXT* labelInfo); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_eye_gaze_interaction 1 #define XR_EXT_eye_gaze_interaction_SPEC_VERSION 2 #define XR_EXT_EYE_GAZE_INTERACTION_EXTENSION_NAME "XR_EXT_eye_gaze_interaction" // XrSystemEyeGazeInteractionPropertiesEXT extends XrSystemProperties typedef struct XrSystemEyeGazeInteractionPropertiesEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsEyeGazeInteraction; } XrSystemEyeGazeInteractionPropertiesEXT; // XrEyeGazeSampleTimeEXT extends XrSpaceLocation typedef struct XrEyeGazeSampleTimeEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrTime time; } XrEyeGazeSampleTimeEXT; #define XR_EXTX_overlay 1 #define XR_EXTX_overlay_SPEC_VERSION 5 #define XR_EXTX_OVERLAY_EXTENSION_NAME "XR_EXTX_overlay" typedef XrFlags64 XrOverlaySessionCreateFlagsEXTX; // Flag bits for XrOverlaySessionCreateFlagsEXTX typedef XrFlags64 XrOverlayMainSessionFlagsEXTX; // Flag bits for XrOverlayMainSessionFlagsEXTX static const XrOverlayMainSessionFlagsEXTX XR_OVERLAY_MAIN_SESSION_ENABLED_COMPOSITION_LAYER_INFO_DEPTH_BIT_EXTX = 0x00000001; // XrSessionCreateInfoOverlayEXTX extends XrSessionCreateInfo typedef struct XrSessionCreateInfoOverlayEXTX { XrStructureType type; const void *XR_MAY_ALIAS next; XrOverlaySessionCreateFlagsEXTX createFlags; uint32_t sessionLayersPlacement; } XrSessionCreateInfoOverlayEXTX; typedef struct XrEventDataMainSessionVisibilityChangedEXTX { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 visible; XrOverlayMainSessionFlagsEXTX flags; } XrEventDataMainSessionVisibilityChangedEXTX; #define XR_VARJO_quad_views 1 #define XR_VARJO_quad_views_SPEC_VERSION 1 #define XR_VARJO_QUAD_VIEWS_EXTENSION_NAME "XR_VARJO_quad_views" #define XR_MSFT_unbounded_reference_space 1 #define XR_MSFT_unbounded_reference_space_SPEC_VERSION 1 #define XR_MSFT_UNBOUNDED_REFERENCE_SPACE_EXTENSION_NAME "XR_MSFT_unbounded_reference_space" #define XR_MSFT_spatial_anchor 1 XR_DEFINE_HANDLE(XrSpatialAnchorMSFT) #define XR_MSFT_spatial_anchor_SPEC_VERSION 2 #define XR_MSFT_SPATIAL_ANCHOR_EXTENSION_NAME "XR_MSFT_spatial_anchor" typedef struct XrSpatialAnchorCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace space; XrPosef pose; XrTime time; } XrSpatialAnchorCreateInfoMSFT; typedef struct XrSpatialAnchorSpaceCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpatialAnchorMSFT anchor; XrPosef poseInAnchorSpace; } XrSpatialAnchorSpaceCreateInfoMSFT; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorMSFT)(XrSession session, const XrSpatialAnchorCreateInfoMSFT *createInfo, XrSpatialAnchorMSFT *anchor); typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorSpaceMSFT)(XrSession session, const XrSpatialAnchorSpaceCreateInfoMSFT *createInfo, XrSpace *space); typedef XrResult (XRAPI_PTR *PFN_xrDestroySpatialAnchorMSFT)(XrSpatialAnchorMSFT anchor); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorMSFT( XrSession session, const XrSpatialAnchorCreateInfoMSFT* createInfo, XrSpatialAnchorMSFT* anchor); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorSpaceMSFT( XrSession session, const XrSpatialAnchorSpaceCreateInfoMSFT* createInfo, XrSpace* space); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpatialAnchorMSFT( XrSpatialAnchorMSFT anchor); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_composition_layer_image_layout 1 #define XR_FB_composition_layer_image_layout_SPEC_VERSION 1 #define XR_FB_COMPOSITION_LAYER_IMAGE_LAYOUT_EXTENSION_NAME "XR_FB_composition_layer_image_layout" typedef XrFlags64 XrCompositionLayerImageLayoutFlagsFB; // Flag bits for XrCompositionLayerImageLayoutFlagsFB static const XrCompositionLayerImageLayoutFlagsFB XR_COMPOSITION_LAYER_IMAGE_LAYOUT_VERTICAL_FLIP_BIT_FB = 0x00000001; // XrCompositionLayerImageLayoutFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerImageLayoutFB { XrStructureType type; void *XR_MAY_ALIAS next; XrCompositionLayerImageLayoutFlagsFB flags; } XrCompositionLayerImageLayoutFB; #define XR_FB_composition_layer_alpha_blend 1 #define XR_FB_composition_layer_alpha_blend_SPEC_VERSION 2 #define XR_FB_COMPOSITION_LAYER_ALPHA_BLEND_EXTENSION_NAME "XR_FB_composition_layer_alpha_blend" typedef enum XrBlendFactorFB { XR_BLEND_FACTOR_ZERO_FB = 0, XR_BLEND_FACTOR_ONE_FB = 1, XR_BLEND_FACTOR_SRC_ALPHA_FB = 2, XR_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA_FB = 3, XR_BLEND_FACTOR_DST_ALPHA_FB = 4, XR_BLEND_FACTOR_ONE_MINUS_DST_ALPHA_FB = 5, XR_BLEND_FACTOR_MAX_ENUM_FB = 0x7FFFFFFF } XrBlendFactorFB; // XrCompositionLayerAlphaBlendFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerAlphaBlendFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBlendFactorFB srcFactorColor; XrBlendFactorFB dstFactorColor; XrBlendFactorFB srcFactorAlpha; XrBlendFactorFB dstFactorAlpha; } XrCompositionLayerAlphaBlendFB; #define XR_MND_headless 1 #define XR_MND_headless_SPEC_VERSION 2 #define XR_MND_HEADLESS_EXTENSION_NAME "XR_MND_headless" #define XR_OCULUS_android_session_state_enable 1 #define XR_OCULUS_android_session_state_enable_SPEC_VERSION 1 #define XR_OCULUS_ANDROID_SESSION_STATE_ENABLE_EXTENSION_NAME "XR_OCULUS_android_session_state_enable" #define XR_EXT_view_configuration_depth_range 1 #define XR_EXT_view_configuration_depth_range_SPEC_VERSION 1 #define XR_EXT_VIEW_CONFIGURATION_DEPTH_RANGE_EXTENSION_NAME "XR_EXT_view_configuration_depth_range" // XrViewConfigurationDepthRangeEXT extends XrViewConfigurationView typedef struct XrViewConfigurationDepthRangeEXT { XrStructureType type; void *XR_MAY_ALIAS next; float recommendedNearZ; float minNearZ; float recommendedFarZ; float maxFarZ; } XrViewConfigurationDepthRangeEXT; #define XR_EXT_conformance_automation 1 #define XR_EXT_conformance_automation_SPEC_VERSION 3 #define XR_EXT_CONFORMANCE_AUTOMATION_EXTENSION_NAME "XR_EXT_conformance_automation" typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceActiveEXT)(XrSession session, XrPath interactionProfile, XrPath topLevelPath, XrBool32 isActive); typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateBoolEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrBool32 state); typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateFloatEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, float state); typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateVector2fEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrVector2f state); typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceLocationEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrSpace space, XrPosef pose); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceActiveEXT( XrSession session, XrPath interactionProfile, XrPath topLevelPath, XrBool32 isActive); XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateBoolEXT( XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrBool32 state); XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateFloatEXT( XrSession session, XrPath topLevelPath, XrPath inputSourcePath, float state); XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateVector2fEXT( XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrVector2f state); XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceLocationEXT( XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrSpace space, XrPosef pose); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_MSFT_spatial_graph_bridge 1 XR_DEFINE_HANDLE(XrSpatialGraphNodeBindingMSFT) #define XR_MSFT_spatial_graph_bridge_SPEC_VERSION 2 #define XR_MSFT_SPATIAL_GRAPH_BRIDGE_EXTENSION_NAME "XR_MSFT_spatial_graph_bridge" #define XR_GUID_SIZE_MSFT 16 typedef enum XrSpatialGraphNodeTypeMSFT { XR_SPATIAL_GRAPH_NODE_TYPE_STATIC_MSFT = 1, XR_SPATIAL_GRAPH_NODE_TYPE_DYNAMIC_MSFT = 2, XR_SPATIAL_GRAPH_NODE_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSpatialGraphNodeTypeMSFT; typedef struct XrSpatialGraphNodeSpaceCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpatialGraphNodeTypeMSFT nodeType; uint8_t nodeId[XR_GUID_SIZE_MSFT]; XrPosef pose; } XrSpatialGraphNodeSpaceCreateInfoMSFT; typedef struct XrSpatialGraphStaticNodeBindingCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace space; XrPosef poseInSpace; XrTime time; } XrSpatialGraphStaticNodeBindingCreateInfoMSFT; typedef struct XrSpatialGraphNodeBindingPropertiesGetInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSpatialGraphNodeBindingPropertiesGetInfoMSFT; typedef struct XrSpatialGraphNodeBindingPropertiesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint8_t nodeId[XR_GUID_SIZE_MSFT]; XrPosef poseInNodeSpace; } XrSpatialGraphNodeBindingPropertiesMSFT; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialGraphNodeSpaceMSFT)(XrSession session, const XrSpatialGraphNodeSpaceCreateInfoMSFT *createInfo, XrSpace *space); typedef XrResult (XRAPI_PTR *PFN_xrTryCreateSpatialGraphStaticNodeBindingMSFT)(XrSession session, const XrSpatialGraphStaticNodeBindingCreateInfoMSFT *createInfo, XrSpatialGraphNodeBindingMSFT *nodeBinding); typedef XrResult (XRAPI_PTR *PFN_xrDestroySpatialGraphNodeBindingMSFT)( XrSpatialGraphNodeBindingMSFT nodeBinding); typedef XrResult (XRAPI_PTR *PFN_xrGetSpatialGraphNodeBindingPropertiesMSFT)( XrSpatialGraphNodeBindingMSFT nodeBinding, const XrSpatialGraphNodeBindingPropertiesGetInfoMSFT *getInfo, XrSpatialGraphNodeBindingPropertiesMSFT *properties); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialGraphNodeSpaceMSFT( XrSession session, const XrSpatialGraphNodeSpaceCreateInfoMSFT* createInfo, XrSpace* space); XRAPI_ATTR XrResult XRAPI_CALL xrTryCreateSpatialGraphStaticNodeBindingMSFT( XrSession session, const XrSpatialGraphStaticNodeBindingCreateInfoMSFT* createInfo, XrSpatialGraphNodeBindingMSFT* nodeBinding); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpatialGraphNodeBindingMSFT( XrSpatialGraphNodeBindingMSFT nodeBinding); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpatialGraphNodeBindingPropertiesMSFT( XrSpatialGraphNodeBindingMSFT nodeBinding, const XrSpatialGraphNodeBindingPropertiesGetInfoMSFT* getInfo, XrSpatialGraphNodeBindingPropertiesMSFT* properties); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_MSFT_hand_interaction 1 #define XR_MSFT_hand_interaction_SPEC_VERSION 1 #define XR_MSFT_HAND_INTERACTION_EXTENSION_NAME "XR_MSFT_hand_interaction" #define XR_EXT_hand_tracking 1 #define XR_HAND_JOINT_COUNT_EXT 26 XR_DEFINE_HANDLE(XrHandTrackerEXT) #define XR_EXT_hand_tracking_SPEC_VERSION 4 #define XR_EXT_HAND_TRACKING_EXTENSION_NAME "XR_EXT_hand_tracking" typedef enum XrHandEXT { XR_HAND_LEFT_EXT = 1, XR_HAND_RIGHT_EXT = 2, XR_HAND_MAX_ENUM_EXT = 0x7FFFFFFF } XrHandEXT; typedef enum XrHandJointEXT { XR_HAND_JOINT_PALM_EXT = 0, XR_HAND_JOINT_WRIST_EXT = 1, XR_HAND_JOINT_THUMB_METACARPAL_EXT = 2, XR_HAND_JOINT_THUMB_PROXIMAL_EXT = 3, XR_HAND_JOINT_THUMB_DISTAL_EXT = 4, XR_HAND_JOINT_THUMB_TIP_EXT = 5, XR_HAND_JOINT_INDEX_METACARPAL_EXT = 6, XR_HAND_JOINT_INDEX_PROXIMAL_EXT = 7, XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT = 8, XR_HAND_JOINT_INDEX_DISTAL_EXT = 9, XR_HAND_JOINT_INDEX_TIP_EXT = 10, XR_HAND_JOINT_MIDDLE_METACARPAL_EXT = 11, XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT = 12, XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT = 13, XR_HAND_JOINT_MIDDLE_DISTAL_EXT = 14, XR_HAND_JOINT_MIDDLE_TIP_EXT = 15, XR_HAND_JOINT_RING_METACARPAL_EXT = 16, XR_HAND_JOINT_RING_PROXIMAL_EXT = 17, XR_HAND_JOINT_RING_INTERMEDIATE_EXT = 18, XR_HAND_JOINT_RING_DISTAL_EXT = 19, XR_HAND_JOINT_RING_TIP_EXT = 20, XR_HAND_JOINT_LITTLE_METACARPAL_EXT = 21, XR_HAND_JOINT_LITTLE_PROXIMAL_EXT = 22, XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT = 23, XR_HAND_JOINT_LITTLE_DISTAL_EXT = 24, XR_HAND_JOINT_LITTLE_TIP_EXT = 25, XR_HAND_JOINT_MAX_ENUM_EXT = 0x7FFFFFFF } XrHandJointEXT; typedef enum XrHandJointSetEXT { XR_HAND_JOINT_SET_DEFAULT_EXT = 0, XR_HAND_JOINT_SET_HAND_WITH_FOREARM_ULTRALEAP = 1000149000, XR_HAND_JOINT_SET_MAX_ENUM_EXT = 0x7FFFFFFF } XrHandJointSetEXT; // XrSystemHandTrackingPropertiesEXT extends XrSystemProperties typedef struct XrSystemHandTrackingPropertiesEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsHandTracking; } XrSystemHandTrackingPropertiesEXT; typedef struct XrHandTrackerCreateInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrHandEXT hand; XrHandJointSetEXT handJointSet; } XrHandTrackerCreateInfoEXT; typedef struct XrHandJointsLocateInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; } XrHandJointsLocateInfoEXT; typedef struct XrHandJointLocationEXT { XrSpaceLocationFlags locationFlags; XrPosef pose; float radius; } XrHandJointLocationEXT; typedef struct XrHandJointVelocityEXT { XrSpaceVelocityFlags velocityFlags; XrVector3f linearVelocity; XrVector3f angularVelocity; } XrHandJointVelocityEXT; typedef struct XrHandJointLocationsEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 isActive; uint32_t jointCount; XrHandJointLocationEXT *jointLocations; } XrHandJointLocationsEXT; // XrHandJointVelocitiesEXT extends XrHandJointLocationsEXT typedef struct XrHandJointVelocitiesEXT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t jointCount; XrHandJointVelocityEXT *jointVelocities; } XrHandJointVelocitiesEXT; typedef XrResult (XRAPI_PTR *PFN_xrCreateHandTrackerEXT)(XrSession session, const XrHandTrackerCreateInfoEXT *createInfo, XrHandTrackerEXT *handTracker); typedef XrResult (XRAPI_PTR *PFN_xrDestroyHandTrackerEXT)(XrHandTrackerEXT handTracker); typedef XrResult (XRAPI_PTR *PFN_xrLocateHandJointsEXT)(XrHandTrackerEXT handTracker, const XrHandJointsLocateInfoEXT *locateInfo, XrHandJointLocationsEXT *locations); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateHandTrackerEXT( XrSession session, const XrHandTrackerCreateInfoEXT* createInfo, XrHandTrackerEXT* handTracker); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyHandTrackerEXT( XrHandTrackerEXT handTracker); XRAPI_ATTR XrResult XRAPI_CALL xrLocateHandJointsEXT( XrHandTrackerEXT handTracker, const XrHandJointsLocateInfoEXT* locateInfo, XrHandJointLocationsEXT* locations); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_MSFT_hand_tracking_mesh 1 #define XR_MSFT_hand_tracking_mesh_SPEC_VERSION 4 #define XR_MSFT_HAND_TRACKING_MESH_EXTENSION_NAME "XR_MSFT_hand_tracking_mesh" typedef enum XrHandPoseTypeMSFT { XR_HAND_POSE_TYPE_TRACKED_MSFT = 0, XR_HAND_POSE_TYPE_REFERENCE_OPEN_PALM_MSFT = 1, XR_HAND_POSE_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrHandPoseTypeMSFT; // XrSystemHandTrackingMeshPropertiesMSFT extends XrSystemProperties typedef struct XrSystemHandTrackingMeshPropertiesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsHandTrackingMesh; uint32_t maxHandMeshIndexCount; uint32_t maxHandMeshVertexCount; } XrSystemHandTrackingMeshPropertiesMSFT; typedef struct XrHandMeshSpaceCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrHandPoseTypeMSFT handPoseType; XrPosef poseInHandMeshSpace; } XrHandMeshSpaceCreateInfoMSFT; typedef struct XrHandMeshUpdateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrTime time; XrHandPoseTypeMSFT handPoseType; } XrHandMeshUpdateInfoMSFT; typedef struct XrHandMeshIndexBufferMSFT { uint32_t indexBufferKey; uint32_t indexCapacityInput; uint32_t indexCountOutput; uint32_t *indices; } XrHandMeshIndexBufferMSFT; typedef struct XrHandMeshVertexMSFT { XrVector3f position; XrVector3f normal; } XrHandMeshVertexMSFT; typedef struct XrHandMeshVertexBufferMSFT { XrTime vertexUpdateTime; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrHandMeshVertexMSFT *vertices; } XrHandMeshVertexBufferMSFT; typedef struct XrHandMeshMSFT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 isActive; XrBool32 indexBufferChanged; XrBool32 vertexBufferChanged; XrHandMeshIndexBufferMSFT indexBuffer; XrHandMeshVertexBufferMSFT vertexBuffer; } XrHandMeshMSFT; // XrHandPoseTypeInfoMSFT extends XrHandTrackerCreateInfoEXT typedef struct XrHandPoseTypeInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrHandPoseTypeMSFT handPoseType; } XrHandPoseTypeInfoMSFT; typedef XrResult (XRAPI_PTR *PFN_xrCreateHandMeshSpaceMSFT)(XrHandTrackerEXT handTracker, const XrHandMeshSpaceCreateInfoMSFT *createInfo, XrSpace *space); typedef XrResult (XRAPI_PTR *PFN_xrUpdateHandMeshMSFT)(XrHandTrackerEXT handTracker, const XrHandMeshUpdateInfoMSFT *updateInfo, XrHandMeshMSFT *handMesh); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateHandMeshSpaceMSFT( XrHandTrackerEXT handTracker, const XrHandMeshSpaceCreateInfoMSFT* createInfo, XrSpace* space); XRAPI_ATTR XrResult XRAPI_CALL xrUpdateHandMeshMSFT( XrHandTrackerEXT handTracker, const XrHandMeshUpdateInfoMSFT* updateInfo, XrHandMeshMSFT* handMesh); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_MSFT_secondary_view_configuration 1 #define XR_MSFT_secondary_view_configuration_SPEC_VERSION 1 #define XR_MSFT_SECONDARY_VIEW_CONFIGURATION_EXTENSION_NAME "XR_MSFT_secondary_view_configuration" // XrSecondaryViewConfigurationSessionBeginInfoMSFT extends XrSessionBeginInfo typedef struct XrSecondaryViewConfigurationSessionBeginInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t viewConfigurationCount; const XrViewConfigurationType *enabledViewConfigurationTypes; } XrSecondaryViewConfigurationSessionBeginInfoMSFT; typedef struct XrSecondaryViewConfigurationStateMSFT { XrStructureType type; void *XR_MAY_ALIAS next; XrViewConfigurationType viewConfigurationType; XrBool32 active; } XrSecondaryViewConfigurationStateMSFT; // XrSecondaryViewConfigurationFrameStateMSFT extends XrFrameState typedef struct XrSecondaryViewConfigurationFrameStateMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t viewConfigurationCount; XrSecondaryViewConfigurationStateMSFT *viewConfigurationStates; } XrSecondaryViewConfigurationFrameStateMSFT; typedef struct XrSecondaryViewConfigurationLayerInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrViewConfigurationType viewConfigurationType; XrEnvironmentBlendMode environmentBlendMode; uint32_t layerCount; const XrCompositionLayerBaseHeader *const *layers; } XrSecondaryViewConfigurationLayerInfoMSFT; // XrSecondaryViewConfigurationFrameEndInfoMSFT extends XrFrameEndInfo typedef struct XrSecondaryViewConfigurationFrameEndInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t viewConfigurationCount; const XrSecondaryViewConfigurationLayerInfoMSFT *viewConfigurationLayersInfo; } XrSecondaryViewConfigurationFrameEndInfoMSFT; // XrSecondaryViewConfigurationSwapchainCreateInfoMSFT extends XrSwapchainCreateInfo typedef struct XrSecondaryViewConfigurationSwapchainCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrViewConfigurationType viewConfigurationType; } XrSecondaryViewConfigurationSwapchainCreateInfoMSFT; #define XR_MSFT_first_person_observer 1 #define XR_MSFT_first_person_observer_SPEC_VERSION 1 #define XR_MSFT_FIRST_PERSON_OBSERVER_EXTENSION_NAME "XR_MSFT_first_person_observer" #define XR_MSFT_controller_model 1 #define XR_NULL_CONTROLLER_MODEL_KEY_MSFT 0 XR_DEFINE_ATOM(XrControllerModelKeyMSFT) #define XR_MSFT_controller_model_SPEC_VERSION 2 #define XR_MSFT_CONTROLLER_MODEL_EXTENSION_NAME "XR_MSFT_controller_model" #define XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT 64 typedef struct XrControllerModelKeyStateMSFT { XrStructureType type; void *XR_MAY_ALIAS next; XrControllerModelKeyMSFT modelKey; } XrControllerModelKeyStateMSFT; typedef struct XrControllerModelNodePropertiesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; char parentNodeName[XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT]; char nodeName[XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT]; } XrControllerModelNodePropertiesMSFT; typedef struct XrControllerModelPropertiesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t nodeCapacityInput; uint32_t nodeCountOutput; XrControllerModelNodePropertiesMSFT *nodeProperties; } XrControllerModelPropertiesMSFT; typedef struct XrControllerModelNodeStateMSFT { XrStructureType type; void *XR_MAY_ALIAS next; XrPosef nodePose; } XrControllerModelNodeStateMSFT; typedef struct XrControllerModelStateMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t nodeCapacityInput; uint32_t nodeCountOutput; XrControllerModelNodeStateMSFT *nodeStates; } XrControllerModelStateMSFT; typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelKeyMSFT)(XrSession session, XrPath topLevelUserPath, XrControllerModelKeyStateMSFT *controllerModelKeyState); typedef XrResult (XRAPI_PTR *PFN_xrLoadControllerModelMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, uint8_t *buffer); typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelPropertiesMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelPropertiesMSFT *properties); typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelStateMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelStateMSFT *state); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelKeyMSFT( XrSession session, XrPath topLevelUserPath, XrControllerModelKeyStateMSFT* controllerModelKeyState); XRAPI_ATTR XrResult XRAPI_CALL xrLoadControllerModelMSFT( XrSession session, XrControllerModelKeyMSFT modelKey, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, uint8_t* buffer); XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelPropertiesMSFT( XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelPropertiesMSFT* properties); XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelStateMSFT( XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelStateMSFT* state); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_win32_appcontainer_compatible 1 #define XR_EXT_win32_appcontainer_compatible_SPEC_VERSION 1 #define XR_EXT_WIN32_APPCONTAINER_COMPATIBLE_EXTENSION_NAME "XR_EXT_win32_appcontainer_compatible" #define XR_EPIC_view_configuration_fov 1 #define XR_EPIC_view_configuration_fov_SPEC_VERSION 2 #define XR_EPIC_VIEW_CONFIGURATION_FOV_EXTENSION_NAME "XR_EPIC_view_configuration_fov" // XrViewConfigurationViewFovEPIC extends XrViewConfigurationView typedef struct XrViewConfigurationViewFovEPIC { XrStructureType type; const void *XR_MAY_ALIAS next; XrFovf recommendedFov; XrFovf maxMutableFov; } XrViewConfigurationViewFovEPIC; #define XR_MSFT_composition_layer_reprojection 1 #define XR_MSFT_composition_layer_reprojection_SPEC_VERSION 1 #define XR_MSFT_COMPOSITION_LAYER_REPROJECTION_EXTENSION_NAME "XR_MSFT_composition_layer_reprojection" typedef enum XrReprojectionModeMSFT { XR_REPROJECTION_MODE_DEPTH_MSFT = 1, XR_REPROJECTION_MODE_PLANAR_FROM_DEPTH_MSFT = 2, XR_REPROJECTION_MODE_PLANAR_MANUAL_MSFT = 3, XR_REPROJECTION_MODE_ORIENTATION_ONLY_MSFT = 4, XR_REPROJECTION_MODE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrReprojectionModeMSFT; // XrCompositionLayerReprojectionInfoMSFT extends XrCompositionLayerProjection typedef struct XrCompositionLayerReprojectionInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrReprojectionModeMSFT reprojectionMode; } XrCompositionLayerReprojectionInfoMSFT; // XrCompositionLayerReprojectionPlaneOverrideMSFT extends XrCompositionLayerProjection typedef struct XrCompositionLayerReprojectionPlaneOverrideMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrVector3f position; XrVector3f normal; XrVector3f velocity; } XrCompositionLayerReprojectionPlaneOverrideMSFT; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateReprojectionModesMSFT)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t modeCapacityInput, uint32_t *modeCountOutput, XrReprojectionModeMSFT *modes); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateReprojectionModesMSFT( XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t modeCapacityInput, uint32_t* modeCountOutput, XrReprojectionModeMSFT* modes); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HUAWEI_controller_interaction 1 #define XR_HUAWEI_controller_interaction_SPEC_VERSION 1 #define XR_HUAWEI_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_HUAWEI_controller_interaction" #define XR_FB_swapchain_update_state 1 #define XR_FB_swapchain_update_state_SPEC_VERSION 3 #define XR_FB_SWAPCHAIN_UPDATE_STATE_EXTENSION_NAME "XR_FB_swapchain_update_state" typedef struct XR_MAY_ALIAS XrSwapchainStateBaseHeaderFB { XrStructureType type; void *XR_MAY_ALIAS next; } XrSwapchainStateBaseHeaderFB; typedef XrResult (XRAPI_PTR *PFN_xrUpdateSwapchainFB)(XrSwapchain swapchain, const XrSwapchainStateBaseHeaderFB *state); typedef XrResult (XRAPI_PTR *PFN_xrGetSwapchainStateFB)(XrSwapchain swapchain, XrSwapchainStateBaseHeaderFB *state); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrUpdateSwapchainFB( XrSwapchain swapchain, const XrSwapchainStateBaseHeaderFB* state); XRAPI_ATTR XrResult XRAPI_CALL xrGetSwapchainStateFB( XrSwapchain swapchain, XrSwapchainStateBaseHeaderFB* state); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_composition_layer_secure_content 1 #define XR_FB_composition_layer_secure_content_SPEC_VERSION 1 #define XR_FB_COMPOSITION_LAYER_SECURE_CONTENT_EXTENSION_NAME "XR_FB_composition_layer_secure_content" typedef XrFlags64 XrCompositionLayerSecureContentFlagsFB; // Flag bits for XrCompositionLayerSecureContentFlagsFB static const XrCompositionLayerSecureContentFlagsFB XR_COMPOSITION_LAYER_SECURE_CONTENT_EXCLUDE_LAYER_BIT_FB = 0x00000001; static const XrCompositionLayerSecureContentFlagsFB XR_COMPOSITION_LAYER_SECURE_CONTENT_REPLACE_LAYER_BIT_FB = 0x00000002; // XrCompositionLayerSecureContentFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerSecureContentFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerSecureContentFlagsFB flags; } XrCompositionLayerSecureContentFB; #define XR_FB_body_tracking 1 XR_DEFINE_HANDLE(XrBodyTrackerFB) #define XR_FB_body_tracking_SPEC_VERSION 1 #define XR_FB_BODY_TRACKING_EXTENSION_NAME "XR_FB_body_tracking" typedef enum XrBodyJointFB { XR_BODY_JOINT_ROOT_FB = 0, XR_BODY_JOINT_HIPS_FB = 1, XR_BODY_JOINT_SPINE_LOWER_FB = 2, XR_BODY_JOINT_SPINE_MIDDLE_FB = 3, XR_BODY_JOINT_SPINE_UPPER_FB = 4, XR_BODY_JOINT_CHEST_FB = 5, XR_BODY_JOINT_NECK_FB = 6, XR_BODY_JOINT_HEAD_FB = 7, XR_BODY_JOINT_LEFT_SHOULDER_FB = 8, XR_BODY_JOINT_LEFT_SCAPULA_FB = 9, XR_BODY_JOINT_LEFT_ARM_UPPER_FB = 10, XR_BODY_JOINT_LEFT_ARM_LOWER_FB = 11, XR_BODY_JOINT_LEFT_HAND_WRIST_TWIST_FB = 12, XR_BODY_JOINT_RIGHT_SHOULDER_FB = 13, XR_BODY_JOINT_RIGHT_SCAPULA_FB = 14, XR_BODY_JOINT_RIGHT_ARM_UPPER_FB = 15, XR_BODY_JOINT_RIGHT_ARM_LOWER_FB = 16, XR_BODY_JOINT_RIGHT_HAND_WRIST_TWIST_FB = 17, XR_BODY_JOINT_LEFT_HAND_PALM_FB = 18, XR_BODY_JOINT_LEFT_HAND_WRIST_FB = 19, XR_BODY_JOINT_LEFT_HAND_THUMB_METACARPAL_FB = 20, XR_BODY_JOINT_LEFT_HAND_THUMB_PROXIMAL_FB = 21, XR_BODY_JOINT_LEFT_HAND_THUMB_DISTAL_FB = 22, XR_BODY_JOINT_LEFT_HAND_THUMB_TIP_FB = 23, XR_BODY_JOINT_LEFT_HAND_INDEX_METACARPAL_FB = 24, XR_BODY_JOINT_LEFT_HAND_INDEX_PROXIMAL_FB = 25, XR_BODY_JOINT_LEFT_HAND_INDEX_INTERMEDIATE_FB = 26, XR_BODY_JOINT_LEFT_HAND_INDEX_DISTAL_FB = 27, XR_BODY_JOINT_LEFT_HAND_INDEX_TIP_FB = 28, XR_BODY_JOINT_LEFT_HAND_MIDDLE_METACARPAL_FB = 29, XR_BODY_JOINT_LEFT_HAND_MIDDLE_PROXIMAL_FB = 30, XR_BODY_JOINT_LEFT_HAND_MIDDLE_INTERMEDIATE_FB = 31, XR_BODY_JOINT_LEFT_HAND_MIDDLE_DISTAL_FB = 32, XR_BODY_JOINT_LEFT_HAND_MIDDLE_TIP_FB = 33, XR_BODY_JOINT_LEFT_HAND_RING_METACARPAL_FB = 34, XR_BODY_JOINT_LEFT_HAND_RING_PROXIMAL_FB = 35, XR_BODY_JOINT_LEFT_HAND_RING_INTERMEDIATE_FB = 36, XR_BODY_JOINT_LEFT_HAND_RING_DISTAL_FB = 37, XR_BODY_JOINT_LEFT_HAND_RING_TIP_FB = 38, XR_BODY_JOINT_LEFT_HAND_LITTLE_METACARPAL_FB = 39, XR_BODY_JOINT_LEFT_HAND_LITTLE_PROXIMAL_FB = 40, XR_BODY_JOINT_LEFT_HAND_LITTLE_INTERMEDIATE_FB = 41, XR_BODY_JOINT_LEFT_HAND_LITTLE_DISTAL_FB = 42, XR_BODY_JOINT_LEFT_HAND_LITTLE_TIP_FB = 43, XR_BODY_JOINT_RIGHT_HAND_PALM_FB = 44, XR_BODY_JOINT_RIGHT_HAND_WRIST_FB = 45, XR_BODY_JOINT_RIGHT_HAND_THUMB_METACARPAL_FB = 46, XR_BODY_JOINT_RIGHT_HAND_THUMB_PROXIMAL_FB = 47, XR_BODY_JOINT_RIGHT_HAND_THUMB_DISTAL_FB = 48, XR_BODY_JOINT_RIGHT_HAND_THUMB_TIP_FB = 49, XR_BODY_JOINT_RIGHT_HAND_INDEX_METACARPAL_FB = 50, XR_BODY_JOINT_RIGHT_HAND_INDEX_PROXIMAL_FB = 51, XR_BODY_JOINT_RIGHT_HAND_INDEX_INTERMEDIATE_FB = 52, XR_BODY_JOINT_RIGHT_HAND_INDEX_DISTAL_FB = 53, XR_BODY_JOINT_RIGHT_HAND_INDEX_TIP_FB = 54, XR_BODY_JOINT_RIGHT_HAND_MIDDLE_METACARPAL_FB = 55, XR_BODY_JOINT_RIGHT_HAND_MIDDLE_PROXIMAL_FB = 56, XR_BODY_JOINT_RIGHT_HAND_MIDDLE_INTERMEDIATE_FB = 57, XR_BODY_JOINT_RIGHT_HAND_MIDDLE_DISTAL_FB = 58, XR_BODY_JOINT_RIGHT_HAND_MIDDLE_TIP_FB = 59, XR_BODY_JOINT_RIGHT_HAND_RING_METACARPAL_FB = 60, XR_BODY_JOINT_RIGHT_HAND_RING_PROXIMAL_FB = 61, XR_BODY_JOINT_RIGHT_HAND_RING_INTERMEDIATE_FB = 62, XR_BODY_JOINT_RIGHT_HAND_RING_DISTAL_FB = 63, XR_BODY_JOINT_RIGHT_HAND_RING_TIP_FB = 64, XR_BODY_JOINT_RIGHT_HAND_LITTLE_METACARPAL_FB = 65, XR_BODY_JOINT_RIGHT_HAND_LITTLE_PROXIMAL_FB = 66, XR_BODY_JOINT_RIGHT_HAND_LITTLE_INTERMEDIATE_FB = 67, XR_BODY_JOINT_RIGHT_HAND_LITTLE_DISTAL_FB = 68, XR_BODY_JOINT_RIGHT_HAND_LITTLE_TIP_FB = 69, XR_BODY_JOINT_COUNT_FB = 70, XR_BODY_JOINT_NONE_FB = -1, XR_BODY_JOINT_MAX_ENUM_FB = 0x7FFFFFFF } XrBodyJointFB; typedef enum XrBodyJointSetFB { XR_BODY_JOINT_SET_DEFAULT_FB = 0, XR_BODY_JOINT_SET_MAX_ENUM_FB = 0x7FFFFFFF } XrBodyJointSetFB; typedef struct XrBodyJointLocationFB { XrSpaceLocationFlags locationFlags; XrPosef pose; } XrBodyJointLocationFB; // XrSystemBodyTrackingPropertiesFB extends XrSystemProperties typedef struct XrSystemBodyTrackingPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsBodyTracking; } XrSystemBodyTrackingPropertiesFB; typedef struct XrBodyTrackerCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrBodyJointSetFB bodyJointSet; } XrBodyTrackerCreateInfoFB; typedef struct XrBodySkeletonJointFB { int32_t joint; int32_t parentJoint; XrPosef pose; } XrBodySkeletonJointFB; typedef struct XrBodySkeletonFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t jointCount; XrBodySkeletonJointFB *joints; } XrBodySkeletonFB; typedef struct XrBodyJointsLocateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; } XrBodyJointsLocateInfoFB; typedef struct XrBodyJointLocationsFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 isActive; float confidence; uint32_t jointCount; XrBodyJointLocationFB *jointLocations; uint32_t skeletonChangedCount; XrTime time; } XrBodyJointLocationsFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateBodyTrackerFB)(XrSession session, const XrBodyTrackerCreateInfoFB *createInfo, XrBodyTrackerFB *bodyTracker); typedef XrResult (XRAPI_PTR *PFN_xrDestroyBodyTrackerFB)(XrBodyTrackerFB bodyTracker); typedef XrResult (XRAPI_PTR *PFN_xrLocateBodyJointsFB)(XrBodyTrackerFB bodyTracker, const XrBodyJointsLocateInfoFB *locateInfo, XrBodyJointLocationsFB *locations); typedef XrResult (XRAPI_PTR *PFN_xrGetBodySkeletonFB)(XrBodyTrackerFB bodyTracker, XrBodySkeletonFB *skeleton); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateBodyTrackerFB( XrSession session, const XrBodyTrackerCreateInfoFB* createInfo, XrBodyTrackerFB* bodyTracker); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyBodyTrackerFB( XrBodyTrackerFB bodyTracker); XRAPI_ATTR XrResult XRAPI_CALL xrLocateBodyJointsFB( XrBodyTrackerFB bodyTracker, const XrBodyJointsLocateInfoFB* locateInfo, XrBodyJointLocationsFB* locations); XRAPI_ATTR XrResult XRAPI_CALL xrGetBodySkeletonFB( XrBodyTrackerFB bodyTracker, XrBodySkeletonFB* skeleton); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_dpad_binding 1 #define XR_EXT_dpad_binding_SPEC_VERSION 1 #define XR_EXT_DPAD_BINDING_EXTENSION_NAME "XR_EXT_dpad_binding" typedef struct XrInteractionProfileDpadBindingEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrPath binding; XrActionSet actionSet; float forceThreshold; float forceThresholdReleased; float centerRegion; float wedgeAngle; XrBool32 isSticky; const XrHapticBaseHeader *onHaptic; const XrHapticBaseHeader *offHaptic; } XrInteractionProfileDpadBindingEXT; #define XR_VALVE_analog_threshold 1 #define XR_VALVE_analog_threshold_SPEC_VERSION 2 #define XR_VALVE_ANALOG_THRESHOLD_EXTENSION_NAME "XR_VALVE_analog_threshold" typedef struct XrInteractionProfileAnalogThresholdVALVE { XrStructureType type; const void *XR_MAY_ALIAS next; XrAction action; XrPath binding; float onThreshold; float offThreshold; const XrHapticBaseHeader *onHaptic; const XrHapticBaseHeader *offHaptic; } XrInteractionProfileAnalogThresholdVALVE; #define XR_EXT_hand_joints_motion_range 1 #define XR_EXT_hand_joints_motion_range_SPEC_VERSION 1 #define XR_EXT_HAND_JOINTS_MOTION_RANGE_EXTENSION_NAME "XR_EXT_hand_joints_motion_range" typedef enum XrHandJointsMotionRangeEXT { XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT = 1, XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT = 2, XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT = 0x7FFFFFFF } XrHandJointsMotionRangeEXT; // XrHandJointsMotionRangeInfoEXT extends XrHandJointsLocateInfoEXT typedef struct XrHandJointsMotionRangeInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrHandJointsMotionRangeEXT handJointsMotionRange; } XrHandJointsMotionRangeInfoEXT; #define XR_EXT_samsung_odyssey_controller 1 #define XR_EXT_samsung_odyssey_controller_SPEC_VERSION 1 #define XR_EXT_SAMSUNG_ODYSSEY_CONTROLLER_EXTENSION_NAME "XR_EXT_samsung_odyssey_controller" #define XR_EXT_hp_mixed_reality_controller 1 #define XR_EXT_hp_mixed_reality_controller_SPEC_VERSION 1 #define XR_EXT_HP_MIXED_REALITY_CONTROLLER_EXTENSION_NAME "XR_EXT_hp_mixed_reality_controller" #define XR_MND_swapchain_usage_input_attachment_bit 1 #define XR_MND_swapchain_usage_input_attachment_bit_SPEC_VERSION 2 #define XR_MND_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_EXTENSION_NAME "XR_MND_swapchain_usage_input_attachment_bit" #define XR_MSFT_scene_understanding 1 XR_DEFINE_HANDLE(XrSceneObserverMSFT) XR_DEFINE_HANDLE(XrSceneMSFT) #define XR_MSFT_scene_understanding_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_EXTENSION_NAME "XR_MSFT_scene_understanding" typedef enum XrSceneComputeFeatureMSFT { XR_SCENE_COMPUTE_FEATURE_PLANE_MSFT = 1, XR_SCENE_COMPUTE_FEATURE_PLANE_MESH_MSFT = 2, XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT = 3, XR_SCENE_COMPUTE_FEATURE_COLLIDER_MESH_MSFT = 4, XR_SCENE_COMPUTE_FEATURE_SERIALIZE_SCENE_MSFT = 1000098000, XR_SCENE_COMPUTE_FEATURE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSceneComputeFeatureMSFT; typedef enum XrSceneComputeConsistencyMSFT { XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT = 1, XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_INCOMPLETE_FAST_MSFT = 2, XR_SCENE_COMPUTE_CONSISTENCY_OCCLUSION_OPTIMIZED_MSFT = 3, XR_SCENE_COMPUTE_CONSISTENCY_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSceneComputeConsistencyMSFT; typedef enum XrMeshComputeLodMSFT { XR_MESH_COMPUTE_LOD_COARSE_MSFT = 1, XR_MESH_COMPUTE_LOD_MEDIUM_MSFT = 2, XR_MESH_COMPUTE_LOD_FINE_MSFT = 3, XR_MESH_COMPUTE_LOD_UNLIMITED_MSFT = 4, XR_MESH_COMPUTE_LOD_MAX_ENUM_MSFT = 0x7FFFFFFF } XrMeshComputeLodMSFT; typedef enum XrSceneComponentTypeMSFT { XR_SCENE_COMPONENT_TYPE_INVALID_MSFT = -1, XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT = 1, XR_SCENE_COMPONENT_TYPE_PLANE_MSFT = 2, XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT = 3, XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT = 4, XR_SCENE_COMPONENT_TYPE_SERIALIZED_SCENE_FRAGMENT_MSFT = 1000098000, XR_SCENE_COMPONENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSceneComponentTypeMSFT; typedef enum XrSceneObjectTypeMSFT { XR_SCENE_OBJECT_TYPE_UNCATEGORIZED_MSFT = -1, XR_SCENE_OBJECT_TYPE_BACKGROUND_MSFT = 1, XR_SCENE_OBJECT_TYPE_WALL_MSFT = 2, XR_SCENE_OBJECT_TYPE_FLOOR_MSFT = 3, XR_SCENE_OBJECT_TYPE_CEILING_MSFT = 4, XR_SCENE_OBJECT_TYPE_PLATFORM_MSFT = 5, XR_SCENE_OBJECT_TYPE_INFERRED_MSFT = 6, XR_SCENE_OBJECT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSceneObjectTypeMSFT; typedef enum XrScenePlaneAlignmentTypeMSFT { XR_SCENE_PLANE_ALIGNMENT_TYPE_NON_ORTHOGONAL_MSFT = 0, XR_SCENE_PLANE_ALIGNMENT_TYPE_HORIZONTAL_MSFT = 1, XR_SCENE_PLANE_ALIGNMENT_TYPE_VERTICAL_MSFT = 2, XR_SCENE_PLANE_ALIGNMENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrScenePlaneAlignmentTypeMSFT; typedef enum XrSceneComputeStateMSFT { XR_SCENE_COMPUTE_STATE_NONE_MSFT = 0, XR_SCENE_COMPUTE_STATE_UPDATING_MSFT = 1, XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT = 2, XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT = 3, XR_SCENE_COMPUTE_STATE_MAX_ENUM_MSFT = 0x7FFFFFFF } XrSceneComputeStateMSFT; typedef struct XrUuidMSFT { uint8_t bytes[16]; } XrUuidMSFT; typedef struct XrSceneObserverCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSceneObserverCreateInfoMSFT; typedef struct XrSceneCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSceneCreateInfoMSFT; typedef struct XrSceneSphereBoundMSFT { XrVector3f center; float radius; } XrSceneSphereBoundMSFT; typedef struct XrSceneOrientedBoxBoundMSFT { XrPosef pose; XrVector3f extents; } XrSceneOrientedBoxBoundMSFT; typedef struct XrSceneFrustumBoundMSFT { XrPosef pose; XrFovf fov; float farDistance; } XrSceneFrustumBoundMSFT; typedef struct XrSceneBoundsMSFT { XrSpace space; XrTime time; uint32_t sphereCount; const XrSceneSphereBoundMSFT *spheres; uint32_t boxCount; const XrSceneOrientedBoxBoundMSFT *boxes; uint32_t frustumCount; const XrSceneFrustumBoundMSFT *frustums; } XrSceneBoundsMSFT; typedef struct XrNewSceneComputeInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t requestedFeatureCount; const XrSceneComputeFeatureMSFT *requestedFeatures; XrSceneComputeConsistencyMSFT consistency; XrSceneBoundsMSFT bounds; } XrNewSceneComputeInfoMSFT; // XrVisualMeshComputeLodInfoMSFT extends XrNewSceneComputeInfoMSFT typedef struct XrVisualMeshComputeLodInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrMeshComputeLodMSFT lod; } XrVisualMeshComputeLodInfoMSFT; typedef struct XrSceneComponentMSFT { XrSceneComponentTypeMSFT componentType; XrUuidMSFT id; XrUuidMSFT parentId; XrTime updateTime; } XrSceneComponentMSFT; typedef struct XrSceneComponentsMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t componentCapacityInput; uint32_t componentCountOutput; XrSceneComponentMSFT *components; } XrSceneComponentsMSFT; typedef struct XrSceneComponentsGetInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSceneComponentTypeMSFT componentType; } XrSceneComponentsGetInfoMSFT; typedef struct XrSceneComponentLocationMSFT { XrSpaceLocationFlags flags; XrPosef pose; } XrSceneComponentLocationMSFT; typedef struct XrSceneComponentLocationsMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t locationCount; XrSceneComponentLocationMSFT *locations; } XrSceneComponentLocationsMSFT; typedef struct XrSceneComponentsLocateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; uint32_t componentIdCount; const XrUuidMSFT *componentIds; } XrSceneComponentsLocateInfoMSFT; typedef struct XrSceneObjectMSFT { XrSceneObjectTypeMSFT objectType; } XrSceneObjectMSFT; // XrSceneObjectsMSFT extends XrSceneComponentsMSFT typedef struct XrSceneObjectsMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t sceneObjectCount; XrSceneObjectMSFT *sceneObjects; } XrSceneObjectsMSFT; // XrSceneComponentParentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT typedef struct XrSceneComponentParentFilterInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrUuidMSFT parentId; } XrSceneComponentParentFilterInfoMSFT; // XrSceneObjectTypesFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT typedef struct XrSceneObjectTypesFilterInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t objectTypeCount; const XrSceneObjectTypeMSFT *objectTypes; } XrSceneObjectTypesFilterInfoMSFT; typedef struct XrScenePlaneMSFT { XrScenePlaneAlignmentTypeMSFT alignment; XrExtent2Df size; uint64_t meshBufferId; XrBool32 supportsIndicesUint16; } XrScenePlaneMSFT; // XrScenePlanesMSFT extends XrSceneComponentsMSFT typedef struct XrScenePlanesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t scenePlaneCount; XrScenePlaneMSFT *scenePlanes; } XrScenePlanesMSFT; // XrScenePlaneAlignmentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT typedef struct XrScenePlaneAlignmentFilterInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t alignmentCount; const XrScenePlaneAlignmentTypeMSFT *alignments; } XrScenePlaneAlignmentFilterInfoMSFT; typedef struct XrSceneMeshMSFT { uint64_t meshBufferId; XrBool32 supportsIndicesUint16; } XrSceneMeshMSFT; // XrSceneMeshesMSFT extends XrSceneComponentsMSFT typedef struct XrSceneMeshesMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t sceneMeshCount; XrSceneMeshMSFT *sceneMeshes; } XrSceneMeshesMSFT; typedef struct XrSceneMeshBuffersGetInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint64_t meshBufferId; } XrSceneMeshBuffersGetInfoMSFT; typedef struct XrSceneMeshBuffersMSFT { XrStructureType type; void *XR_MAY_ALIAS next; } XrSceneMeshBuffersMSFT; typedef struct XrSceneMeshVertexBufferMSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrVector3f *vertices; } XrSceneMeshVertexBufferMSFT; typedef struct XrSceneMeshIndicesUint32MSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t indexCapacityInput; uint32_t indexCountOutput; uint32_t *indices; } XrSceneMeshIndicesUint32MSFT; typedef struct XrSceneMeshIndicesUint16MSFT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t indexCapacityInput; uint32_t indexCountOutput; uint16_t *indices; } XrSceneMeshIndicesUint16MSFT; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSceneComputeFeaturesMSFT)(XrInstance instance, XrSystemId systemId, uint32_t featureCapacityInput, uint32_t *featureCountOutput, XrSceneComputeFeatureMSFT *features); typedef XrResult (XRAPI_PTR *PFN_xrCreateSceneObserverMSFT)(XrSession session, const XrSceneObserverCreateInfoMSFT *createInfo, XrSceneObserverMSFT *sceneObserver); typedef XrResult (XRAPI_PTR *PFN_xrDestroySceneObserverMSFT)(XrSceneObserverMSFT sceneObserver); typedef XrResult (XRAPI_PTR *PFN_xrCreateSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrSceneCreateInfoMSFT *createInfo, XrSceneMSFT *scene); typedef XrResult (XRAPI_PTR *PFN_xrDestroySceneMSFT)(XrSceneMSFT scene); typedef XrResult (XRAPI_PTR *PFN_xrComputeNewSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrNewSceneComputeInfoMSFT *computeInfo); typedef XrResult (XRAPI_PTR *PFN_xrGetSceneComputeStateMSFT)(XrSceneObserverMSFT sceneObserver, XrSceneComputeStateMSFT *state); typedef XrResult (XRAPI_PTR *PFN_xrGetSceneComponentsMSFT)(XrSceneMSFT scene, const XrSceneComponentsGetInfoMSFT *getInfo, XrSceneComponentsMSFT *components); typedef XrResult (XRAPI_PTR *PFN_xrLocateSceneComponentsMSFT)(XrSceneMSFT scene, const XrSceneComponentsLocateInfoMSFT *locateInfo, XrSceneComponentLocationsMSFT *locations); typedef XrResult (XRAPI_PTR *PFN_xrGetSceneMeshBuffersMSFT)(XrSceneMSFT scene, const XrSceneMeshBuffersGetInfoMSFT *getInfo, XrSceneMeshBuffersMSFT *buffers); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSceneComputeFeaturesMSFT( XrInstance instance, XrSystemId systemId, uint32_t featureCapacityInput, uint32_t* featureCountOutput, XrSceneComputeFeatureMSFT* features); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSceneObserverMSFT( XrSession session, const XrSceneObserverCreateInfoMSFT* createInfo, XrSceneObserverMSFT* sceneObserver); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySceneObserverMSFT( XrSceneObserverMSFT sceneObserver); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSceneMSFT( XrSceneObserverMSFT sceneObserver, const XrSceneCreateInfoMSFT* createInfo, XrSceneMSFT* scene); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySceneMSFT( XrSceneMSFT scene); XRAPI_ATTR XrResult XRAPI_CALL xrComputeNewSceneMSFT( XrSceneObserverMSFT sceneObserver, const XrNewSceneComputeInfoMSFT* computeInfo); XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneComputeStateMSFT( XrSceneObserverMSFT sceneObserver, XrSceneComputeStateMSFT* state); XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneComponentsMSFT( XrSceneMSFT scene, const XrSceneComponentsGetInfoMSFT* getInfo, XrSceneComponentsMSFT* components); XRAPI_ATTR XrResult XRAPI_CALL xrLocateSceneComponentsMSFT( XrSceneMSFT scene, const XrSceneComponentsLocateInfoMSFT* locateInfo, XrSceneComponentLocationsMSFT* locations); XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneMeshBuffersMSFT( XrSceneMSFT scene, const XrSceneMeshBuffersGetInfoMSFT* getInfo, XrSceneMeshBuffersMSFT* buffers); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_MSFT_scene_understanding_serialization 1 #define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 2 #define XR_MSFT_SCENE_UNDERSTANDING_SERIALIZATION_EXTENSION_NAME "XR_MSFT_scene_understanding_serialization" typedef struct XrSerializedSceneFragmentDataGetInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrUuidMSFT sceneFragmentId; } XrSerializedSceneFragmentDataGetInfoMSFT; typedef struct XrDeserializeSceneFragmentMSFT { uint32_t bufferSize; const uint8_t *buffer; } XrDeserializeSceneFragmentMSFT; typedef struct XrSceneDeserializeInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t fragmentCount; const XrDeserializeSceneFragmentMSFT *fragments; } XrSceneDeserializeInfoMSFT; typedef XrResult (XRAPI_PTR *PFN_xrDeserializeSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrSceneDeserializeInfoMSFT *deserializeInfo); typedef XrResult (XRAPI_PTR *PFN_xrGetSerializedSceneFragmentDataMSFT)(XrSceneMSFT scene, const XrSerializedSceneFragmentDataGetInfoMSFT *getInfo, uint32_t countInput, uint32_t *readOutput, uint8_t *buffer); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrDeserializeSceneMSFT( XrSceneObserverMSFT sceneObserver, const XrSceneDeserializeInfoMSFT* deserializeInfo); XRAPI_ATTR XrResult XRAPI_CALL xrGetSerializedSceneFragmentDataMSFT( XrSceneMSFT scene, const XrSerializedSceneFragmentDataGetInfoMSFT* getInfo, uint32_t countInput, uint32_t* readOutput, uint8_t* buffer); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_display_refresh_rate 1 #define XR_FB_display_refresh_rate_SPEC_VERSION 1 #define XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME "XR_FB_display_refresh_rate" typedef struct XrEventDataDisplayRefreshRateChangedFB { XrStructureType type; const void *XR_MAY_ALIAS next; float fromDisplayRefreshRate; float toDisplayRefreshRate; } XrEventDataDisplayRefreshRateChangedFB; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateDisplayRefreshRatesFB)(XrSession session, uint32_t displayRefreshRateCapacityInput, uint32_t *displayRefreshRateCountOutput, float *displayRefreshRates); typedef XrResult (XRAPI_PTR *PFN_xrGetDisplayRefreshRateFB)(XrSession session, float *displayRefreshRate); typedef XrResult (XRAPI_PTR *PFN_xrRequestDisplayRefreshRateFB)(XrSession session, float displayRefreshRate); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateDisplayRefreshRatesFB( XrSession session, uint32_t displayRefreshRateCapacityInput, uint32_t* displayRefreshRateCountOutput, float* displayRefreshRates); XRAPI_ATTR XrResult XRAPI_CALL xrGetDisplayRefreshRateFB( XrSession session, float* displayRefreshRate); XRAPI_ATTR XrResult XRAPI_CALL xrRequestDisplayRefreshRateFB( XrSession session, float displayRefreshRate); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HTC_vive_cosmos_controller_interaction 1 #define XR_HTC_vive_cosmos_controller_interaction_SPEC_VERSION 1 #define XR_HTC_VIVE_COSMOS_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_HTC_vive_cosmos_controller_interaction" #define XR_HTCX_vive_tracker_interaction 1 #define XR_HTCX_vive_tracker_interaction_SPEC_VERSION 2 #define XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME "XR_HTCX_vive_tracker_interaction" typedef struct XrViveTrackerPathsHTCX { XrStructureType type; void *XR_MAY_ALIAS next; XrPath persistentPath; XrPath rolePath; } XrViveTrackerPathsHTCX; typedef struct XrEventDataViveTrackerConnectedHTCX { XrStructureType type; const void *XR_MAY_ALIAS next; XrViveTrackerPathsHTCX *paths; } XrEventDataViveTrackerConnectedHTCX; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateViveTrackerPathsHTCX)(XrInstance instance, uint32_t pathCapacityInput, uint32_t *pathCountOutput, XrViveTrackerPathsHTCX *paths); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViveTrackerPathsHTCX( XrInstance instance, uint32_t pathCapacityInput, uint32_t* pathCountOutput, XrViveTrackerPathsHTCX* paths); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HTC_facial_tracking 1 #define XR_FACIAL_EXPRESSION_EYE_COUNT_HTC 14 #define XR_FACIAL_EXPRESSION_LIP_COUNT_HTC 37 XR_DEFINE_HANDLE(XrFacialTrackerHTC) #define XR_HTC_facial_tracking_SPEC_VERSION 2 #define XR_HTC_FACIAL_TRACKING_EXTENSION_NAME "XR_HTC_facial_tracking" typedef enum XrEyeExpressionHTC { XR_EYE_EXPRESSION_LEFT_BLINK_HTC = 0, XR_EYE_EXPRESSION_LEFT_WIDE_HTC = 1, XR_EYE_EXPRESSION_RIGHT_BLINK_HTC = 2, XR_EYE_EXPRESSION_RIGHT_WIDE_HTC = 3, XR_EYE_EXPRESSION_LEFT_SQUEEZE_HTC = 4, XR_EYE_EXPRESSION_RIGHT_SQUEEZE_HTC = 5, XR_EYE_EXPRESSION_LEFT_DOWN_HTC = 6, XR_EYE_EXPRESSION_RIGHT_DOWN_HTC = 7, XR_EYE_EXPRESSION_LEFT_OUT_HTC = 8, XR_EYE_EXPRESSION_RIGHT_IN_HTC = 9, XR_EYE_EXPRESSION_LEFT_IN_HTC = 10, XR_EYE_EXPRESSION_RIGHT_OUT_HTC = 11, XR_EYE_EXPRESSION_LEFT_UP_HTC = 12, XR_EYE_EXPRESSION_RIGHT_UP_HTC = 13, XR_EYE_EXPRESSION_MAX_ENUM_HTC = 0x7FFFFFFF } XrEyeExpressionHTC; typedef enum XrLipExpressionHTC { XR_LIP_EXPRESSION_JAW_RIGHT_HTC = 0, XR_LIP_EXPRESSION_JAW_LEFT_HTC = 1, XR_LIP_EXPRESSION_JAW_FORWARD_HTC = 2, XR_LIP_EXPRESSION_JAW_OPEN_HTC = 3, XR_LIP_EXPRESSION_MOUTH_APE_SHAPE_HTC = 4, XR_LIP_EXPRESSION_MOUTH_UPPER_RIGHT_HTC = 5, XR_LIP_EXPRESSION_MOUTH_UPPER_LEFT_HTC = 6, XR_LIP_EXPRESSION_MOUTH_LOWER_RIGHT_HTC = 7, XR_LIP_EXPRESSION_MOUTH_LOWER_LEFT_HTC = 8, XR_LIP_EXPRESSION_MOUTH_UPPER_OVERTURN_HTC = 9, XR_LIP_EXPRESSION_MOUTH_LOWER_OVERTURN_HTC = 10, XR_LIP_EXPRESSION_MOUTH_POUT_HTC = 11, XR_LIP_EXPRESSION_MOUTH_SMILE_RIGHT_HTC = 12, XR_LIP_EXPRESSION_MOUTH_SMILE_LEFT_HTC = 13, XR_LIP_EXPRESSION_MOUTH_SAD_RIGHT_HTC = 14, XR_LIP_EXPRESSION_MOUTH_SAD_LEFT_HTC = 15, XR_LIP_EXPRESSION_CHEEK_PUFF_RIGHT_HTC = 16, XR_LIP_EXPRESSION_CHEEK_PUFF_LEFT_HTC = 17, XR_LIP_EXPRESSION_CHEEK_SUCK_HTC = 18, XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC = 19, XR_LIP_EXPRESSION_MOUTH_UPPER_UPLEFT_HTC = 20, XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNRIGHT_HTC = 21, XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNLEFT_HTC = 22, XR_LIP_EXPRESSION_MOUTH_UPPER_INSIDE_HTC = 23, XR_LIP_EXPRESSION_MOUTH_LOWER_INSIDE_HTC = 24, XR_LIP_EXPRESSION_MOUTH_LOWER_OVERLAY_HTC = 25, XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC = 26, XR_LIP_EXPRESSION_TONGUE_LEFT_HTC = 27, XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC = 28, XR_LIP_EXPRESSION_TONGUE_UP_HTC = 29, XR_LIP_EXPRESSION_TONGUE_DOWN_HTC = 30, XR_LIP_EXPRESSION_TONGUE_ROLL_HTC = 31, XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC = 32, XR_LIP_EXPRESSION_TONGUE_UPRIGHT_MORPH_HTC = 33, XR_LIP_EXPRESSION_TONGUE_UPLEFT_MORPH_HTC = 34, XR_LIP_EXPRESSION_TONGUE_DOWNRIGHT_MORPH_HTC = 35, XR_LIP_EXPRESSION_TONGUE_DOWNLEFT_MORPH_HTC = 36, XR_LIP_EXPRESSION_MAX_ENUM_HTC = 0x7FFFFFFF } XrLipExpressionHTC; typedef enum XrFacialTrackingTypeHTC { XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC = 1, XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC = 2, XR_FACIAL_TRACKING_TYPE_MAX_ENUM_HTC = 0x7FFFFFFF } XrFacialTrackingTypeHTC; // XrSystemFacialTrackingPropertiesHTC extends XrSystemProperties typedef struct XrSystemFacialTrackingPropertiesHTC { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportEyeFacialTracking; XrBool32 supportLipFacialTracking; } XrSystemFacialTrackingPropertiesHTC; typedef struct XrFacialExpressionsHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 isActive; XrTime sampleTime; uint32_t expressionCount; float *expressionWeightings; } XrFacialExpressionsHTC; typedef struct XrFacialTrackerCreateInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrFacialTrackingTypeHTC facialTrackingType; } XrFacialTrackerCreateInfoHTC; typedef XrResult (XRAPI_PTR *PFN_xrCreateFacialTrackerHTC)(XrSession session, const XrFacialTrackerCreateInfoHTC *createInfo, XrFacialTrackerHTC *facialTracker); typedef XrResult (XRAPI_PTR *PFN_xrDestroyFacialTrackerHTC)(XrFacialTrackerHTC facialTracker); typedef XrResult (XRAPI_PTR *PFN_xrGetFacialExpressionsHTC)(XrFacialTrackerHTC facialTracker, XrFacialExpressionsHTC *facialExpressions); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateFacialTrackerHTC( XrSession session, const XrFacialTrackerCreateInfoHTC* createInfo, XrFacialTrackerHTC* facialTracker); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyFacialTrackerHTC( XrFacialTrackerHTC facialTracker); XRAPI_ATTR XrResult XRAPI_CALL xrGetFacialExpressionsHTC( XrFacialTrackerHTC facialTracker, XrFacialExpressionsHTC* facialExpressions); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HTC_vive_focus3_controller_interaction 1 #define XR_HTC_vive_focus3_controller_interaction_SPEC_VERSION 2 #define XR_HTC_VIVE_FOCUS3_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_HTC_vive_focus3_controller_interaction" #define XR_HTC_hand_interaction 1 #define XR_HTC_hand_interaction_SPEC_VERSION 1 #define XR_HTC_HAND_INTERACTION_EXTENSION_NAME "XR_HTC_hand_interaction" #define XR_HTC_vive_wrist_tracker_interaction 1 #define XR_HTC_vive_wrist_tracker_interaction_SPEC_VERSION 1 #define XR_HTC_VIVE_WRIST_TRACKER_INTERACTION_EXTENSION_NAME "XR_HTC_vive_wrist_tracker_interaction" #define XR_FB_color_space 1 #define XR_FB_color_space_SPEC_VERSION 3 #define XR_FB_COLOR_SPACE_EXTENSION_NAME "XR_FB_color_space" typedef enum XrColorSpaceFB { XR_COLOR_SPACE_UNMANAGED_FB = 0, XR_COLOR_SPACE_REC2020_FB = 1, XR_COLOR_SPACE_REC709_FB = 2, XR_COLOR_SPACE_RIFT_CV1_FB = 3, XR_COLOR_SPACE_RIFT_S_FB = 4, XR_COLOR_SPACE_QUEST_FB = 5, XR_COLOR_SPACE_P3_FB = 6, XR_COLOR_SPACE_ADOBE_RGB_FB = 7, XR_COLOR_SPACE_MAX_ENUM_FB = 0x7FFFFFFF } XrColorSpaceFB; // XrSystemColorSpacePropertiesFB extends XrSystemProperties typedef struct XrSystemColorSpacePropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrColorSpaceFB colorSpace; } XrSystemColorSpacePropertiesFB; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateColorSpacesFB)(XrSession session, uint32_t colorSpaceCapacityInput, uint32_t *colorSpaceCountOutput, XrColorSpaceFB *colorSpaces); typedef XrResult (XRAPI_PTR *PFN_xrSetColorSpaceFB)(XrSession session, const XrColorSpaceFB colorspace); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateColorSpacesFB( XrSession session, uint32_t colorSpaceCapacityInput, uint32_t* colorSpaceCountOutput, XrColorSpaceFB* colorSpaces); XRAPI_ATTR XrResult XRAPI_CALL xrSetColorSpaceFB( XrSession session, const XrColorSpaceFB colorspace); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_hand_tracking_mesh 1 #define XR_FB_hand_tracking_mesh_SPEC_VERSION 3 #define XR_FB_HAND_TRACKING_MESH_EXTENSION_NAME "XR_FB_hand_tracking_mesh" typedef struct XrVector4sFB { int16_t x; int16_t y; int16_t z; int16_t w; } XrVector4sFB; typedef struct XrHandTrackingMeshFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t jointCapacityInput; uint32_t jointCountOutput; XrPosef *jointBindPoses; float *jointRadii; XrHandJointEXT *jointParents; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrVector3f *vertexPositions; XrVector3f *vertexNormals; XrVector2f *vertexUVs; XrVector4sFB *vertexBlendIndices; XrVector4f *vertexBlendWeights; uint32_t indexCapacityInput; uint32_t indexCountOutput; int16_t *indices; } XrHandTrackingMeshFB; // XrHandTrackingScaleFB extends XrHandJointLocationsEXT typedef struct XrHandTrackingScaleFB { XrStructureType type; void *XR_MAY_ALIAS next; float sensorOutput; float currentOutput; XrBool32 overrideHandScale; float overrideValueInput; } XrHandTrackingScaleFB; typedef XrResult (XRAPI_PTR *PFN_xrGetHandMeshFB)(XrHandTrackerEXT handTracker, XrHandTrackingMeshFB *mesh); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetHandMeshFB( XrHandTrackerEXT handTracker, XrHandTrackingMeshFB* mesh); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_hand_tracking_aim 1 #define XR_FB_hand_tracking_aim_SPEC_VERSION 2 #define XR_FB_HAND_TRACKING_AIM_EXTENSION_NAME "XR_FB_hand_tracking_aim" typedef XrFlags64 XrHandTrackingAimFlagsFB; // Flag bits for XrHandTrackingAimFlagsFB static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_COMPUTED_BIT_FB = 0x00000001; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_VALID_BIT_FB = 0x00000002; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_INDEX_PINCHING_BIT_FB = 0x00000004; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_MIDDLE_PINCHING_BIT_FB = 0x00000008; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_RING_PINCHING_BIT_FB = 0x00000010; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_LITTLE_PINCHING_BIT_FB = 0x00000020; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_SYSTEM_GESTURE_BIT_FB = 0x00000040; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_DOMINANT_HAND_BIT_FB = 0x00000080; static const XrHandTrackingAimFlagsFB XR_HAND_TRACKING_AIM_MENU_PRESSED_BIT_FB = 0x00000100; // XrHandTrackingAimStateFB extends XrHandJointLocationsEXT typedef struct XrHandTrackingAimStateFB { XrStructureType type; void *XR_MAY_ALIAS next; XrHandTrackingAimFlagsFB status; XrPosef aimPose; float pinchStrengthIndex; float pinchStrengthMiddle; float pinchStrengthRing; float pinchStrengthLittle; } XrHandTrackingAimStateFB; #define XR_FB_hand_tracking_capsules 1 #define XR_HAND_TRACKING_CAPSULE_POINT_COUNT_FB 2 #define XR_HAND_TRACKING_CAPSULE_COUNT_FB 19 #define XR_FB_hand_tracking_capsules_SPEC_VERSION 3 #define XR_FB_HAND_TRACKING_CAPSULES_EXTENSION_NAME "XR_FB_hand_tracking_capsules" #define XR_FB_HAND_TRACKING_CAPSULE_POINT_COUNT XR_HAND_TRACKING_CAPSULE_POINT_COUNT_FB #define XR_FB_HAND_TRACKING_CAPSULE_COUNT XR_HAND_TRACKING_CAPSULE_COUNT_FB typedef struct XrHandCapsuleFB { XrVector3f points[XR_HAND_TRACKING_CAPSULE_POINT_COUNT_FB]; float radius; XrHandJointEXT joint; } XrHandCapsuleFB; // XrHandTrackingCapsulesStateFB extends XrHandJointLocationsEXT typedef struct XrHandTrackingCapsulesStateFB { XrStructureType type; void *XR_MAY_ALIAS next; XrHandCapsuleFB capsules[XR_HAND_TRACKING_CAPSULE_COUNT_FB]; } XrHandTrackingCapsulesStateFB; #define XR_FB_spatial_entity 1 XR_DEFINE_ATOM(XrAsyncRequestIdFB) #define XR_UUID_SIZE_EXT 16 #define XR_FB_spatial_entity_SPEC_VERSION 2 #define XR_FB_SPATIAL_ENTITY_EXTENSION_NAME "XR_FB_spatial_entity" typedef enum XrSpaceComponentTypeFB { XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB = 0, XR_SPACE_COMPONENT_TYPE_STORABLE_FB = 1, XR_SPACE_COMPONENT_TYPE_SHARABLE_FB = 2, XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB = 3, XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB = 4, XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB = 5, XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB = 6, XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB = 7, XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB = 0x7FFFFFFF } XrSpaceComponentTypeFB; // XrSystemSpatialEntityPropertiesFB extends XrSystemProperties typedef struct XrSystemSpatialEntityPropertiesFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 supportsSpatialEntity; } XrSystemSpatialEntityPropertiesFB; typedef struct XrSpatialAnchorCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace space; XrPosef poseInSpace; XrTime time; } XrSpatialAnchorCreateInfoFB; typedef struct XrSpaceComponentStatusSetInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpaceComponentTypeFB componentType; XrBool32 enabled; XrDuration timeout; } XrSpaceComponentStatusSetInfoFB; typedef struct XrSpaceComponentStatusFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 enabled; XrBool32 changePending; } XrSpaceComponentStatusFB; typedef struct XrUuidEXT { uint8_t data[XR_UUID_SIZE_EXT]; } XrUuidEXT; typedef struct XrEventDataSpatialAnchorCreateCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; XrSpace space; XrUuidEXT uuid; } XrEventDataSpatialAnchorCreateCompleteFB; typedef struct XrEventDataSpaceSetStatusCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; XrSpace space; XrUuidEXT uuid; XrSpaceComponentTypeFB componentType; XrBool32 enabled; } XrEventDataSpaceSetStatusCompleteFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFB)(XrSession session, const XrSpatialAnchorCreateInfoFB *info, XrAsyncRequestIdFB *requestId); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceUuidFB)(XrSpace space, XrUuidEXT *uuid); typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSpaceSupportedComponentsFB)(XrSpace space, uint32_t componentTypeCapacityInput, uint32_t *componentTypeCountOutput, XrSpaceComponentTypeFB *componentTypes); typedef XrResult (XRAPI_PTR *PFN_xrSetSpaceComponentStatusFB)(XrSpace space, const XrSpaceComponentStatusSetInfoFB *info, XrAsyncRequestIdFB *requestId); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceComponentStatusFB)(XrSpace space, XrSpaceComponentTypeFB componentType, XrSpaceComponentStatusFB *status); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFB( XrSession session, const XrSpatialAnchorCreateInfoFB* info, XrAsyncRequestIdFB* requestId); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceUuidFB( XrSpace space, XrUuidEXT* uuid); XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSpaceSupportedComponentsFB( XrSpace space, uint32_t componentTypeCapacityInput, uint32_t* componentTypeCountOutput, XrSpaceComponentTypeFB* componentTypes); XRAPI_ATTR XrResult XRAPI_CALL xrSetSpaceComponentStatusFB( XrSpace space, const XrSpaceComponentStatusSetInfoFB* info, XrAsyncRequestIdFB* requestId); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceComponentStatusFB( XrSpace space, XrSpaceComponentTypeFB componentType, XrSpaceComponentStatusFB* status); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_foveation 1 XR_DEFINE_HANDLE(XrFoveationProfileFB) #define XR_FB_foveation_SPEC_VERSION 1 #define XR_FB_FOVEATION_EXTENSION_NAME "XR_FB_foveation" typedef XrFlags64 XrSwapchainCreateFoveationFlagsFB; // Flag bits for XrSwapchainCreateFoveationFlagsFB static const XrSwapchainCreateFoveationFlagsFB XR_SWAPCHAIN_CREATE_FOVEATION_SCALED_BIN_BIT_FB = 0x00000001; static const XrSwapchainCreateFoveationFlagsFB XR_SWAPCHAIN_CREATE_FOVEATION_FRAGMENT_DENSITY_MAP_BIT_FB = 0x00000002; typedef XrFlags64 XrSwapchainStateFoveationFlagsFB; // Flag bits for XrSwapchainStateFoveationFlagsFB typedef struct XrFoveationProfileCreateInfoFB { XrStructureType type; void *XR_MAY_ALIAS next; } XrFoveationProfileCreateInfoFB; // XrSwapchainCreateInfoFoveationFB extends XrSwapchainCreateInfo typedef struct XrSwapchainCreateInfoFoveationFB { XrStructureType type; void *XR_MAY_ALIAS next; XrSwapchainCreateFoveationFlagsFB flags; } XrSwapchainCreateInfoFoveationFB; typedef struct XrSwapchainStateFoveationFB { XrStructureType type; void *XR_MAY_ALIAS next; XrSwapchainStateFoveationFlagsFB flags; XrFoveationProfileFB profile; } XrSwapchainStateFoveationFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateFoveationProfileFB)(XrSession session, const XrFoveationProfileCreateInfoFB *createInfo, XrFoveationProfileFB *profile); typedef XrResult (XRAPI_PTR *PFN_xrDestroyFoveationProfileFB)(XrFoveationProfileFB profile); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateFoveationProfileFB( XrSession session, const XrFoveationProfileCreateInfoFB* createInfo, XrFoveationProfileFB* profile); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyFoveationProfileFB( XrFoveationProfileFB profile); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_foveation_configuration 1 #define XR_FB_foveation_configuration_SPEC_VERSION 1 #define XR_FB_FOVEATION_CONFIGURATION_EXTENSION_NAME "XR_FB_foveation_configuration" typedef enum XrFoveationLevelFB { XR_FOVEATION_LEVEL_NONE_FB = 0, XR_FOVEATION_LEVEL_LOW_FB = 1, XR_FOVEATION_LEVEL_MEDIUM_FB = 2, XR_FOVEATION_LEVEL_HIGH_FB = 3, XR_FOVEATION_LEVEL_MAX_ENUM_FB = 0x7FFFFFFF } XrFoveationLevelFB; typedef enum XrFoveationDynamicFB { XR_FOVEATION_DYNAMIC_DISABLED_FB = 0, XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_FB = 1, XR_FOVEATION_DYNAMIC_MAX_ENUM_FB = 0x7FFFFFFF } XrFoveationDynamicFB; // XrFoveationLevelProfileCreateInfoFB extends XrFoveationProfileCreateInfoFB typedef struct XrFoveationLevelProfileCreateInfoFB { XrStructureType type; void *XR_MAY_ALIAS next; XrFoveationLevelFB level; float verticalOffset; XrFoveationDynamicFB dynamic; } XrFoveationLevelProfileCreateInfoFB; #define XR_FB_keyboard_tracking 1 #define XR_FB_keyboard_tracking_SPEC_VERSION 1 #define XR_FB_KEYBOARD_TRACKING_EXTENSION_NAME "XR_FB_keyboard_tracking" #define XR_MAX_KEYBOARD_TRACKING_NAME_SIZE_FB 128 typedef XrFlags64 XrKeyboardTrackingFlagsFB; // Flag bits for XrKeyboardTrackingFlagsFB static const XrKeyboardTrackingFlagsFB XR_KEYBOARD_TRACKING_EXISTS_BIT_FB = 0x00000001; static const XrKeyboardTrackingFlagsFB XR_KEYBOARD_TRACKING_LOCAL_BIT_FB = 0x00000002; static const XrKeyboardTrackingFlagsFB XR_KEYBOARD_TRACKING_REMOTE_BIT_FB = 0x00000004; static const XrKeyboardTrackingFlagsFB XR_KEYBOARD_TRACKING_CONNECTED_BIT_FB = 0x00000008; typedef XrFlags64 XrKeyboardTrackingQueryFlagsFB; // Flag bits for XrKeyboardTrackingQueryFlagsFB static const XrKeyboardTrackingQueryFlagsFB XR_KEYBOARD_TRACKING_QUERY_LOCAL_BIT_FB = 0x00000002; static const XrKeyboardTrackingQueryFlagsFB XR_KEYBOARD_TRACKING_QUERY_REMOTE_BIT_FB = 0x00000004; // XrSystemKeyboardTrackingPropertiesFB extends XrSystemProperties typedef struct XrSystemKeyboardTrackingPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsKeyboardTracking; } XrSystemKeyboardTrackingPropertiesFB; typedef struct XrKeyboardTrackingDescriptionFB { uint64_t trackedKeyboardId; XrVector3f size; XrKeyboardTrackingFlagsFB flags; char name[XR_MAX_KEYBOARD_TRACKING_NAME_SIZE_FB]; } XrKeyboardTrackingDescriptionFB; typedef struct XrKeyboardSpaceCreateInfoFB { XrStructureType type; void *XR_MAY_ALIAS next; uint64_t trackedKeyboardId; } XrKeyboardSpaceCreateInfoFB; typedef struct XrKeyboardTrackingQueryFB { XrStructureType type; void *XR_MAY_ALIAS next; XrKeyboardTrackingQueryFlagsFB flags; } XrKeyboardTrackingQueryFB; typedef XrResult (XRAPI_PTR *PFN_xrQuerySystemTrackedKeyboardFB)(XrSession session, const XrKeyboardTrackingQueryFB *queryInfo, XrKeyboardTrackingDescriptionFB *keyboard); typedef XrResult (XRAPI_PTR *PFN_xrCreateKeyboardSpaceFB)(XrSession session, const XrKeyboardSpaceCreateInfoFB *createInfo, XrSpace *keyboardSpace); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrQuerySystemTrackedKeyboardFB( XrSession session, const XrKeyboardTrackingQueryFB* queryInfo, XrKeyboardTrackingDescriptionFB* keyboard); XRAPI_ATTR XrResult XRAPI_CALL xrCreateKeyboardSpaceFB( XrSession session, const XrKeyboardSpaceCreateInfoFB* createInfo, XrSpace* keyboardSpace); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_triangle_mesh 1 XR_DEFINE_HANDLE(XrTriangleMeshFB) #define XR_FB_triangle_mesh_SPEC_VERSION 2 #define XR_FB_TRIANGLE_MESH_EXTENSION_NAME "XR_FB_triangle_mesh" typedef enum XrWindingOrderFB { XR_WINDING_ORDER_UNKNOWN_FB = 0, XR_WINDING_ORDER_CW_FB = 1, XR_WINDING_ORDER_CCW_FB = 2, XR_WINDING_ORDER_MAX_ENUM_FB = 0x7FFFFFFF } XrWindingOrderFB; typedef XrFlags64 XrTriangleMeshFlagsFB; // Flag bits for XrTriangleMeshFlagsFB static const XrTriangleMeshFlagsFB XR_TRIANGLE_MESH_MUTABLE_BIT_FB = 0x00000001; typedef struct XrTriangleMeshCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrTriangleMeshFlagsFB flags; XrWindingOrderFB windingOrder; uint32_t vertexCount; const XrVector3f *vertexBuffer; uint32_t triangleCount; const uint32_t *indexBuffer; } XrTriangleMeshCreateInfoFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateTriangleMeshFB)(XrSession session, const XrTriangleMeshCreateInfoFB *createInfo, XrTriangleMeshFB *outTriangleMesh); typedef XrResult (XRAPI_PTR *PFN_xrDestroyTriangleMeshFB)(XrTriangleMeshFB mesh); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshGetVertexBufferFB)(XrTriangleMeshFB mesh, XrVector3f **outVertexBuffer); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshGetIndexBufferFB)(XrTriangleMeshFB mesh, uint32_t **outIndexBuffer); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshBeginUpdateFB)(XrTriangleMeshFB mesh); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshEndUpdateFB)(XrTriangleMeshFB mesh, uint32_t vertexCount, uint32_t triangleCount); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshBeginVertexBufferUpdateFB)(XrTriangleMeshFB mesh, uint32_t *outVertexCount); typedef XrResult (XRAPI_PTR *PFN_xrTriangleMeshEndVertexBufferUpdateFB)(XrTriangleMeshFB mesh); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateTriangleMeshFB( XrSession session, const XrTriangleMeshCreateInfoFB* createInfo, XrTriangleMeshFB* outTriangleMesh); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyTriangleMeshFB( XrTriangleMeshFB mesh); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshGetVertexBufferFB( XrTriangleMeshFB mesh, XrVector3f** outVertexBuffer); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshGetIndexBufferFB( XrTriangleMeshFB mesh, uint32_t** outIndexBuffer); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshBeginUpdateFB( XrTriangleMeshFB mesh); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshEndUpdateFB( XrTriangleMeshFB mesh, uint32_t vertexCount, uint32_t triangleCount); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshBeginVertexBufferUpdateFB( XrTriangleMeshFB mesh, uint32_t* outVertexCount); XRAPI_ATTR XrResult XRAPI_CALL xrTriangleMeshEndVertexBufferUpdateFB( XrTriangleMeshFB mesh); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_passthrough 1 XR_DEFINE_HANDLE(XrPassthroughFB) XR_DEFINE_HANDLE(XrPassthroughLayerFB) XR_DEFINE_HANDLE(XrGeometryInstanceFB) #define XR_FB_passthrough_SPEC_VERSION 3 #define XR_FB_PASSTHROUGH_EXTENSION_NAME "XR_FB_passthrough" #define XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB 256 typedef enum XrPassthroughLayerPurposeFB { XR_PASSTHROUGH_LAYER_PURPOSE_RECONSTRUCTION_FB = 0, XR_PASSTHROUGH_LAYER_PURPOSE_PROJECTED_FB = 1, XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_HANDS_FB = 1000203001, XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_MASKED_HANDS_FB = 1000203002, XR_PASSTHROUGH_LAYER_PURPOSE_MAX_ENUM_FB = 0x7FFFFFFF } XrPassthroughLayerPurposeFB; typedef XrFlags64 XrPassthroughCapabilityFlagsFB; // Flag bits for XrPassthroughCapabilityFlagsFB static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_BIT_FB = 0x00000001; static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB = 0x00000002; static const XrPassthroughCapabilityFlagsFB XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB = 0x00000004; typedef XrFlags64 XrPassthroughFlagsFB; // Flag bits for XrPassthroughFlagsFB static const XrPassthroughFlagsFB XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB = 0x00000001; static const XrPassthroughFlagsFB XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB = 0x00000002; typedef XrFlags64 XrPassthroughStateChangedFlagsFB; // Flag bits for XrPassthroughStateChangedFlagsFB static const XrPassthroughStateChangedFlagsFB XR_PASSTHROUGH_STATE_CHANGED_REINIT_REQUIRED_BIT_FB = 0x00000001; static const XrPassthroughStateChangedFlagsFB XR_PASSTHROUGH_STATE_CHANGED_NON_RECOVERABLE_ERROR_BIT_FB = 0x00000002; static const XrPassthroughStateChangedFlagsFB XR_PASSTHROUGH_STATE_CHANGED_RECOVERABLE_ERROR_BIT_FB = 0x00000004; static const XrPassthroughStateChangedFlagsFB XR_PASSTHROUGH_STATE_CHANGED_RESTORED_ERROR_BIT_FB = 0x00000008; // XrSystemPassthroughPropertiesFB extends XrSystemProperties typedef struct XrSystemPassthroughPropertiesFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 supportsPassthrough; } XrSystemPassthroughPropertiesFB; // XrSystemPassthroughProperties2FB extends XrSystemProperties typedef struct XrSystemPassthroughProperties2FB { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughCapabilityFlagsFB capabilities; } XrSystemPassthroughProperties2FB; typedef struct XrPassthroughCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughFlagsFB flags; } XrPassthroughCreateInfoFB; typedef struct XrPassthroughLayerCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughFB passthrough; XrPassthroughFlagsFB flags; XrPassthroughLayerPurposeFB purpose; } XrPassthroughLayerCreateInfoFB; // XrCompositionLayerPassthroughFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerPassthroughFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags flags; XrSpace space; XrPassthroughLayerFB layerHandle; } XrCompositionLayerPassthroughFB; typedef struct XrGeometryInstanceCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughLayerFB layer; XrTriangleMeshFB mesh; XrSpace baseSpace; XrPosef pose; XrVector3f scale; } XrGeometryInstanceCreateInfoFB; typedef struct XrGeometryInstanceTransformFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; XrPosef pose; XrVector3f scale; } XrGeometryInstanceTransformFB; typedef struct XrPassthroughStyleFB { XrStructureType type; const void *XR_MAY_ALIAS next; float textureOpacityFactor; XrColor4f edgeColor; } XrPassthroughStyleFB; // XrPassthroughColorMapMonoToRgbaFB extends XrPassthroughStyleFB typedef struct XrPassthroughColorMapMonoToRgbaFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrColor4f textureColorMap[XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB]; } XrPassthroughColorMapMonoToRgbaFB; // XrPassthroughColorMapMonoToMonoFB extends XrPassthroughStyleFB typedef struct XrPassthroughColorMapMonoToMonoFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint8_t textureColorMap[XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB]; } XrPassthroughColorMapMonoToMonoFB; // XrPassthroughBrightnessContrastSaturationFB extends XrPassthroughStyleFB typedef struct XrPassthroughBrightnessContrastSaturationFB { XrStructureType type; const void *XR_MAY_ALIAS next; float brightness; float contrast; float saturation; } XrPassthroughBrightnessContrastSaturationFB; typedef struct XrEventDataPassthroughStateChangedFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughStateChangedFlagsFB flags; } XrEventDataPassthroughStateChangedFB; typedef XrResult (XRAPI_PTR *PFN_xrCreatePassthroughFB)(XrSession session, const XrPassthroughCreateInfoFB *createInfo, XrPassthroughFB *outPassthrough); typedef XrResult (XRAPI_PTR *PFN_xrDestroyPassthroughFB)(XrPassthroughFB passthrough); typedef XrResult (XRAPI_PTR *PFN_xrPassthroughStartFB)(XrPassthroughFB passthrough); typedef XrResult (XRAPI_PTR *PFN_xrPassthroughPauseFB)(XrPassthroughFB passthrough); typedef XrResult (XRAPI_PTR *PFN_xrCreatePassthroughLayerFB)(XrSession session, const XrPassthroughLayerCreateInfoFB *createInfo, XrPassthroughLayerFB *outLayer); typedef XrResult (XRAPI_PTR *PFN_xrDestroyPassthroughLayerFB)(XrPassthroughLayerFB layer); typedef XrResult (XRAPI_PTR *PFN_xrPassthroughLayerPauseFB)(XrPassthroughLayerFB layer); typedef XrResult (XRAPI_PTR *PFN_xrPassthroughLayerResumeFB)(XrPassthroughLayerFB layer); typedef XrResult (XRAPI_PTR *PFN_xrPassthroughLayerSetStyleFB)(XrPassthroughLayerFB layer, const XrPassthroughStyleFB *style); typedef XrResult (XRAPI_PTR *PFN_xrCreateGeometryInstanceFB)(XrSession session, const XrGeometryInstanceCreateInfoFB *createInfo, XrGeometryInstanceFB *outGeometryInstance); typedef XrResult (XRAPI_PTR *PFN_xrDestroyGeometryInstanceFB)(XrGeometryInstanceFB instance); typedef XrResult (XRAPI_PTR *PFN_xrGeometryInstanceSetTransformFB)(XrGeometryInstanceFB instance, const XrGeometryInstanceTransformFB *transformation); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreatePassthroughFB( XrSession session, const XrPassthroughCreateInfoFB* createInfo, XrPassthroughFB* outPassthrough); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPassthroughFB( XrPassthroughFB passthrough); XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughStartFB( XrPassthroughFB passthrough); XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughPauseFB( XrPassthroughFB passthrough); XRAPI_ATTR XrResult XRAPI_CALL xrCreatePassthroughLayerFB( XrSession session, const XrPassthroughLayerCreateInfoFB* createInfo, XrPassthroughLayerFB* outLayer); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPassthroughLayerFB( XrPassthroughLayerFB layer); XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughLayerPauseFB( XrPassthroughLayerFB layer); XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughLayerResumeFB( XrPassthroughLayerFB layer); XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughLayerSetStyleFB( XrPassthroughLayerFB layer, const XrPassthroughStyleFB* style); XRAPI_ATTR XrResult XRAPI_CALL xrCreateGeometryInstanceFB( XrSession session, const XrGeometryInstanceCreateInfoFB* createInfo, XrGeometryInstanceFB* outGeometryInstance); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyGeometryInstanceFB( XrGeometryInstanceFB instance); XRAPI_ATTR XrResult XRAPI_CALL xrGeometryInstanceSetTransformFB( XrGeometryInstanceFB instance, const XrGeometryInstanceTransformFB* transformation); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_render_model 1 #define XR_NULL_RENDER_MODEL_KEY_FB 0 XR_DEFINE_ATOM(XrRenderModelKeyFB) #define XR_FB_render_model_SPEC_VERSION 4 #define XR_FB_RENDER_MODEL_EXTENSION_NAME "XR_FB_render_model" #define XR_MAX_RENDER_MODEL_NAME_SIZE_FB 64 typedef XrFlags64 XrRenderModelFlagsFB; // Flag bits for XrRenderModelFlagsFB static const XrRenderModelFlagsFB XR_RENDER_MODEL_SUPPORTS_GLTF_2_0_SUBSET_1_BIT_FB = 0x00000001; static const XrRenderModelFlagsFB XR_RENDER_MODEL_SUPPORTS_GLTF_2_0_SUBSET_2_BIT_FB = 0x00000002; typedef struct XrRenderModelPathInfoFB { XrStructureType type; void *XR_MAY_ALIAS next; XrPath path; } XrRenderModelPathInfoFB; typedef struct XrRenderModelPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t vendorId; char modelName[XR_MAX_RENDER_MODEL_NAME_SIZE_FB]; XrRenderModelKeyFB modelKey; uint32_t modelVersion; XrRenderModelFlagsFB flags; } XrRenderModelPropertiesFB; typedef struct XrRenderModelBufferFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t bufferCapacityInput; uint32_t bufferCountOutput; uint8_t *buffer; } XrRenderModelBufferFB; typedef struct XrRenderModelLoadInfoFB { XrStructureType type; void *XR_MAY_ALIAS next; XrRenderModelKeyFB modelKey; } XrRenderModelLoadInfoFB; // XrSystemRenderModelPropertiesFB extends XrSystemProperties typedef struct XrSystemRenderModelPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsRenderModelLoading; } XrSystemRenderModelPropertiesFB; // XrRenderModelCapabilitiesRequestFB extends XrSystemProperties typedef struct XrRenderModelCapabilitiesRequestFB { XrStructureType type; void *XR_MAY_ALIAS next; XrRenderModelFlagsFB flags; } XrRenderModelCapabilitiesRequestFB; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateRenderModelPathsFB)(XrSession session, uint32_t pathCapacityInput, uint32_t *pathCountOutput, XrRenderModelPathInfoFB *paths); typedef XrResult (XRAPI_PTR *PFN_xrGetRenderModelPropertiesFB)(XrSession session, XrPath path, XrRenderModelPropertiesFB *properties); typedef XrResult (XRAPI_PTR *PFN_xrLoadRenderModelFB)(XrSession session, const XrRenderModelLoadInfoFB *info, XrRenderModelBufferFB *buffer); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateRenderModelPathsFB( XrSession session, uint32_t pathCapacityInput, uint32_t* pathCountOutput, XrRenderModelPathInfoFB* paths); XRAPI_ATTR XrResult XRAPI_CALL xrGetRenderModelPropertiesFB( XrSession session, XrPath path, XrRenderModelPropertiesFB* properties); XRAPI_ATTR XrResult XRAPI_CALL xrLoadRenderModelFB( XrSession session, const XrRenderModelLoadInfoFB* info, XrRenderModelBufferFB* buffer); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_VARJO_foveated_rendering 1 #define XR_VARJO_foveated_rendering_SPEC_VERSION 3 #define XR_VARJO_FOVEATED_RENDERING_EXTENSION_NAME "XR_VARJO_foveated_rendering" // XrViewLocateFoveatedRenderingVARJO extends XrViewLocateInfo typedef struct XrViewLocateFoveatedRenderingVARJO { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 foveatedRenderingActive; } XrViewLocateFoveatedRenderingVARJO; // XrFoveatedViewConfigurationViewVARJO extends XrViewConfigurationView typedef struct XrFoveatedViewConfigurationViewVARJO { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 foveatedRenderingActive; } XrFoveatedViewConfigurationViewVARJO; // XrSystemFoveatedRenderingPropertiesVARJO extends XrSystemProperties typedef struct XrSystemFoveatedRenderingPropertiesVARJO { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsFoveatedRendering; } XrSystemFoveatedRenderingPropertiesVARJO; #define XR_VARJO_composition_layer_depth_test 1 #define XR_VARJO_composition_layer_depth_test_SPEC_VERSION 2 #define XR_VARJO_COMPOSITION_LAYER_DEPTH_TEST_EXTENSION_NAME "XR_VARJO_composition_layer_depth_test" // XrCompositionLayerDepthTestVARJO extends XrCompositionLayerProjection typedef struct XrCompositionLayerDepthTestVARJO { XrStructureType type; const void *XR_MAY_ALIAS next; float depthTestRangeNearZ; float depthTestRangeFarZ; } XrCompositionLayerDepthTestVARJO; #define XR_VARJO_environment_depth_estimation 1 #define XR_VARJO_environment_depth_estimation_SPEC_VERSION 1 #define XR_VARJO_ENVIRONMENT_DEPTH_ESTIMATION_EXTENSION_NAME "XR_VARJO_environment_depth_estimation" typedef XrResult (XRAPI_PTR *PFN_xrSetEnvironmentDepthEstimationVARJO)(XrSession session, XrBool32 enabled); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetEnvironmentDepthEstimationVARJO( XrSession session, XrBool32 enabled); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_VARJO_marker_tracking 1 #define XR_VARJO_marker_tracking_SPEC_VERSION 1 #define XR_VARJO_MARKER_TRACKING_EXTENSION_NAME "XR_VARJO_marker_tracking" // XrSystemMarkerTrackingPropertiesVARJO extends XrSystemProperties typedef struct XrSystemMarkerTrackingPropertiesVARJO { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsMarkerTracking; } XrSystemMarkerTrackingPropertiesVARJO; typedef struct XrEventDataMarkerTrackingUpdateVARJO { XrStructureType type; const void *XR_MAY_ALIAS next; uint64_t markerId; XrBool32 isActive; XrBool32 isPredicted; XrTime time; } XrEventDataMarkerTrackingUpdateVARJO; typedef struct XrMarkerSpaceCreateInfoVARJO { XrStructureType type; const void *XR_MAY_ALIAS next; uint64_t markerId; XrPosef poseInMarkerSpace; } XrMarkerSpaceCreateInfoVARJO; typedef XrResult (XRAPI_PTR *PFN_xrSetMarkerTrackingVARJO)(XrSession session, XrBool32 enabled); typedef XrResult (XRAPI_PTR *PFN_xrSetMarkerTrackingTimeoutVARJO)(XrSession session, uint64_t markerId, XrDuration timeout); typedef XrResult (XRAPI_PTR *PFN_xrSetMarkerTrackingPredictionVARJO)(XrSession session, uint64_t markerId, XrBool32 enabled); typedef XrResult (XRAPI_PTR *PFN_xrGetMarkerSizeVARJO)(XrSession session, uint64_t markerId, XrExtent2Df *size); typedef XrResult (XRAPI_PTR *PFN_xrCreateMarkerSpaceVARJO)(XrSession session, const XrMarkerSpaceCreateInfoVARJO *createInfo, XrSpace *space); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetMarkerTrackingVARJO( XrSession session, XrBool32 enabled); XRAPI_ATTR XrResult XRAPI_CALL xrSetMarkerTrackingTimeoutVARJO( XrSession session, uint64_t markerId, XrDuration timeout); XRAPI_ATTR XrResult XRAPI_CALL xrSetMarkerTrackingPredictionVARJO( XrSession session, uint64_t markerId, XrBool32 enabled); XRAPI_ATTR XrResult XRAPI_CALL xrGetMarkerSizeVARJO( XrSession session, uint64_t markerId, XrExtent2Df* size); XRAPI_ATTR XrResult XRAPI_CALL xrCreateMarkerSpaceVARJO( XrSession session, const XrMarkerSpaceCreateInfoVARJO* createInfo, XrSpace* space); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_VARJO_view_offset 1 #define XR_VARJO_view_offset_SPEC_VERSION 1 #define XR_VARJO_VIEW_OFFSET_EXTENSION_NAME "XR_VARJO_view_offset" typedef XrResult (XRAPI_PTR *PFN_xrSetViewOffsetVARJO)(XrSession session, float offset); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetViewOffsetVARJO( XrSession session, float offset); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_ML_ml2_controller_interaction 1 #define XR_ML_ml2_controller_interaction_SPEC_VERSION 1 #define XR_ML_ML2_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_ML_ml2_controller_interaction" #define XR_ML_frame_end_info 1 #define XR_ML_frame_end_info_SPEC_VERSION 1 #define XR_ML_FRAME_END_INFO_EXTENSION_NAME "XR_ML_frame_end_info" typedef XrFlags64 XrFrameEndInfoFlagsML; // Flag bits for XrFrameEndInfoFlagsML static const XrFrameEndInfoFlagsML XR_FRAME_END_INFO_PROTECTED_BIT_ML = 0x00000001; static const XrFrameEndInfoFlagsML XR_FRAME_END_INFO_VIGNETTE_BIT_ML = 0x00000002; // XrFrameEndInfoML extends XrFrameEndInfo typedef struct XrFrameEndInfoML { XrStructureType type; const void *XR_MAY_ALIAS next; float focusDistance; XrFrameEndInfoFlagsML flags; } XrFrameEndInfoML; #define XR_ML_global_dimmer 1 #define XR_ML_global_dimmer_SPEC_VERSION 1 #define XR_ML_GLOBAL_DIMMER_EXTENSION_NAME "XR_ML_global_dimmer" typedef XrFlags64 XrGlobalDimmerFrameEndInfoFlagsML; // Flag bits for XrGlobalDimmerFrameEndInfoFlagsML static const XrGlobalDimmerFrameEndInfoFlagsML XR_GLOBAL_DIMMER_FRAME_END_INFO_ENABLED_BIT_ML = 0x00000001; // XrGlobalDimmerFrameEndInfoML extends XrFrameEndInfo typedef struct XrGlobalDimmerFrameEndInfoML { XrStructureType type; const void *XR_MAY_ALIAS next; float dimmerValue; XrGlobalDimmerFrameEndInfoFlagsML flags; } XrGlobalDimmerFrameEndInfoML; #define XR_MSFT_spatial_anchor_persistence 1 XR_DEFINE_HANDLE(XrSpatialAnchorStoreConnectionMSFT) #define XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT 256 #define XR_MSFT_spatial_anchor_persistence_SPEC_VERSION 2 #define XR_MSFT_SPATIAL_ANCHOR_PERSISTENCE_EXTENSION_NAME "XR_MSFT_spatial_anchor_persistence" typedef struct XrSpatialAnchorPersistenceNameMSFT { char name[XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT]; } XrSpatialAnchorPersistenceNameMSFT; typedef struct XrSpatialAnchorPersistenceInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpatialAnchorPersistenceNameMSFT spatialAnchorPersistenceName; XrSpatialAnchorMSFT spatialAnchor; } XrSpatialAnchorPersistenceInfoMSFT; typedef struct XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore; XrSpatialAnchorPersistenceNameMSFT spatialAnchorPersistenceName; } XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorStoreConnectionMSFT)(XrSession session, XrSpatialAnchorStoreConnectionMSFT *spatialAnchorStore); typedef XrResult (XRAPI_PTR *PFN_xrDestroySpatialAnchorStoreConnectionMSFT)( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); typedef XrResult (XRAPI_PTR *PFN_xrPersistSpatialAnchorMSFT)( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceInfoMSFT *spatialAnchorPersistenceInfo); typedef XrResult (XRAPI_PTR *PFN_xrEnumeratePersistedSpatialAnchorNamesMSFT)( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, uint32_t spatialAnchorNamesCapacityInput, uint32_t *spatialAnchorNamesCountOutput, XrSpatialAnchorPersistenceNameMSFT *persistedAnchorNames); typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFromPersistedNameMSFT)(XrSession session, const XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT *spatialAnchorCreateInfo, XrSpatialAnchorMSFT *spatialAnchor); typedef XrResult (XRAPI_PTR *PFN_xrUnpersistSpatialAnchorMSFT)( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceNameMSFT *spatialAnchorPersistenceName); typedef XrResult (XRAPI_PTR *PFN_xrClearSpatialAnchorStoreMSFT)( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorStoreConnectionMSFT( XrSession session, XrSpatialAnchorStoreConnectionMSFT* spatialAnchorStore); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpatialAnchorStoreConnectionMSFT( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); XRAPI_ATTR XrResult XRAPI_CALL xrPersistSpatialAnchorMSFT( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceInfoMSFT* spatialAnchorPersistenceInfo); XRAPI_ATTR XrResult XRAPI_CALL xrEnumeratePersistedSpatialAnchorNamesMSFT( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, uint32_t spatialAnchorNamesCapacityInput, uint32_t* spatialAnchorNamesCountOutput, XrSpatialAnchorPersistenceNameMSFT* persistedAnchorNames); XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFromPersistedNameMSFT( XrSession session, const XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT* spatialAnchorCreateInfo, XrSpatialAnchorMSFT* spatialAnchor); XRAPI_ATTR XrResult XRAPI_CALL xrUnpersistSpatialAnchorMSFT( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceNameMSFT* spatialAnchorPersistenceName); XRAPI_ATTR XrResult XRAPI_CALL xrClearSpatialAnchorStoreMSFT( XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_ULTRALEAP_hand_tracking_forearm 1 #define XR_HAND_FOREARM_JOINT_COUNT_ULTRALEAP 27 #define XR_ULTRALEAP_hand_tracking_forearm_SPEC_VERSION 1 #define XR_ULTRALEAP_HAND_TRACKING_FOREARM_EXTENSION_NAME "XR_ULTRALEAP_hand_tracking_forearm" typedef enum XrHandForearmJointULTRALEAP { XR_HAND_FOREARM_JOINT_PALM_ULTRALEAP = 0, XR_HAND_FOREARM_JOINT_WRIST_ULTRALEAP = 1, XR_HAND_FOREARM_JOINT_THUMB_METACARPAL_ULTRALEAP = 2, XR_HAND_FOREARM_JOINT_THUMB_PROXIMAL_ULTRALEAP = 3, XR_HAND_FOREARM_JOINT_THUMB_DISTAL_ULTRALEAP = 4, XR_HAND_FOREARM_JOINT_THUMB_TIP_ULTRALEAP = 5, XR_HAND_FOREARM_JOINT_INDEX_METACARPAL_ULTRALEAP = 6, XR_HAND_FOREARM_JOINT_INDEX_PROXIMAL_ULTRALEAP = 7, XR_HAND_FOREARM_JOINT_INDEX_INTERMEDIATE_ULTRALEAP = 8, XR_HAND_FOREARM_JOINT_INDEX_DISTAL_ULTRALEAP = 9, XR_HAND_FOREARM_JOINT_INDEX_TIP_ULTRALEAP = 10, XR_HAND_FOREARM_JOINT_MIDDLE_METACARPAL_ULTRALEAP = 11, XR_HAND_FOREARM_JOINT_MIDDLE_PROXIMAL_ULTRALEAP = 12, XR_HAND_FOREARM_JOINT_MIDDLE_INTERMEDIATE_ULTRALEAP = 13, XR_HAND_FOREARM_JOINT_MIDDLE_DISTAL_ULTRALEAP = 14, XR_HAND_FOREARM_JOINT_MIDDLE_TIP_ULTRALEAP = 15, XR_HAND_FOREARM_JOINT_RING_METACARPAL_ULTRALEAP = 16, XR_HAND_FOREARM_JOINT_RING_PROXIMAL_ULTRALEAP = 17, XR_HAND_FOREARM_JOINT_RING_INTERMEDIATE_ULTRALEAP = 18, XR_HAND_FOREARM_JOINT_RING_DISTAL_ULTRALEAP = 19, XR_HAND_FOREARM_JOINT_RING_TIP_ULTRALEAP = 20, XR_HAND_FOREARM_JOINT_LITTLE_METACARPAL_ULTRALEAP = 21, XR_HAND_FOREARM_JOINT_LITTLE_PROXIMAL_ULTRALEAP = 22, XR_HAND_FOREARM_JOINT_LITTLE_INTERMEDIATE_ULTRALEAP = 23, XR_HAND_FOREARM_JOINT_LITTLE_DISTAL_ULTRALEAP = 24, XR_HAND_FOREARM_JOINT_LITTLE_TIP_ULTRALEAP = 25, XR_HAND_FOREARM_JOINT_ELBOW_ULTRALEAP = 26, XR_HAND_FOREARM_JOINT_MAX_ENUM_ULTRALEAP = 0x7FFFFFFF } XrHandForearmJointULTRALEAP; #define XR_FB_spatial_entity_query 1 #define XR_FB_spatial_entity_query_SPEC_VERSION 1 #define XR_FB_SPATIAL_ENTITY_QUERY_EXTENSION_NAME "XR_FB_spatial_entity_query" typedef enum XrSpaceQueryActionFB { XR_SPACE_QUERY_ACTION_LOAD_FB = 0, XR_SPACE_QUERY_ACTION_MAX_ENUM_FB = 0x7FFFFFFF } XrSpaceQueryActionFB; typedef enum XrSpaceStorageLocationFB { XR_SPACE_STORAGE_LOCATION_INVALID_FB = 0, XR_SPACE_STORAGE_LOCATION_LOCAL_FB = 1, XR_SPACE_STORAGE_LOCATION_CLOUD_FB = 2, XR_SPACE_STORAGE_LOCATION_MAX_ENUM_FB = 0x7FFFFFFF } XrSpaceStorageLocationFB; typedef struct XR_MAY_ALIAS XrSpaceQueryInfoBaseHeaderFB { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSpaceQueryInfoBaseHeaderFB; typedef struct XR_MAY_ALIAS XrSpaceFilterInfoBaseHeaderFB { XrStructureType type; const void *XR_MAY_ALIAS next; } XrSpaceFilterInfoBaseHeaderFB; typedef struct XrSpaceQueryInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpaceQueryActionFB queryAction; uint32_t maxResultCount; XrDuration timeout; const XrSpaceFilterInfoBaseHeaderFB *filter; const XrSpaceFilterInfoBaseHeaderFB *excludeFilter; } XrSpaceQueryInfoFB; // XrSpaceStorageLocationFilterInfoFB extends XrSpaceFilterInfoBaseHeaderFB typedef struct XrSpaceStorageLocationFilterInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpaceStorageLocationFB location; } XrSpaceStorageLocationFilterInfoFB; typedef struct XrSpaceUuidFilterInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t uuidCount; XrUuidEXT *uuids; } XrSpaceUuidFilterInfoFB; typedef struct XrSpaceComponentFilterInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpaceComponentTypeFB componentType; } XrSpaceComponentFilterInfoFB; typedef struct XrSpaceQueryResultFB { XrSpace space; XrUuidEXT uuid; } XrSpaceQueryResultFB; typedef struct XrSpaceQueryResultsFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t resultCapacityInput; uint32_t resultCountOutput; XrSpaceQueryResultFB *results; } XrSpaceQueryResultsFB; typedef struct XrEventDataSpaceQueryResultsAvailableFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; } XrEventDataSpaceQueryResultsAvailableFB; typedef struct XrEventDataSpaceQueryCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; } XrEventDataSpaceQueryCompleteFB; typedef XrResult (XRAPI_PTR *PFN_xrQuerySpacesFB)(XrSession session, const XrSpaceQueryInfoBaseHeaderFB *info, XrAsyncRequestIdFB *requestId); typedef XrResult (XRAPI_PTR *PFN_xrRetrieveSpaceQueryResultsFB)(XrSession session, XrAsyncRequestIdFB requestId, XrSpaceQueryResultsFB *results); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrQuerySpacesFB( XrSession session, const XrSpaceQueryInfoBaseHeaderFB* info, XrAsyncRequestIdFB* requestId); XRAPI_ATTR XrResult XRAPI_CALL xrRetrieveSpaceQueryResultsFB( XrSession session, XrAsyncRequestIdFB requestId, XrSpaceQueryResultsFB* results); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_spatial_entity_storage 1 #define XR_FB_spatial_entity_storage_SPEC_VERSION 1 #define XR_FB_SPATIAL_ENTITY_STORAGE_EXTENSION_NAME "XR_FB_spatial_entity_storage" typedef enum XrSpacePersistenceModeFB { XR_SPACE_PERSISTENCE_MODE_INVALID_FB = 0, XR_SPACE_PERSISTENCE_MODE_INDEFINITE_FB = 1, XR_SPACE_PERSISTENCE_MODE_MAX_ENUM_FB = 0x7FFFFFFF } XrSpacePersistenceModeFB; typedef struct XrSpaceSaveInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace space; XrSpaceStorageLocationFB location; XrSpacePersistenceModeFB persistenceMode; } XrSpaceSaveInfoFB; typedef struct XrSpaceEraseInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace space; XrSpaceStorageLocationFB location; } XrSpaceEraseInfoFB; typedef struct XrEventDataSpaceSaveCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; XrSpace space; XrUuidEXT uuid; XrSpaceStorageLocationFB location; } XrEventDataSpaceSaveCompleteFB; typedef struct XrEventDataSpaceEraseCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; XrSpace space; XrUuidEXT uuid; XrSpaceStorageLocationFB location; } XrEventDataSpaceEraseCompleteFB; typedef XrResult (XRAPI_PTR *PFN_xrSaveSpaceFB)(XrSession session, const XrSpaceSaveInfoFB *info, XrAsyncRequestIdFB *requestId); typedef XrResult (XRAPI_PTR *PFN_xrEraseSpaceFB)(XrSession session, const XrSpaceEraseInfoFB *info, XrAsyncRequestIdFB *requestId); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSaveSpaceFB( XrSession session, const XrSpaceSaveInfoFB* info, XrAsyncRequestIdFB* requestId); XRAPI_ATTR XrResult XRAPI_CALL xrEraseSpaceFB( XrSession session, const XrSpaceEraseInfoFB* info, XrAsyncRequestIdFB* requestId); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_touch_controller_pro 1 #define XR_FB_touch_controller_pro_SPEC_VERSION 1 #define XR_FB_TOUCH_CONTROLLER_PRO_EXTENSION_NAME "XR_FB_touch_controller_pro" #define XR_FB_spatial_entity_sharing 1 XR_DEFINE_HANDLE(XrSpaceUserFB) #define XR_FB_spatial_entity_sharing_SPEC_VERSION 1 #define XR_FB_SPATIAL_ENTITY_SHARING_EXTENSION_NAME "XR_FB_spatial_entity_sharing" typedef struct XrSpaceShareInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t spaceCount; XrSpace *spaces; uint32_t userCount; XrSpaceUserFB *users; } XrSpaceShareInfoFB; typedef struct XrEventDataSpaceShareCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; } XrEventDataSpaceShareCompleteFB; typedef XrResult (XRAPI_PTR *PFN_xrShareSpacesFB)(XrSession session, const XrSpaceShareInfoFB *info, XrAsyncRequestIdFB *requestId); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrShareSpacesFB( XrSession session, const XrSpaceShareInfoFB* info, XrAsyncRequestIdFB* requestId); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_space_warp 1 #define XR_FB_space_warp_SPEC_VERSION 2 #define XR_FB_SPACE_WARP_EXTENSION_NAME "XR_FB_space_warp" typedef XrFlags64 XrCompositionLayerSpaceWarpInfoFlagsFB; // Flag bits for XrCompositionLayerSpaceWarpInfoFlagsFB static const XrCompositionLayerSpaceWarpInfoFlagsFB XR_COMPOSITION_LAYER_SPACE_WARP_INFO_FRAME_SKIP_BIT_FB = 0x00000001; // XrCompositionLayerSpaceWarpInfoFB extends XrCompositionLayerProjectionView typedef struct XrCompositionLayerSpaceWarpInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerSpaceWarpInfoFlagsFB layerFlags; XrSwapchainSubImage motionVectorSubImage; XrPosef appSpaceDeltaPose; XrSwapchainSubImage depthSubImage; float minDepth; float maxDepth; float nearZ; float farZ; } XrCompositionLayerSpaceWarpInfoFB; // XrSystemSpaceWarpPropertiesFB extends XrSystemProperties typedef struct XrSystemSpaceWarpPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t recommendedMotionVectorImageRectWidth; uint32_t recommendedMotionVectorImageRectHeight; } XrSystemSpaceWarpPropertiesFB; #define XR_FB_haptic_amplitude_envelope 1 #define XR_MAX_HAPTIC_AMPLITUDE_ENVELOPE_SAMPLES_FB 4000u #define XR_FB_haptic_amplitude_envelope_SPEC_VERSION 1 #define XR_FB_HAPTIC_AMPLITUDE_ENVELOPE_EXTENSION_NAME "XR_FB_haptic_amplitude_envelope" typedef struct XrHapticAmplitudeEnvelopeVibrationFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrDuration duration; uint32_t amplitudeCount; const float *amplitudes; } XrHapticAmplitudeEnvelopeVibrationFB; #define XR_FB_scene 1 #define XR_FB_scene_SPEC_VERSION 3 #define XR_FB_SCENE_EXTENSION_NAME "XR_FB_scene" typedef XrFlags64 XrSemanticLabelsSupportFlagsFB; // Flag bits for XrSemanticLabelsSupportFlagsFB static const XrSemanticLabelsSupportFlagsFB XR_SEMANTIC_LABELS_SUPPORT_MULTIPLE_SEMANTIC_LABELS_BIT_FB = 0x00000001; static const XrSemanticLabelsSupportFlagsFB XR_SEMANTIC_LABELS_SUPPORT_ACCEPT_DESK_TO_TABLE_MIGRATION_BIT_FB = 0x00000002; typedef struct XrExtent3DfFB { float width; float height; float depth; } XrExtent3DfFB; typedef struct XrOffset3DfFB { float x; float y; float z; } XrOffset3DfFB; typedef struct XrRect3DfFB { XrOffset3DfFB offset; XrExtent3DfFB extent; } XrRect3DfFB; typedef struct XrSemanticLabelsFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t bufferCapacityInput; uint32_t bufferCountOutput; char *buffer; } XrSemanticLabelsFB; typedef struct XrRoomLayoutFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrUuidEXT floorUuid; XrUuidEXT ceilingUuid; uint32_t wallUuidCapacityInput; uint32_t wallUuidCountOutput; XrUuidEXT *wallUuids; } XrRoomLayoutFB; typedef struct XrBoundary2DFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrVector2f *vertices; } XrBoundary2DFB; typedef struct XrSemanticLabelsSupportInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSemanticLabelsSupportFlagsFB flags; const char *recognizedLabels; } XrSemanticLabelsSupportInfoFB; typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox2DFB)(XrSession session, XrSpace space, XrRect2Df *boundingBox2DOutput); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundingBox3DFB)(XrSession session, XrSpace space, XrRect3DfFB *boundingBox3DOutput); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceSemanticLabelsFB)(XrSession session, XrSpace space, XrSemanticLabelsFB *semanticLabelsOutput); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceBoundary2DFB)(XrSession session, XrSpace space, XrBoundary2DFB *boundary2DOutput); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceRoomLayoutFB)(XrSession session, XrSpace space, XrRoomLayoutFB *roomLayoutOutput); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox2DFB( XrSession session, XrSpace space, XrRect2Df* boundingBox2DOutput); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundingBox3DFB( XrSession session, XrSpace space, XrRect3DfFB* boundingBox3DOutput); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceSemanticLabelsFB( XrSession session, XrSpace space, XrSemanticLabelsFB* semanticLabelsOutput); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceBoundary2DFB( XrSession session, XrSpace space, XrBoundary2DFB* boundary2DOutput); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceRoomLayoutFB( XrSession session, XrSpace space, XrRoomLayoutFB* roomLayoutOutput); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_palm_pose 1 #define XR_EXT_palm_pose_SPEC_VERSION 2 #define XR_EXT_PALM_POSE_EXTENSION_NAME "XR_EXT_palm_pose" #define XR_ALMALENCE_digital_lens_control 1 #define XR_ALMALENCE_digital_lens_control_SPEC_VERSION 1 #define XR_ALMALENCE_DIGITAL_LENS_CONTROL_EXTENSION_NAME "XR_ALMALENCE_digital_lens_control" typedef XrFlags64 XrDigitalLensControlFlagsALMALENCE; // Flag bits for XrDigitalLensControlFlagsALMALENCE static const XrDigitalLensControlFlagsALMALENCE XR_DIGITAL_LENS_CONTROL_PROCESSING_DISABLE_BIT_ALMALENCE = 0x00000001; typedef struct XrDigitalLensControlALMALENCE { XrStructureType type; const void *XR_MAY_ALIAS next; XrDigitalLensControlFlagsALMALENCE flags; } XrDigitalLensControlALMALENCE; typedef XrResult (XRAPI_PTR *PFN_xrSetDigitalLensControlALMALENCE)(XrSession session, const XrDigitalLensControlALMALENCE *digitalLensControl); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetDigitalLensControlALMALENCE( XrSession session, const XrDigitalLensControlALMALENCE* digitalLensControl); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_scene_capture 1 #define XR_FB_scene_capture_SPEC_VERSION 1 #define XR_FB_SCENE_CAPTURE_EXTENSION_NAME "XR_FB_scene_capture" typedef struct XrEventDataSceneCaptureCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; } XrEventDataSceneCaptureCompleteFB; typedef struct XrSceneCaptureRequestInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t requestByteCount; const char *request; } XrSceneCaptureRequestInfoFB; typedef XrResult (XRAPI_PTR *PFN_xrRequestSceneCaptureFB)(XrSession session, const XrSceneCaptureRequestInfoFB *info, XrAsyncRequestIdFB *requestId); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrRequestSceneCaptureFB( XrSession session, const XrSceneCaptureRequestInfoFB* info, XrAsyncRequestIdFB* requestId); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_spatial_entity_container 1 #define XR_FB_spatial_entity_container_SPEC_VERSION 2 #define XR_FB_SPATIAL_ENTITY_CONTAINER_EXTENSION_NAME "XR_FB_spatial_entity_container" typedef struct XrSpaceContainerFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t uuidCapacityInput; uint32_t uuidCountOutput; XrUuidEXT *uuids; } XrSpaceContainerFB; typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceContainerFB)(XrSession session, XrSpace space, XrSpaceContainerFB *spaceContainerOutput); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceContainerFB( XrSession session, XrSpace space, XrSpaceContainerFB* spaceContainerOutput); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_META_foveation_eye_tracked 1 #define XR_FOVEATION_CENTER_SIZE_META 2 #define XR_META_foveation_eye_tracked_SPEC_VERSION 1 #define XR_META_FOVEATION_EYE_TRACKED_EXTENSION_NAME "XR_META_foveation_eye_tracked" typedef XrFlags64 XrFoveationEyeTrackedProfileCreateFlagsMETA; // Flag bits for XrFoveationEyeTrackedProfileCreateFlagsMETA typedef XrFlags64 XrFoveationEyeTrackedStateFlagsMETA; // Flag bits for XrFoveationEyeTrackedStateFlagsMETA static const XrFoveationEyeTrackedStateFlagsMETA XR_FOVEATION_EYE_TRACKED_STATE_VALID_BIT_META = 0x00000001; // XrFoveationEyeTrackedProfileCreateInfoMETA extends XrFoveationLevelProfileCreateInfoFB typedef struct XrFoveationEyeTrackedProfileCreateInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrFoveationEyeTrackedProfileCreateFlagsMETA flags; } XrFoveationEyeTrackedProfileCreateInfoMETA; typedef struct XrFoveationEyeTrackedStateMETA { XrStructureType type; void *XR_MAY_ALIAS next; XrVector2f foveationCenter[XR_FOVEATION_CENTER_SIZE_META]; XrFoveationEyeTrackedStateFlagsMETA flags; } XrFoveationEyeTrackedStateMETA; // XrSystemFoveationEyeTrackedPropertiesMETA extends XrSystemProperties typedef struct XrSystemFoveationEyeTrackedPropertiesMETA { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsFoveationEyeTracked; } XrSystemFoveationEyeTrackedPropertiesMETA; typedef XrResult (XRAPI_PTR *PFN_xrGetFoveationEyeTrackedStateMETA)(XrSession session, XrFoveationEyeTrackedStateMETA *foveationState); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetFoveationEyeTrackedStateMETA( XrSession session, XrFoveationEyeTrackedStateMETA* foveationState); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_face_tracking 1 #define XR_FACE_EXPRESSSION_SET_DEFAULT_FB XR_FACE_EXPRESSION_SET_DEFAULT_FB XR_DEFINE_HANDLE(XrFaceTrackerFB) #define XR_FB_face_tracking_SPEC_VERSION 1 #define XR_FB_FACE_TRACKING_EXTENSION_NAME "XR_FB_face_tracking" typedef enum XrFaceExpressionFB { XR_FACE_EXPRESSION_BROW_LOWERER_L_FB = 0, XR_FACE_EXPRESSION_BROW_LOWERER_R_FB = 1, XR_FACE_EXPRESSION_CHEEK_PUFF_L_FB = 2, XR_FACE_EXPRESSION_CHEEK_PUFF_R_FB = 3, XR_FACE_EXPRESSION_CHEEK_RAISER_L_FB = 4, XR_FACE_EXPRESSION_CHEEK_RAISER_R_FB = 5, XR_FACE_EXPRESSION_CHEEK_SUCK_L_FB = 6, XR_FACE_EXPRESSION_CHEEK_SUCK_R_FB = 7, XR_FACE_EXPRESSION_CHIN_RAISER_B_FB = 8, XR_FACE_EXPRESSION_CHIN_RAISER_T_FB = 9, XR_FACE_EXPRESSION_DIMPLER_L_FB = 10, XR_FACE_EXPRESSION_DIMPLER_R_FB = 11, XR_FACE_EXPRESSION_EYES_CLOSED_L_FB = 12, XR_FACE_EXPRESSION_EYES_CLOSED_R_FB = 13, XR_FACE_EXPRESSION_EYES_LOOK_DOWN_L_FB = 14, XR_FACE_EXPRESSION_EYES_LOOK_DOWN_R_FB = 15, XR_FACE_EXPRESSION_EYES_LOOK_LEFT_L_FB = 16, XR_FACE_EXPRESSION_EYES_LOOK_LEFT_R_FB = 17, XR_FACE_EXPRESSION_EYES_LOOK_RIGHT_L_FB = 18, XR_FACE_EXPRESSION_EYES_LOOK_RIGHT_R_FB = 19, XR_FACE_EXPRESSION_EYES_LOOK_UP_L_FB = 20, XR_FACE_EXPRESSION_EYES_LOOK_UP_R_FB = 21, XR_FACE_EXPRESSION_INNER_BROW_RAISER_L_FB = 22, XR_FACE_EXPRESSION_INNER_BROW_RAISER_R_FB = 23, XR_FACE_EXPRESSION_JAW_DROP_FB = 24, XR_FACE_EXPRESSION_JAW_SIDEWAYS_LEFT_FB = 25, XR_FACE_EXPRESSION_JAW_SIDEWAYS_RIGHT_FB = 26, XR_FACE_EXPRESSION_JAW_THRUST_FB = 27, XR_FACE_EXPRESSION_LID_TIGHTENER_L_FB = 28, XR_FACE_EXPRESSION_LID_TIGHTENER_R_FB = 29, XR_FACE_EXPRESSION_LIP_CORNER_DEPRESSOR_L_FB = 30, XR_FACE_EXPRESSION_LIP_CORNER_DEPRESSOR_R_FB = 31, XR_FACE_EXPRESSION_LIP_CORNER_PULLER_L_FB = 32, XR_FACE_EXPRESSION_LIP_CORNER_PULLER_R_FB = 33, XR_FACE_EXPRESSION_LIP_FUNNELER_LB_FB = 34, XR_FACE_EXPRESSION_LIP_FUNNELER_LT_FB = 35, XR_FACE_EXPRESSION_LIP_FUNNELER_RB_FB = 36, XR_FACE_EXPRESSION_LIP_FUNNELER_RT_FB = 37, XR_FACE_EXPRESSION_LIP_PRESSOR_L_FB = 38, XR_FACE_EXPRESSION_LIP_PRESSOR_R_FB = 39, XR_FACE_EXPRESSION_LIP_PUCKER_L_FB = 40, XR_FACE_EXPRESSION_LIP_PUCKER_R_FB = 41, XR_FACE_EXPRESSION_LIP_STRETCHER_L_FB = 42, XR_FACE_EXPRESSION_LIP_STRETCHER_R_FB = 43, XR_FACE_EXPRESSION_LIP_SUCK_LB_FB = 44, XR_FACE_EXPRESSION_LIP_SUCK_LT_FB = 45, XR_FACE_EXPRESSION_LIP_SUCK_RB_FB = 46, XR_FACE_EXPRESSION_LIP_SUCK_RT_FB = 47, XR_FACE_EXPRESSION_LIP_TIGHTENER_L_FB = 48, XR_FACE_EXPRESSION_LIP_TIGHTENER_R_FB = 49, XR_FACE_EXPRESSION_LIPS_TOWARD_FB = 50, XR_FACE_EXPRESSION_LOWER_LIP_DEPRESSOR_L_FB = 51, XR_FACE_EXPRESSION_LOWER_LIP_DEPRESSOR_R_FB = 52, XR_FACE_EXPRESSION_MOUTH_LEFT_FB = 53, XR_FACE_EXPRESSION_MOUTH_RIGHT_FB = 54, XR_FACE_EXPRESSION_NOSE_WRINKLER_L_FB = 55, XR_FACE_EXPRESSION_NOSE_WRINKLER_R_FB = 56, XR_FACE_EXPRESSION_OUTER_BROW_RAISER_L_FB = 57, XR_FACE_EXPRESSION_OUTER_BROW_RAISER_R_FB = 58, XR_FACE_EXPRESSION_UPPER_LID_RAISER_L_FB = 59, XR_FACE_EXPRESSION_UPPER_LID_RAISER_R_FB = 60, XR_FACE_EXPRESSION_UPPER_LIP_RAISER_L_FB = 61, XR_FACE_EXPRESSION_UPPER_LIP_RAISER_R_FB = 62, XR_FACE_EXPRESSION_COUNT_FB = 63, XR_FACE_EXPRESSION_MAX_ENUM_FB = 0x7FFFFFFF } XrFaceExpressionFB; typedef enum XrFaceExpressionSetFB { XR_FACE_EXPRESSION_SET_DEFAULT_FB = 0, XR_FACE_EXPRESSION_SET_MAX_ENUM_FB = 0x7FFFFFFF } XrFaceExpressionSetFB; typedef enum XrFaceConfidenceFB { XR_FACE_CONFIDENCE_LOWER_FACE_FB = 0, XR_FACE_CONFIDENCE_UPPER_FACE_FB = 1, XR_FACE_CONFIDENCE_COUNT_FB = 2, XR_FACE_CONFIDENCE_MAX_ENUM_FB = 0x7FFFFFFF } XrFaceConfidenceFB; // XrSystemFaceTrackingPropertiesFB extends XrSystemProperties typedef struct XrSystemFaceTrackingPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsFaceTracking; } XrSystemFaceTrackingPropertiesFB; typedef struct XrFaceTrackerCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrFaceExpressionSetFB faceExpressionSet; } XrFaceTrackerCreateInfoFB; typedef struct XrFaceExpressionInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrTime time; } XrFaceExpressionInfoFB; typedef struct XrFaceExpressionStatusFB { XrBool32 isValid; XrBool32 isEyeFollowingBlendshapesValid; } XrFaceExpressionStatusFB; typedef struct XrFaceExpressionWeightsFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t weightCount; float *weights; uint32_t confidenceCount; float *confidences; XrFaceExpressionStatusFB status; XrTime time; } XrFaceExpressionWeightsFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateFaceTrackerFB)(XrSession session, const XrFaceTrackerCreateInfoFB *createInfo, XrFaceTrackerFB *faceTracker); typedef XrResult (XRAPI_PTR *PFN_xrDestroyFaceTrackerFB)(XrFaceTrackerFB faceTracker); typedef XrResult (XRAPI_PTR *PFN_xrGetFaceExpressionWeightsFB)(XrFaceTrackerFB faceTracker, const XrFaceExpressionInfoFB *expressionInfo, XrFaceExpressionWeightsFB *expressionWeights); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateFaceTrackerFB( XrSession session, const XrFaceTrackerCreateInfoFB* createInfo, XrFaceTrackerFB* faceTracker); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyFaceTrackerFB( XrFaceTrackerFB faceTracker); XRAPI_ATTR XrResult XRAPI_CALL xrGetFaceExpressionWeightsFB( XrFaceTrackerFB faceTracker, const XrFaceExpressionInfoFB* expressionInfo, XrFaceExpressionWeightsFB* expressionWeights); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_eye_tracking_social 1 XR_DEFINE_HANDLE(XrEyeTrackerFB) #define XR_FB_eye_tracking_social_SPEC_VERSION 1 #define XR_FB_EYE_TRACKING_SOCIAL_EXTENSION_NAME "XR_FB_eye_tracking_social" typedef enum XrEyePositionFB { XR_EYE_POSITION_LEFT_FB = 0, XR_EYE_POSITION_RIGHT_FB = 1, XR_EYE_POSITION_COUNT_FB = 2, XR_EYE_POSITION_MAX_ENUM_FB = 0x7FFFFFFF } XrEyePositionFB; typedef struct XrEyeGazeFB { XrBool32 isValid; XrPosef gazePose; float gazeConfidence; } XrEyeGazeFB; typedef struct XrEyeTrackerCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; } XrEyeTrackerCreateInfoFB; typedef struct XrEyeGazesInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; } XrEyeGazesInfoFB; // XrSystemEyeTrackingPropertiesFB extends XrSystemProperties typedef struct XrSystemEyeTrackingPropertiesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsEyeTracking; } XrSystemEyeTrackingPropertiesFB; typedef struct XrEyeGazesFB { XrStructureType type; void *XR_MAY_ALIAS next; XrEyeGazeFB gaze[XR_EYE_POSITION_COUNT_FB]; XrTime time; } XrEyeGazesFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateEyeTrackerFB)(XrSession session, const XrEyeTrackerCreateInfoFB *createInfo, XrEyeTrackerFB *eyeTracker); typedef XrResult (XRAPI_PTR *PFN_xrDestroyEyeTrackerFB)(XrEyeTrackerFB eyeTracker); typedef XrResult (XRAPI_PTR *PFN_xrGetEyeGazesFB)(XrEyeTrackerFB eyeTracker, const XrEyeGazesInfoFB *gazeInfo, XrEyeGazesFB *eyeGazes); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateEyeTrackerFB( XrSession session, const XrEyeTrackerCreateInfoFB* createInfo, XrEyeTrackerFB* eyeTracker); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyEyeTrackerFB( XrEyeTrackerFB eyeTracker); XRAPI_ATTR XrResult XRAPI_CALL xrGetEyeGazesFB( XrEyeTrackerFB eyeTracker, const XrEyeGazesInfoFB* gazeInfo, XrEyeGazesFB* eyeGazes); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_passthrough_keyboard_hands 1 #define XR_FB_passthrough_keyboard_hands_SPEC_VERSION 2 #define XR_FB_PASSTHROUGH_KEYBOARD_HANDS_EXTENSION_NAME "XR_FB_passthrough_keyboard_hands" typedef struct XrPassthroughKeyboardHandsIntensityFB { XrStructureType type; const void *XR_MAY_ALIAS next; float leftHandIntensity; float rightHandIntensity; } XrPassthroughKeyboardHandsIntensityFB; typedef XrResult (XRAPI_PTR *PFN_xrPassthroughLayerSetKeyboardHandsIntensityFB)( XrPassthroughLayerFB layer, const XrPassthroughKeyboardHandsIntensityFB *intensity); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrPassthroughLayerSetKeyboardHandsIntensityFB( XrPassthroughLayerFB layer, const XrPassthroughKeyboardHandsIntensityFB* intensity); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_composition_layer_settings 1 #define XR_FB_composition_layer_settings_SPEC_VERSION 1 #define XR_FB_COMPOSITION_LAYER_SETTINGS_EXTENSION_NAME "XR_FB_composition_layer_settings" typedef XrFlags64 XrCompositionLayerSettingsFlagsFB; // Flag bits for XrCompositionLayerSettingsFlagsFB static const XrCompositionLayerSettingsFlagsFB XR_COMPOSITION_LAYER_SETTINGS_NORMAL_SUPER_SAMPLING_BIT_FB = 0x00000001; static const XrCompositionLayerSettingsFlagsFB XR_COMPOSITION_LAYER_SETTINGS_QUALITY_SUPER_SAMPLING_BIT_FB = 0x00000002; static const XrCompositionLayerSettingsFlagsFB XR_COMPOSITION_LAYER_SETTINGS_NORMAL_SHARPENING_BIT_FB = 0x00000004; static const XrCompositionLayerSettingsFlagsFB XR_COMPOSITION_LAYER_SETTINGS_QUALITY_SHARPENING_BIT_FB = 0x00000008; // XrCompositionLayerSettingsFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerSettingsFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerSettingsFlagsFB layerFlags; } XrCompositionLayerSettingsFB; #define XR_FB_touch_controller_proximity 1 #define XR_FB_touch_controller_proximity_SPEC_VERSION 1 #define XR_FB_TOUCH_CONTROLLER_PROXIMITY_EXTENSION_NAME "XR_FB_touch_controller_proximity" #define XR_FB_haptic_pcm 1 #define XR_MAX_HAPTIC_PCM_BUFFER_SIZE_FB 4000 #define XR_FB_haptic_pcm_SPEC_VERSION 1 #define XR_FB_HAPTIC_PCM_EXTENSION_NAME "XR_FB_haptic_pcm" typedef struct XrHapticPcmVibrationFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t bufferSize; const float *buffer; float sampleRate; XrBool32 append; uint32_t *samplesConsumed; } XrHapticPcmVibrationFB; typedef struct XrDevicePcmSampleRateStateFB { XrStructureType type; void *XR_MAY_ALIAS next; float sampleRate; } XrDevicePcmSampleRateStateFB; typedef XrDevicePcmSampleRateStateFB XrDevicePcmSampleRateGetInfoFB; typedef XrResult (XRAPI_PTR *PFN_xrGetDeviceSampleRateFB)(XrSession session, const XrHapticActionInfo *hapticActionInfo, XrDevicePcmSampleRateGetInfoFB *deviceSampleRate); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetDeviceSampleRateFB( XrSession session, const XrHapticActionInfo* hapticActionInfo, XrDevicePcmSampleRateGetInfoFB* deviceSampleRate); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_composition_layer_depth_test 1 #define XR_FB_composition_layer_depth_test_SPEC_VERSION 1 #define XR_FB_COMPOSITION_LAYER_DEPTH_TEST_EXTENSION_NAME "XR_FB_composition_layer_depth_test" typedef enum XrCompareOpFB { XR_COMPARE_OP_NEVER_FB = 0, XR_COMPARE_OP_LESS_FB = 1, XR_COMPARE_OP_EQUAL_FB = 2, XR_COMPARE_OP_LESS_OR_EQUAL_FB = 3, XR_COMPARE_OP_GREATER_FB = 4, XR_COMPARE_OP_NOT_EQUAL_FB = 5, XR_COMPARE_OP_GREATER_OR_EQUAL_FB = 6, XR_COMPARE_OP_ALWAYS_FB = 7, XR_COMPARE_OP_MAX_ENUM_FB = 0x7FFFFFFF } XrCompareOpFB; // XrCompositionLayerDepthTestFB extends XrCompositionLayerBaseHeader typedef struct XrCompositionLayerDepthTestFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 depthMask; XrCompareOpFB compareOp; } XrCompositionLayerDepthTestFB; #define XR_META_local_dimming 1 #define XR_META_local_dimming_SPEC_VERSION 1 #define XR_META_LOCAL_DIMMING_EXTENSION_NAME "XR_META_local_dimming" typedef enum XrLocalDimmingModeMETA { XR_LOCAL_DIMMING_MODE_OFF_META = 0, XR_LOCAL_DIMMING_MODE_ON_META = 1, XR_LOCAL_DIMMING_MODE_MAX_ENUM_META = 0x7FFFFFFF } XrLocalDimmingModeMETA; // XrLocalDimmingFrameEndInfoMETA extends XrFrameEndInfo typedef struct XrLocalDimmingFrameEndInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrLocalDimmingModeMETA localDimmingMode; } XrLocalDimmingFrameEndInfoMETA; #define XR_META_virtual_keyboard 1 XR_DEFINE_HANDLE(XrVirtualKeyboardMETA) #define XR_MAX_VIRTUAL_KEYBOARD_COMMIT_TEXT_SIZE_META 3992 #define XR_META_virtual_keyboard_SPEC_VERSION 1 #define XR_META_VIRTUAL_KEYBOARD_EXTENSION_NAME "XR_META_virtual_keyboard" typedef enum XrVirtualKeyboardLocationTypeMETA { XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_CUSTOM_META = 0, XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_FAR_META = 1, XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_DIRECT_META = 2, XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_MAX_ENUM_META = 0x7FFFFFFF } XrVirtualKeyboardLocationTypeMETA; typedef enum XrVirtualKeyboardInputSourceMETA { XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_RAY_LEFT_META = 1, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_RAY_RIGHT_META = 2, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_RAY_LEFT_META = 3, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_RAY_RIGHT_META = 4, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_DIRECT_LEFT_META = 5, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_DIRECT_RIGHT_META = 6, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_DIRECT_INDEX_TIP_LEFT_META = 7, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_DIRECT_INDEX_TIP_RIGHT_META = 8, XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_MAX_ENUM_META = 0x7FFFFFFF } XrVirtualKeyboardInputSourceMETA; typedef XrFlags64 XrVirtualKeyboardInputStateFlagsMETA; // Flag bits for XrVirtualKeyboardInputStateFlagsMETA static const XrVirtualKeyboardInputStateFlagsMETA XR_VIRTUAL_KEYBOARD_INPUT_STATE_PRESSED_BIT_META = 0x00000001; // XrSystemVirtualKeyboardPropertiesMETA extends XrSystemProperties typedef struct XrSystemVirtualKeyboardPropertiesMETA { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsVirtualKeyboard; } XrSystemVirtualKeyboardPropertiesMETA; typedef struct XrVirtualKeyboardCreateInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; } XrVirtualKeyboardCreateInfoMETA; typedef struct XrVirtualKeyboardSpaceCreateInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardLocationTypeMETA locationType; XrSpace space; XrPosef poseInSpace; } XrVirtualKeyboardSpaceCreateInfoMETA; typedef struct XrVirtualKeyboardLocationInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardLocationTypeMETA locationType; XrSpace space; XrPosef poseInSpace; float scale; } XrVirtualKeyboardLocationInfoMETA; typedef struct XrVirtualKeyboardModelVisibilitySetInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 visible; } XrVirtualKeyboardModelVisibilitySetInfoMETA; typedef struct XrVirtualKeyboardAnimationStateMETA { XrStructureType type; void *XR_MAY_ALIAS next; int32_t animationIndex; float fraction; } XrVirtualKeyboardAnimationStateMETA; typedef struct XrVirtualKeyboardModelAnimationStatesMETA { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t stateCapacityInput; uint32_t stateCountOutput; XrVirtualKeyboardAnimationStateMETA *states; } XrVirtualKeyboardModelAnimationStatesMETA; typedef struct XrVirtualKeyboardTextureDataMETA { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t textureWidth; uint32_t textureHeight; uint32_t bufferCapacityInput; uint32_t bufferCountOutput; uint8_t *buffer; } XrVirtualKeyboardTextureDataMETA; typedef struct XrVirtualKeyboardInputInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardInputSourceMETA inputSource; XrSpace inputSpace; XrPosef inputPoseInSpace; XrVirtualKeyboardInputStateFlagsMETA inputState; } XrVirtualKeyboardInputInfoMETA; typedef struct XrVirtualKeyboardTextContextChangeInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; const char *textContext; } XrVirtualKeyboardTextContextChangeInfoMETA; typedef struct XrEventDataVirtualKeyboardCommitTextMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardMETA keyboard; char text[XR_MAX_VIRTUAL_KEYBOARD_COMMIT_TEXT_SIZE_META]; } XrEventDataVirtualKeyboardCommitTextMETA; typedef struct XrEventDataVirtualKeyboardBackspaceMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardMETA keyboard; } XrEventDataVirtualKeyboardBackspaceMETA; typedef struct XrEventDataVirtualKeyboardEnterMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardMETA keyboard; } XrEventDataVirtualKeyboardEnterMETA; typedef struct XrEventDataVirtualKeyboardShownMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardMETA keyboard; } XrEventDataVirtualKeyboardShownMETA; typedef struct XrEventDataVirtualKeyboardHiddenMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrVirtualKeyboardMETA keyboard; } XrEventDataVirtualKeyboardHiddenMETA; typedef XrResult (XRAPI_PTR *PFN_xrCreateVirtualKeyboardMETA)(XrSession session, const XrVirtualKeyboardCreateInfoMETA *createInfo, XrVirtualKeyboardMETA *keyboard); typedef XrResult (XRAPI_PTR *PFN_xrDestroyVirtualKeyboardMETA)(XrVirtualKeyboardMETA keyboard); typedef XrResult (XRAPI_PTR *PFN_xrCreateVirtualKeyboardSpaceMETA)(XrSession session, XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardSpaceCreateInfoMETA *createInfo, XrSpace *keyboardSpace); typedef XrResult (XRAPI_PTR *PFN_xrSuggestVirtualKeyboardLocationMETA)( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardLocationInfoMETA *locationInfo); typedef XrResult (XRAPI_PTR *PFN_xrGetVirtualKeyboardScaleMETA)(XrVirtualKeyboardMETA keyboard, float *scale); typedef XrResult (XRAPI_PTR *PFN_xrSetVirtualKeyboardModelVisibilityMETA)( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardModelVisibilitySetInfoMETA *modelVisibility); typedef XrResult (XRAPI_PTR *PFN_xrGetVirtualKeyboardModelAnimationStatesMETA)( XrVirtualKeyboardMETA keyboard, XrVirtualKeyboardModelAnimationStatesMETA *animationStates); typedef XrResult (XRAPI_PTR *PFN_xrGetVirtualKeyboardDirtyTexturesMETA)( XrVirtualKeyboardMETA keyboard, uint32_t textureIdCapacityInput, uint32_t *textureIdCountOutput, uint64_t *textureIds); typedef XrResult (XRAPI_PTR *PFN_xrGetVirtualKeyboardTextureDataMETA)( XrVirtualKeyboardMETA keyboard, uint64_t textureId, XrVirtualKeyboardTextureDataMETA *textureData); typedef XrResult (XRAPI_PTR *PFN_xrSendVirtualKeyboardInputMETA)(XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardInputInfoMETA *info, XrPosef *interactorRootPose); typedef XrResult (XRAPI_PTR *PFN_xrChangeVirtualKeyboardTextContextMETA)( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardTextContextChangeInfoMETA *changeInfo); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateVirtualKeyboardMETA( XrSession session, const XrVirtualKeyboardCreateInfoMETA* createInfo, XrVirtualKeyboardMETA* keyboard); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyVirtualKeyboardMETA( XrVirtualKeyboardMETA keyboard); XRAPI_ATTR XrResult XRAPI_CALL xrCreateVirtualKeyboardSpaceMETA( XrSession session, XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardSpaceCreateInfoMETA* createInfo, XrSpace* keyboardSpace); XRAPI_ATTR XrResult XRAPI_CALL xrSuggestVirtualKeyboardLocationMETA( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardLocationInfoMETA* locationInfo); XRAPI_ATTR XrResult XRAPI_CALL xrGetVirtualKeyboardScaleMETA( XrVirtualKeyboardMETA keyboard, float* scale); XRAPI_ATTR XrResult XRAPI_CALL xrSetVirtualKeyboardModelVisibilityMETA( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardModelVisibilitySetInfoMETA* modelVisibility); XRAPI_ATTR XrResult XRAPI_CALL xrGetVirtualKeyboardModelAnimationStatesMETA( XrVirtualKeyboardMETA keyboard, XrVirtualKeyboardModelAnimationStatesMETA* animationStates); XRAPI_ATTR XrResult XRAPI_CALL xrGetVirtualKeyboardDirtyTexturesMETA( XrVirtualKeyboardMETA keyboard, uint32_t textureIdCapacityInput, uint32_t* textureIdCountOutput, uint64_t* textureIds); XRAPI_ATTR XrResult XRAPI_CALL xrGetVirtualKeyboardTextureDataMETA( XrVirtualKeyboardMETA keyboard, uint64_t textureId, XrVirtualKeyboardTextureDataMETA* textureData); XRAPI_ATTR XrResult XRAPI_CALL xrSendVirtualKeyboardInputMETA( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardInputInfoMETA* info, XrPosef* interactorRootPose); XRAPI_ATTR XrResult XRAPI_CALL xrChangeVirtualKeyboardTextContextMETA( XrVirtualKeyboardMETA keyboard, const XrVirtualKeyboardTextContextChangeInfoMETA* changeInfo); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_OCULUS_external_camera 1 #define XR_MAX_EXTERNAL_CAMERA_NAME_SIZE_OCULUS 32 #define XR_OCULUS_external_camera_SPEC_VERSION 1 #define XR_OCULUS_EXTERNAL_CAMERA_EXTENSION_NAME "XR_OCULUS_external_camera" typedef enum XrExternalCameraAttachedToDeviceOCULUS { XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_NONE_OCULUS = 0, XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_HMD_OCULUS = 1, XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_LTOUCH_OCULUS = 2, XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_RTOUCH_OCULUS = 3, XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_MAX_ENUM_OCULUS = 0x7FFFFFFF } XrExternalCameraAttachedToDeviceOCULUS; typedef XrFlags64 XrExternalCameraStatusFlagsOCULUS; // Flag bits for XrExternalCameraStatusFlagsOCULUS static const XrExternalCameraStatusFlagsOCULUS XR_EXTERNAL_CAMERA_STATUS_CONNECTED_BIT_OCULUS = 0x00000001; static const XrExternalCameraStatusFlagsOCULUS XR_EXTERNAL_CAMERA_STATUS_CALIBRATING_BIT_OCULUS = 0x00000002; static const XrExternalCameraStatusFlagsOCULUS XR_EXTERNAL_CAMERA_STATUS_CALIBRATION_FAILED_BIT_OCULUS = 0x00000004; static const XrExternalCameraStatusFlagsOCULUS XR_EXTERNAL_CAMERA_STATUS_CALIBRATED_BIT_OCULUS = 0x00000008; static const XrExternalCameraStatusFlagsOCULUS XR_EXTERNAL_CAMERA_STATUS_CAPTURING_BIT_OCULUS = 0x00000010; typedef struct XrExternalCameraIntrinsicsOCULUS { XrTime lastChangeTime; XrFovf fov; float virtualNearPlaneDistance; float virtualFarPlaneDistance; XrExtent2Di imageSensorPixelResolution; } XrExternalCameraIntrinsicsOCULUS; typedef struct XrExternalCameraExtrinsicsOCULUS { XrTime lastChangeTime; XrExternalCameraStatusFlagsOCULUS cameraStatusFlags; XrExternalCameraAttachedToDeviceOCULUS attachedToDevice; XrPosef relativePose; } XrExternalCameraExtrinsicsOCULUS; typedef struct XrExternalCameraOCULUS { XrStructureType type; const void *XR_MAY_ALIAS next; char name[XR_MAX_EXTERNAL_CAMERA_NAME_SIZE_OCULUS]; XrExternalCameraIntrinsicsOCULUS intrinsics; XrExternalCameraExtrinsicsOCULUS extrinsics; } XrExternalCameraOCULUS; typedef XrResult (XRAPI_PTR *PFN_xrEnumerateExternalCamerasOCULUS)(XrSession session, uint32_t cameraCapacityInput, uint32_t *cameraCountOutput, XrExternalCameraOCULUS *cameras); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateExternalCamerasOCULUS( XrSession session, uint32_t cameraCapacityInput, uint32_t* cameraCountOutput, XrExternalCameraOCULUS* cameras); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_META_performance_metrics 1 #define XR_META_performance_metrics_SPEC_VERSION 2 #define XR_META_PERFORMANCE_METRICS_EXTENSION_NAME "XR_META_performance_metrics" typedef enum XrPerformanceMetricsCounterUnitMETA { XR_PERFORMANCE_METRICS_COUNTER_UNIT_GENERIC_META = 0, XR_PERFORMANCE_METRICS_COUNTER_UNIT_PERCENTAGE_META = 1, XR_PERFORMANCE_METRICS_COUNTER_UNIT_MILLISECONDS_META = 2, XR_PERFORMANCE_METRICS_COUNTER_UNIT_BYTES_META = 3, XR_PERFORMANCE_METRICS_COUNTER_UNIT_HERTZ_META = 4, XR_PERFORMANCE_METRICS_COUNTER_UNIT_MAX_ENUM_META = 0x7FFFFFFF } XrPerformanceMetricsCounterUnitMETA; typedef XrFlags64 XrPerformanceMetricsCounterFlagsMETA; // Flag bits for XrPerformanceMetricsCounterFlagsMETA static const XrPerformanceMetricsCounterFlagsMETA XR_PERFORMANCE_METRICS_COUNTER_ANY_VALUE_VALID_BIT_META = 0x00000001; static const XrPerformanceMetricsCounterFlagsMETA XR_PERFORMANCE_METRICS_COUNTER_UINT_VALUE_VALID_BIT_META = 0x00000002; static const XrPerformanceMetricsCounterFlagsMETA XR_PERFORMANCE_METRICS_COUNTER_FLOAT_VALUE_VALID_BIT_META = 0x00000004; typedef struct XrPerformanceMetricsStateMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrBool32 enabled; } XrPerformanceMetricsStateMETA; typedef struct XrPerformanceMetricsCounterMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrPerformanceMetricsCounterFlagsMETA counterFlags; XrPerformanceMetricsCounterUnitMETA counterUnit; uint32_t uintValue; float floatValue; } XrPerformanceMetricsCounterMETA; typedef XrResult (XRAPI_PTR *PFN_xrEnumeratePerformanceMetricsCounterPathsMETA)(XrInstance instance, uint32_t counterPathCapacityInput, uint32_t *counterPathCountOutput, XrPath *counterPaths); typedef XrResult (XRAPI_PTR *PFN_xrSetPerformanceMetricsStateMETA)(XrSession session, const XrPerformanceMetricsStateMETA *state); typedef XrResult (XRAPI_PTR *PFN_xrGetPerformanceMetricsStateMETA)(XrSession session, XrPerformanceMetricsStateMETA *state); typedef XrResult (XRAPI_PTR *PFN_xrQueryPerformanceMetricsCounterMETA)(XrSession session, XrPath counterPath, XrPerformanceMetricsCounterMETA *counter); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrEnumeratePerformanceMetricsCounterPathsMETA( XrInstance instance, uint32_t counterPathCapacityInput, uint32_t* counterPathCountOutput, XrPath* counterPaths); XRAPI_ATTR XrResult XRAPI_CALL xrSetPerformanceMetricsStateMETA( XrSession session, const XrPerformanceMetricsStateMETA* state); XRAPI_ATTR XrResult XRAPI_CALL xrGetPerformanceMetricsStateMETA( XrSession session, XrPerformanceMetricsStateMETA* state); XRAPI_ATTR XrResult XRAPI_CALL xrQueryPerformanceMetricsCounterMETA( XrSession session, XrPath counterPath, XrPerformanceMetricsCounterMETA* counter); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_spatial_entity_storage_batch 1 #define XR_FB_spatial_entity_storage_batch_SPEC_VERSION 1 #define XR_FB_SPATIAL_ENTITY_STORAGE_BATCH_EXTENSION_NAME "XR_FB_spatial_entity_storage_batch" typedef struct XrSpaceListSaveInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t spaceCount; XrSpace *spaces; XrSpaceStorageLocationFB location; } XrSpaceListSaveInfoFB; typedef struct XrEventDataSpaceListSaveCompleteFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAsyncRequestIdFB requestId; XrResult result; } XrEventDataSpaceListSaveCompleteFB; typedef XrResult (XRAPI_PTR *PFN_xrSaveSpaceListFB)(XrSession session, const XrSpaceListSaveInfoFB *info, XrAsyncRequestIdFB *requestId); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSaveSpaceListFB( XrSession session, const XrSpaceListSaveInfoFB* info, XrAsyncRequestIdFB* requestId); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_FB_spatial_entity_user 1 typedef uint64_t XrSpaceUserIdFB; #define XR_FB_spatial_entity_user_SPEC_VERSION 1 #define XR_FB_SPATIAL_ENTITY_USER_EXTENSION_NAME "XR_FB_spatial_entity_user" typedef struct XrSpaceUserCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpaceUserIdFB userId; } XrSpaceUserCreateInfoFB; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpaceUserFB)(XrSession session, const XrSpaceUserCreateInfoFB *info, XrSpaceUserFB *user); typedef XrResult (XRAPI_PTR *PFN_xrGetSpaceUserIdFB)(XrSpaceUserFB user, XrSpaceUserIdFB *userId); typedef XrResult (XRAPI_PTR *PFN_xrDestroySpaceUserFB)(XrSpaceUserFB user); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpaceUserFB( XrSession session, const XrSpaceUserCreateInfoFB* info, XrSpaceUserFB* user); XRAPI_ATTR XrResult XRAPI_CALL xrGetSpaceUserIdFB( XrSpaceUserFB user, XrSpaceUserIdFB* userId); XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpaceUserFB( XrSpaceUserFB user); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_META_headset_id 1 #define XR_META_headset_id_SPEC_VERSION 1 #define XR_META_HEADSET_ID_EXTENSION_NAME "XR_META_headset_id" // XrSystemHeadsetIdPropertiesMETA extends XrSystemProperties typedef struct XrSystemHeadsetIdPropertiesMETA { XrStructureType type; void *XR_MAY_ALIAS next; XrUuidEXT id; } XrSystemHeadsetIdPropertiesMETA; #define XR_META_passthrough_color_lut 1 XR_DEFINE_HANDLE(XrPassthroughColorLutMETA) #define XR_META_passthrough_color_lut_SPEC_VERSION 1 #define XR_META_PASSTHROUGH_COLOR_LUT_EXTENSION_NAME "XR_META_passthrough_color_lut" typedef enum XrPassthroughColorLutChannelsMETA { XR_PASSTHROUGH_COLOR_LUT_CHANNELS_RGB_META = 1, XR_PASSTHROUGH_COLOR_LUT_CHANNELS_RGBA_META = 2, XR_PASSTHROUGH_COLOR_LUT_CHANNELS_MAX_ENUM_META = 0x7FFFFFFF } XrPassthroughColorLutChannelsMETA; typedef struct XrPassthroughColorLutDataMETA { uint32_t bufferSize; const uint8_t *buffer; } XrPassthroughColorLutDataMETA; typedef struct XrPassthroughColorLutCreateInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughColorLutChannelsMETA channels; uint32_t resolution; XrPassthroughColorLutDataMETA data; } XrPassthroughColorLutCreateInfoMETA; typedef struct XrPassthroughColorLutUpdateInfoMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughColorLutDataMETA data; } XrPassthroughColorLutUpdateInfoMETA; // XrPassthroughColorMapLutMETA extends XrPassthroughStyleFB typedef struct XrPassthroughColorMapLutMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughColorLutMETA colorLut; float weight; } XrPassthroughColorMapLutMETA; // XrPassthroughColorMapInterpolatedLutMETA extends XrPassthroughStyleFB typedef struct XrPassthroughColorMapInterpolatedLutMETA { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughColorLutMETA sourceColorLut; XrPassthroughColorLutMETA targetColorLut; float weight; } XrPassthroughColorMapInterpolatedLutMETA; // XrSystemPassthroughColorLutPropertiesMETA extends XrSystemProperties typedef struct XrSystemPassthroughColorLutPropertiesMETA { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t maxColorLutResolution; } XrSystemPassthroughColorLutPropertiesMETA; typedef XrResult (XRAPI_PTR *PFN_xrCreatePassthroughColorLutMETA)(XrPassthroughFB passthrough, const XrPassthroughColorLutCreateInfoMETA *createInfo, XrPassthroughColorLutMETA *colorLut); typedef XrResult (XRAPI_PTR *PFN_xrDestroyPassthroughColorLutMETA)( XrPassthroughColorLutMETA colorLut); typedef XrResult (XRAPI_PTR *PFN_xrUpdatePassthroughColorLutMETA)( XrPassthroughColorLutMETA colorLut, const XrPassthroughColorLutUpdateInfoMETA *updateInfo); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreatePassthroughColorLutMETA( XrPassthroughFB passthrough, const XrPassthroughColorLutCreateInfoMETA* createInfo, XrPassthroughColorLutMETA* colorLut); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPassthroughColorLutMETA( XrPassthroughColorLutMETA colorLut); XRAPI_ATTR XrResult XRAPI_CALL xrUpdatePassthroughColorLutMETA( XrPassthroughColorLutMETA colorLut, const XrPassthroughColorLutUpdateInfoMETA* updateInfo); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_uuid 1 #define XR_EXT_uuid_SPEC_VERSION 1 #define XR_EXT_UUID_EXTENSION_NAME "XR_EXT_uuid" #define XR_EXT_hand_interaction 1 #define XR_EXT_hand_interaction_SPEC_VERSION 1 #define XR_EXT_HAND_INTERACTION_EXTENSION_NAME "XR_EXT_hand_interaction" #define XR_QCOM_tracking_optimization_settings 1 #define XR_QCOM_tracking_optimization_settings_SPEC_VERSION 1 #define XR_QCOM_TRACKING_OPTIMIZATION_SETTINGS_EXTENSION_NAME "XR_QCOM_tracking_optimization_settings" typedef enum XrTrackingOptimizationSettingsDomainQCOM { XR_TRACKING_OPTIMIZATION_SETTINGS_DOMAIN_ALL_QCOM = 1, XR_TRACKING_OPTIMIZATION_SETTINGS_DOMAIN_MAX_ENUM_QCOM = 0x7FFFFFFF } XrTrackingOptimizationSettingsDomainQCOM; typedef enum XrTrackingOptimizationSettingsHintQCOM { XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_NONE_QCOM = 0, XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_LONG_RANGE_PRIORIZATION_QCOM = 1, XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_CLOSE_RANGE_PRIORIZATION_QCOM = 2, XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_LOW_POWER_PRIORIZATION_QCOM = 3, XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_HIGH_POWER_PRIORIZATION_QCOM = 4, XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_MAX_ENUM_QCOM = 0x7FFFFFFF } XrTrackingOptimizationSettingsHintQCOM; typedef XrResult (XRAPI_PTR *PFN_xrSetTrackingOptimizationSettingsHintQCOM)(XrSession session, XrTrackingOptimizationSettingsDomainQCOM domain, XrTrackingOptimizationSettingsHintQCOM hint); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetTrackingOptimizationSettingsHintQCOM( XrSession session, XrTrackingOptimizationSettingsDomainQCOM domain, XrTrackingOptimizationSettingsHintQCOM hint); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HTC_passthrough 1 XR_DEFINE_HANDLE(XrPassthroughHTC) #define XR_HTC_passthrough_SPEC_VERSION 1 #define XR_HTC_PASSTHROUGH_EXTENSION_NAME "XR_HTC_passthrough" typedef enum XrPassthroughFormHTC { XR_PASSTHROUGH_FORM_PLANAR_HTC = 0, XR_PASSTHROUGH_FORM_PROJECTED_HTC = 1, XR_PASSTHROUGH_FORM_MAX_ENUM_HTC = 0x7FFFFFFF } XrPassthroughFormHTC; typedef struct XrPassthroughCreateInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrPassthroughFormHTC form; } XrPassthroughCreateInfoHTC; typedef struct XrPassthroughColorHTC { XrStructureType type; const void *XR_MAY_ALIAS next; float alpha; } XrPassthroughColorHTC; // XrPassthroughMeshTransformInfoHTC extends XrCompositionLayerPassthroughHTC typedef struct XrPassthroughMeshTransformInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t vertexCount; const XrVector3f *vertices; uint32_t indexCount; const uint32_t *indices; XrSpace baseSpace; XrTime time; XrPosef pose; XrVector3f scale; } XrPassthroughMeshTransformInfoHTC; typedef struct XrCompositionLayerPassthroughHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrCompositionLayerFlags layerFlags; XrSpace space; XrPassthroughHTC passthrough; XrPassthroughColorHTC color; } XrCompositionLayerPassthroughHTC; typedef XrResult (XRAPI_PTR *PFN_xrCreatePassthroughHTC)(XrSession session, const XrPassthroughCreateInfoHTC *createInfo, XrPassthroughHTC *passthrough); typedef XrResult (XRAPI_PTR *PFN_xrDestroyPassthroughHTC)(XrPassthroughHTC passthrough); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreatePassthroughHTC( XrSession session, const XrPassthroughCreateInfoHTC* createInfo, XrPassthroughHTC* passthrough); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPassthroughHTC( XrPassthroughHTC passthrough); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_HTC_foveation 1 #define XR_HTC_foveation_SPEC_VERSION 1 #define XR_HTC_FOVEATION_EXTENSION_NAME "XR_HTC_foveation" typedef enum XrFoveationModeHTC { XR_FOVEATION_MODE_DISABLE_HTC = 0, XR_FOVEATION_MODE_FIXED_HTC = 1, XR_FOVEATION_MODE_DYNAMIC_HTC = 2, XR_FOVEATION_MODE_CUSTOM_HTC = 3, XR_FOVEATION_MODE_MAX_ENUM_HTC = 0x7FFFFFFF } XrFoveationModeHTC; typedef enum XrFoveationLevelHTC { XR_FOVEATION_LEVEL_NONE_HTC = 0, XR_FOVEATION_LEVEL_LOW_HTC = 1, XR_FOVEATION_LEVEL_MEDIUM_HTC = 2, XR_FOVEATION_LEVEL_HIGH_HTC = 3, XR_FOVEATION_LEVEL_MAX_ENUM_HTC = 0x7FFFFFFF } XrFoveationLevelHTC; typedef XrFlags64 XrFoveationDynamicFlagsHTC; // Flag bits for XrFoveationDynamicFlagsHTC static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_BIT_HTC = 0x00000001; static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_CLEAR_FOV_ENABLED_BIT_HTC = 0x00000002; static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_FOCAL_CENTER_OFFSET_ENABLED_BIT_HTC = 0x00000004; typedef struct XrFoveationApplyInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrFoveationModeHTC mode; uint32_t subImageCount; XrSwapchainSubImage *subImages; } XrFoveationApplyInfoHTC; typedef struct XrFoveationConfigurationHTC { XrFoveationLevelHTC level; float clearFovDegree; XrVector2f focalCenterOffset; } XrFoveationConfigurationHTC; // XrFoveationDynamicModeInfoHTC extends XrFoveationApplyInfoHTC typedef struct XrFoveationDynamicModeInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; XrFoveationDynamicFlagsHTC dynamicFlags; } XrFoveationDynamicModeInfoHTC; // XrFoveationCustomModeInfoHTC extends XrFoveationApplyInfoHTC typedef struct XrFoveationCustomModeInfoHTC { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t configCount; const XrFoveationConfigurationHTC *configs; } XrFoveationCustomModeInfoHTC; typedef XrResult (XRAPI_PTR *PFN_xrApplyFoveationHTC)(XrSession session, const XrFoveationApplyInfoHTC *applyInfo); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrApplyFoveationHTC( XrSession session, const XrFoveationApplyInfoHTC* applyInfo); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_EXT_active_action_set_priority 1 #define XR_EXT_active_action_set_priority_SPEC_VERSION 1 #define XR_EXT_ACTIVE_ACTION_SET_PRIORITY_EXTENSION_NAME "XR_EXT_active_action_set_priority" typedef struct XrActiveActionSetPriorityEXT { XrActionSet actionSet; uint32_t priorityOverride; } XrActiveActionSetPriorityEXT; // XrActiveActionSetPrioritiesEXT extends XrActionsSyncInfo typedef struct XrActiveActionSetPrioritiesEXT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t actionSetPriorityCount; const XrActiveActionSetPriorityEXT *actionSetPriorities; } XrActiveActionSetPrioritiesEXT; #define XR_MNDX_force_feedback_curl 1 #define XR_MNDX_force_feedback_curl_SPEC_VERSION 1 #define XR_MNDX_FORCE_FEEDBACK_CURL_EXTENSION_NAME "XR_MNDX_force_feedback_curl" typedef enum XrForceFeedbackCurlLocationMNDX { XR_FORCE_FEEDBACK_CURL_LOCATION_THUMB_CURL_MNDX = 0, XR_FORCE_FEEDBACK_CURL_LOCATION_INDEX_CURL_MNDX = 1, XR_FORCE_FEEDBACK_CURL_LOCATION_MIDDLE_CURL_MNDX = 2, XR_FORCE_FEEDBACK_CURL_LOCATION_RING_CURL_MNDX = 3, XR_FORCE_FEEDBACK_CURL_LOCATION_LITTLE_CURL_MNDX = 4, XR_FORCE_FEEDBACK_CURL_LOCATION_MAX_ENUM_MNDX = 0x7FFFFFFF } XrForceFeedbackCurlLocationMNDX; // XrSystemForceFeedbackCurlPropertiesMNDX extends XrSystemProperties typedef struct XrSystemForceFeedbackCurlPropertiesMNDX { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 supportsForceFeedbackCurl; } XrSystemForceFeedbackCurlPropertiesMNDX; typedef struct XrForceFeedbackCurlApplyLocationMNDX { XrForceFeedbackCurlLocationMNDX location; float value; } XrForceFeedbackCurlApplyLocationMNDX; typedef struct XrForceFeedbackCurlApplyLocationsMNDX { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t locationCount; XrForceFeedbackCurlApplyLocationMNDX *locations; } XrForceFeedbackCurlApplyLocationsMNDX; typedef XrResult (XRAPI_PTR *PFN_xrApplyForceFeedbackCurlMNDX)(XrHandTrackerEXT handTracker, const XrForceFeedbackCurlApplyLocationsMNDX *locations); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrApplyForceFeedbackCurlMNDX( XrHandTrackerEXT handTracker, const XrForceFeedbackCurlApplyLocationsMNDX* locations); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_BD_controller_interaction 1 #define XR_BD_controller_interaction_SPEC_VERSION 1 #define XR_BD_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_BD_controller_interaction" #define XR_EXT_local_floor 1 #define XR_EXT_local_floor_SPEC_VERSION 1 #define XR_EXT_LOCAL_FLOOR_EXTENSION_NAME "XR_EXT_local_floor" #define XR_EXT_hand_tracking_data_source 1 #define XR_EXT_hand_tracking_data_source_SPEC_VERSION 1 #define XR_EXT_HAND_TRACKING_DATA_SOURCE_EXTENSION_NAME "XR_EXT_hand_tracking_data_source" typedef enum XrHandTrackingDataSourceEXT { XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT = 1, XR_HAND_TRACKING_DATA_SOURCE_CONTROLLER_EXT = 2, XR_HAND_TRACKING_DATA_SOURCE_MAX_ENUM_EXT = 0x7FFFFFFF } XrHandTrackingDataSourceEXT; // XrHandTrackingDataSourceInfoEXT extends XrHandTrackerCreateInfoEXT typedef struct XrHandTrackingDataSourceInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; uint32_t requestedDataSourceCount; XrHandTrackingDataSourceEXT *requestedDataSources; } XrHandTrackingDataSourceInfoEXT; // XrHandTrackingDataSourceStateEXT extends XrHandJointLocationsEXT typedef struct XrHandTrackingDataSourceStateEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrBool32 isActive; XrHandTrackingDataSourceEXT dataSource; } XrHandTrackingDataSourceStateEXT; #define XR_EXT_plane_detection 1 XR_DEFINE_HANDLE(XrPlaneDetectorEXT) #define XR_EXT_plane_detection_SPEC_VERSION 1 #define XR_EXT_PLANE_DETECTION_EXTENSION_NAME "XR_EXT_plane_detection" typedef enum XrPlaneDetectorOrientationEXT { XR_PLANE_DETECTOR_ORIENTATION_HORIZONTAL_UPWARD_EXT = 0, XR_PLANE_DETECTOR_ORIENTATION_HORIZONTAL_DOWNWARD_EXT = 1, XR_PLANE_DETECTOR_ORIENTATION_VERTICAL_EXT = 2, XR_PLANE_DETECTOR_ORIENTATION_ARBITRARY_EXT = 3, XR_PLANE_DETECTOR_ORIENTATION_MAX_ENUM_EXT = 0x7FFFFFFF } XrPlaneDetectorOrientationEXT; typedef enum XrPlaneDetectorSemanticTypeEXT { XR_PLANE_DETECTOR_SEMANTIC_TYPE_UNDEFINED_EXT = 0, XR_PLANE_DETECTOR_SEMANTIC_TYPE_CEILING_EXT = 1, XR_PLANE_DETECTOR_SEMANTIC_TYPE_FLOOR_EXT = 2, XR_PLANE_DETECTOR_SEMANTIC_TYPE_WALL_EXT = 3, XR_PLANE_DETECTOR_SEMANTIC_TYPE_PLATFORM_EXT = 4, XR_PLANE_DETECTOR_SEMANTIC_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF } XrPlaneDetectorSemanticTypeEXT; typedef enum XrPlaneDetectionStateEXT { XR_PLANE_DETECTION_STATE_NONE_EXT = 0, XR_PLANE_DETECTION_STATE_PENDING_EXT = 1, XR_PLANE_DETECTION_STATE_DONE_EXT = 2, XR_PLANE_DETECTION_STATE_ERROR_EXT = 3, XR_PLANE_DETECTION_STATE_FATAL_EXT = 4, XR_PLANE_DETECTION_STATE_MAX_ENUM_EXT = 0x7FFFFFFF } XrPlaneDetectionStateEXT; typedef XrFlags64 XrPlaneDetectionCapabilityFlagsEXT; // Flag bits for XrPlaneDetectionCapabilityFlagsEXT static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_PLANE_DETECTION_BIT_EXT = 0x00000001; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_PLANE_HOLES_BIT_EXT = 0x00000002; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_CEILING_BIT_EXT = 0x00000004; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_FLOOR_BIT_EXT = 0x00000008; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_WALL_BIT_EXT = 0x00000010; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_PLATFORM_BIT_EXT = 0x00000020; static const XrPlaneDetectionCapabilityFlagsEXT XR_PLANE_DETECTION_CAPABILITY_ORIENTATION_BIT_EXT = 0x00000040; typedef XrFlags64 XrPlaneDetectorFlagsEXT; // Flag bits for XrPlaneDetectorFlagsEXT static const XrPlaneDetectorFlagsEXT XR_PLANE_DETECTOR_ENABLE_CONTOUR_BIT_EXT = 0x00000001; // XrSystemPlaneDetectionPropertiesEXT extends XrSystemProperties typedef struct XrSystemPlaneDetectionPropertiesEXT { XrStructureType type; void *XR_MAY_ALIAS next; XrPlaneDetectionCapabilityFlagsEXT supportedFeatures; } XrSystemPlaneDetectionPropertiesEXT; typedef struct XrPlaneDetectorCreateInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrPlaneDetectorFlagsEXT flags; } XrPlaneDetectorCreateInfoEXT; typedef struct XrExtent3DfEXT { float width; float height; float depth; } XrExtent3DfEXT; typedef struct XrPlaneDetectorBeginInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; uint32_t orientationCount; const XrPlaneDetectorOrientationEXT *orientations; uint32_t semanticTypeCount; const XrPlaneDetectorSemanticTypeEXT *semanticTypes; uint32_t maxPlanes; float minArea; XrPosef boundingBoxPose; XrExtent3DfEXT boundingBoxExtent; } XrPlaneDetectorBeginInfoEXT; typedef struct XrPlaneDetectorGetInfoEXT { XrStructureType type; const void *XR_MAY_ALIAS next; XrSpace baseSpace; XrTime time; } XrPlaneDetectorGetInfoEXT; typedef struct XrPlaneDetectorLocationEXT { XrStructureType type; void *XR_MAY_ALIAS next; uint64_t planeId; XrSpaceLocationFlags locationFlags; XrPosef pose; XrExtent2Df extents; XrPlaneDetectorOrientationEXT orientation; XrPlaneDetectorSemanticTypeEXT semanticType; uint32_t polygonBufferCount; } XrPlaneDetectorLocationEXT; typedef struct XrPlaneDetectorLocationsEXT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t planeLocationCapacityInput; uint32_t planeLocationCountOutput; XrPlaneDetectorLocationEXT *planeLocations; } XrPlaneDetectorLocationsEXT; typedef struct XrPlaneDetectorPolygonBufferEXT { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t vertexCapacityInput; uint32_t vertexCountOutput; XrVector2f *vertices; } XrPlaneDetectorPolygonBufferEXT; typedef XrResult (XRAPI_PTR *PFN_xrCreatePlaneDetectorEXT)(XrSession session, const XrPlaneDetectorCreateInfoEXT *createInfo, XrPlaneDetectorEXT *planeDetector); typedef XrResult (XRAPI_PTR *PFN_xrDestroyPlaneDetectorEXT)(XrPlaneDetectorEXT planeDetector); typedef XrResult (XRAPI_PTR *PFN_xrBeginPlaneDetectionEXT)(XrPlaneDetectorEXT planeDetector, const XrPlaneDetectorBeginInfoEXT *beginInfo); typedef XrResult (XRAPI_PTR *PFN_xrGetPlaneDetectionStateEXT)(XrPlaneDetectorEXT planeDetector, XrPlaneDetectionStateEXT *state); typedef XrResult (XRAPI_PTR *PFN_xrGetPlaneDetectionsEXT)(XrPlaneDetectorEXT planeDetector, const XrPlaneDetectorGetInfoEXT *info, XrPlaneDetectorLocationsEXT *locations); typedef XrResult (XRAPI_PTR *PFN_xrGetPlanePolygonBufferEXT)(XrPlaneDetectorEXT planeDetector, uint64_t planeId, uint32_t polygonBufferIndex, XrPlaneDetectorPolygonBufferEXT *polygonBuffer); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreatePlaneDetectorEXT( XrSession session, const XrPlaneDetectorCreateInfoEXT* createInfo, XrPlaneDetectorEXT* planeDetector); XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPlaneDetectorEXT( XrPlaneDetectorEXT planeDetector); XRAPI_ATTR XrResult XRAPI_CALL xrBeginPlaneDetectionEXT( XrPlaneDetectorEXT planeDetector, const XrPlaneDetectorBeginInfoEXT* beginInfo); XRAPI_ATTR XrResult XRAPI_CALL xrGetPlaneDetectionStateEXT( XrPlaneDetectorEXT planeDetector, XrPlaneDetectionStateEXT* state); XRAPI_ATTR XrResult XRAPI_CALL xrGetPlaneDetectionsEXT( XrPlaneDetectorEXT planeDetector, const XrPlaneDetectorGetInfoEXT* info, XrPlaneDetectorLocationsEXT* locations); XRAPI_ATTR XrResult XRAPI_CALL xrGetPlanePolygonBufferEXT( XrPlaneDetectorEXT planeDetector, uint64_t planeId, uint32_t polygonBufferIndex, XrPlaneDetectorPolygonBufferEXT* polygonBuffer); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #define XR_OPPO_controller_interaction 1 #define XR_OPPO_controller_interaction_SPEC_VERSION 1 #define XR_OPPO_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_OPPO_controller_interaction" #ifdef __cplusplus } #endif #endif ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr_platform.h ================================================ #ifndef OPENXR_PLATFORM_H_ #define OPENXR_PLATFORM_H_ 1 /* ** Copyright 2017-2023 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ /* ** This header is generated from the Khronos OpenXR XML API Registry. ** */ #include "openxr.h" #ifdef XR_USE_PLATFORM_ANDROID #include #include "EGL/egl.h" #include "GLES/gl.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef XR_USE_PLATFORM_ANDROID #define XR_KHR_android_thread_settings 1 #define XR_KHR_android_thread_settings_SPEC_VERSION 5 #define XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME "XR_KHR_android_thread_settings" typedef enum XrAndroidThreadTypeKHR { XR_ANDROID_THREAD_TYPE_APPLICATION_MAIN_KHR = 1, XR_ANDROID_THREAD_TYPE_APPLICATION_WORKER_KHR = 2, XR_ANDROID_THREAD_TYPE_RENDERER_MAIN_KHR = 3, XR_ANDROID_THREAD_TYPE_RENDERER_WORKER_KHR = 4, XR_ANDROID_THREAD_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF } XrAndroidThreadTypeKHR; typedef XrResult (XRAPI_PTR *PFN_xrSetAndroidApplicationThreadKHR)(XrSession session, XrAndroidThreadTypeKHR threadType, uint32_t threadId); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrSetAndroidApplicationThreadKHR( XrSession session, XrAndroidThreadTypeKHR threadType, uint32_t threadId); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_PLATFORM_ANDROID #define XR_KHR_android_surface_swapchain 1 #define XR_KHR_android_surface_swapchain_SPEC_VERSION 4 #define XR_KHR_ANDROID_SURFACE_SWAPCHAIN_EXTENSION_NAME "XR_KHR_android_surface_swapchain" typedef XrResult (XRAPI_PTR *PFN_xrCreateSwapchainAndroidSurfaceKHR)(XrSession session, const XrSwapchainCreateInfo *info, XrSwapchain *swapchain, jobject *surface); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchainAndroidSurfaceKHR( XrSession session, const XrSwapchainCreateInfo* info, XrSwapchain* swapchain, jobject* surface); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_PLATFORM_ANDROID #define XR_KHR_android_create_instance 1 #define XR_KHR_android_create_instance_SPEC_VERSION 3 #define XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME "XR_KHR_android_create_instance" // XrInstanceCreateInfoAndroidKHR extends XrInstanceCreateInfo typedef struct XrInstanceCreateInfoAndroidKHR { XrStructureType type; const void *XR_MAY_ALIAS next; void *XR_MAY_ALIAS applicationVM; void *XR_MAY_ALIAS applicationActivity; } XrInstanceCreateInfoAndroidKHR; #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_KHR_vulkan_swapchain_format_list 1 #define XR_KHR_vulkan_swapchain_format_list_SPEC_VERSION 4 #define XR_KHR_VULKAN_SWAPCHAIN_FORMAT_LIST_EXTENSION_NAME "XR_KHR_vulkan_swapchain_format_list" typedef struct XrVulkanSwapchainFormatListCreateInfoKHR { XrStructureType type; const void* XR_MAY_ALIAS next; uint32_t viewFormatCount; const VkFormat* viewFormats; } XrVulkanSwapchainFormatListCreateInfoKHR; #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef XR_USE_GRAPHICS_API_OPENGL #define XR_KHR_opengl_enable 1 #define XR_KHR_opengl_enable_SPEC_VERSION 10 #define XR_KHR_OPENGL_ENABLE_EXTENSION_NAME "XR_KHR_opengl_enable" #ifdef XR_USE_PLATFORM_WIN32 // XrGraphicsBindingOpenGLWin32KHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingOpenGLWin32KHR { XrStructureType type; const void* XR_MAY_ALIAS next; HDC hDC; HGLRC hGLRC; } XrGraphicsBindingOpenGLWin32KHR; #endif // XR_USE_PLATFORM_WIN32 #ifdef XR_USE_PLATFORM_XLIB // XrGraphicsBindingOpenGLXlibKHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingOpenGLXlibKHR { XrStructureType type; const void* XR_MAY_ALIAS next; Display* xDisplay; uint32_t visualid; GLXFBConfig glxFBConfig; GLXDrawable glxDrawable; GLXContext glxContext; } XrGraphicsBindingOpenGLXlibKHR; #endif // XR_USE_PLATFORM_XLIB #ifdef XR_USE_PLATFORM_XCB // XrGraphicsBindingOpenGLXcbKHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingOpenGLXcbKHR { XrStructureType type; const void* XR_MAY_ALIAS next; xcb_connection_t* connection; uint32_t screenNumber; xcb_glx_fbconfig_t fbconfigid; xcb_visualid_t visualid; xcb_glx_drawable_t glxDrawable; xcb_glx_context_t glxContext; } XrGraphicsBindingOpenGLXcbKHR; #endif // XR_USE_PLATFORM_XCB #ifdef XR_USE_PLATFORM_WAYLAND // XrGraphicsBindingOpenGLWaylandKHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingOpenGLWaylandKHR { XrStructureType type; const void* XR_MAY_ALIAS next; struct wl_display* display; } XrGraphicsBindingOpenGLWaylandKHR; #endif // XR_USE_PLATFORM_WAYLAND typedef struct XrSwapchainImageOpenGLKHR { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t image; } XrSwapchainImageOpenGLKHR; typedef struct XrGraphicsRequirementsOpenGLKHR { XrStructureType type; void *XR_MAY_ALIAS next; XrVersion minApiVersionSupported; XrVersion maxApiVersionSupported; } XrGraphicsRequirementsOpenGLKHR; typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLKHR *graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLGraphicsRequirementsKHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLKHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_OPENGL */ #ifdef XR_USE_GRAPHICS_API_OPENGL_ES #define XR_KHR_opengl_es_enable 1 #define XR_KHR_opengl_es_enable_SPEC_VERSION 8 #define XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME "XR_KHR_opengl_es_enable" #ifdef XR_USE_PLATFORM_ANDROID // XrGraphicsBindingOpenGLESAndroidKHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingOpenGLESAndroidKHR { XrStructureType type; const void *XR_MAY_ALIAS next; EGLDisplay display; EGLConfig config; EGLContext context; } XrGraphicsBindingOpenGLESAndroidKHR; #endif // XR_USE_PLATFORM_ANDROID typedef struct XrSwapchainImageOpenGLESKHR { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t image; } XrSwapchainImageOpenGLESKHR; typedef struct XrGraphicsRequirementsOpenGLESKHR { XrStructureType type; void *XR_MAY_ALIAS next; XrVersion minApiVersionSupported; XrVersion maxApiVersionSupported; } XrGraphicsRequirementsOpenGLESKHR; typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLESGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLESKHR *graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLESGraphicsRequirementsKHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLESKHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_OPENGL_ES */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_KHR_vulkan_enable 1 #define XR_KHR_vulkan_enable_SPEC_VERSION 8 #define XR_KHR_VULKAN_ENABLE_EXTENSION_NAME "XR_KHR_vulkan_enable" // XrGraphicsBindingVulkanKHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingVulkanKHR { XrStructureType type; const void* XR_MAY_ALIAS next; VkInstance instance; VkPhysicalDevice physicalDevice; VkDevice device; uint32_t queueFamilyIndex; uint32_t queueIndex; } XrGraphicsBindingVulkanKHR; typedef struct XrSwapchainImageVulkanKHR { XrStructureType type; void* XR_MAY_ALIAS next; VkImage image; } XrSwapchainImageVulkanKHR; typedef struct XrGraphicsRequirementsVulkanKHR { XrStructureType type; void* XR_MAY_ALIAS next; XrVersion minApiVersionSupported; XrVersion maxApiVersionSupported; } XrGraphicsRequirementsVulkanKHR; typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanInstanceExtensionsKHR)(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanDeviceExtensionsKHR)(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDeviceKHR)(XrInstance instance, XrSystemId systemId, VkInstance vkInstance, VkPhysicalDevice* vkPhysicalDevice); typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanInstanceExtensionsKHR( XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanDeviceExtensionsKHR( XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsDeviceKHR( XrInstance instance, XrSystemId systemId, VkInstance vkInstance, VkPhysicalDevice* vkPhysicalDevice); XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirementsKHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef XR_USE_GRAPHICS_API_D3D11 #define XR_KHR_D3D11_enable 1 #define XR_KHR_D3D11_enable_SPEC_VERSION 9 #define XR_KHR_D3D11_ENABLE_EXTENSION_NAME "XR_KHR_D3D11_enable" // XrGraphicsBindingD3D11KHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingD3D11KHR { XrStructureType type; const void* XR_MAY_ALIAS next; ID3D11Device* device; } XrGraphicsBindingD3D11KHR; typedef struct XrSwapchainImageD3D11KHR { XrStructureType type; void* XR_MAY_ALIAS next; ID3D11Texture2D* texture; } XrSwapchainImageD3D11KHR; typedef struct XrGraphicsRequirementsD3D11KHR { XrStructureType type; void* XR_MAY_ALIAS next; LUID adapterLuid; D3D_FEATURE_LEVEL minFeatureLevel; } XrGraphicsRequirementsD3D11KHR; typedef XrResult (XRAPI_PTR *PFN_xrGetD3D11GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D11KHR* graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D11GraphicsRequirementsKHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D11KHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_D3D11 */ #ifdef XR_USE_GRAPHICS_API_D3D12 #define XR_KHR_D3D12_enable 1 #define XR_KHR_D3D12_enable_SPEC_VERSION 9 #define XR_KHR_D3D12_ENABLE_EXTENSION_NAME "XR_KHR_D3D12_enable" // XrGraphicsBindingD3D12KHR extends XrSessionCreateInfo typedef struct XrGraphicsBindingD3D12KHR { XrStructureType type; const void* XR_MAY_ALIAS next; ID3D12Device* device; ID3D12CommandQueue* queue; } XrGraphicsBindingD3D12KHR; typedef struct XrSwapchainImageD3D12KHR { XrStructureType type; void* XR_MAY_ALIAS next; ID3D12Resource* texture; } XrSwapchainImageD3D12KHR; typedef struct XrGraphicsRequirementsD3D12KHR { XrStructureType type; void* XR_MAY_ALIAS next; LUID adapterLuid; D3D_FEATURE_LEVEL minFeatureLevel; } XrGraphicsRequirementsD3D12KHR; typedef XrResult (XRAPI_PTR *PFN_xrGetD3D12GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D12KHR* graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D12GraphicsRequirementsKHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D12KHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_D3D12 */ #ifdef XR_USE_PLATFORM_WIN32 #define XR_KHR_win32_convert_performance_counter_time 1 #define XR_KHR_win32_convert_performance_counter_time_SPEC_VERSION 1 #define XR_KHR_WIN32_CONVERT_PERFORMANCE_COUNTER_TIME_EXTENSION_NAME "XR_KHR_win32_convert_performance_counter_time" typedef XrResult (XRAPI_PTR *PFN_xrConvertWin32PerformanceCounterToTimeKHR)(XrInstance instance, const LARGE_INTEGER* performanceCounter, XrTime* time); typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToWin32PerformanceCounterKHR)(XrInstance instance, XrTime time, LARGE_INTEGER* performanceCounter); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrConvertWin32PerformanceCounterToTimeKHR( XrInstance instance, const LARGE_INTEGER* performanceCounter, XrTime* time); XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToWin32PerformanceCounterKHR( XrInstance instance, XrTime time, LARGE_INTEGER* performanceCounter); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_WIN32 */ #ifdef XR_USE_TIMESPEC #define XR_KHR_convert_timespec_time 1 #define XR_KHR_convert_timespec_time_SPEC_VERSION 1 #define XR_KHR_CONVERT_TIMESPEC_TIME_EXTENSION_NAME "XR_KHR_convert_timespec_time" typedef XrResult (XRAPI_PTR *PFN_xrConvertTimespecTimeToTimeKHR)(XrInstance instance, const struct timespec* timespecTime, XrTime* time); typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToTimespecTimeKHR)(XrInstance instance, XrTime time, struct timespec* timespecTime); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimespecTimeToTimeKHR( XrInstance instance, const struct timespec* timespecTime, XrTime* time); XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToTimespecTimeKHR( XrInstance instance, XrTime time, struct timespec* timespecTime); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_TIMESPEC */ #ifdef XR_USE_PLATFORM_ANDROID #define XR_KHR_loader_init_android 1 #define XR_KHR_loader_init_android_SPEC_VERSION 1 #define XR_KHR_LOADER_INIT_ANDROID_EXTENSION_NAME "XR_KHR_loader_init_android" typedef struct XrLoaderInitInfoAndroidKHR { XrStructureType type; const void *XR_MAY_ALIAS next; void *XR_MAY_ALIAS applicationVM; void *XR_MAY_ALIAS applicationContext; } XrLoaderInitInfoAndroidKHR; #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_KHR_vulkan_enable2 1 #define XR_KHR_vulkan_enable2_SPEC_VERSION 2 #define XR_KHR_VULKAN_ENABLE2_EXTENSION_NAME "XR_KHR_vulkan_enable2" typedef XrFlags64 XrVulkanInstanceCreateFlagsKHR; // Flag bits for XrVulkanInstanceCreateFlagsKHR typedef XrFlags64 XrVulkanDeviceCreateFlagsKHR; // Flag bits for XrVulkanDeviceCreateFlagsKHR typedef struct XrVulkanInstanceCreateInfoKHR { XrStructureType type; const void* XR_MAY_ALIAS next; XrSystemId systemId; XrVulkanInstanceCreateFlagsKHR createFlags; PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; const VkInstanceCreateInfo* vulkanCreateInfo; const VkAllocationCallbacks* vulkanAllocator; } XrVulkanInstanceCreateInfoKHR; typedef struct XrVulkanDeviceCreateInfoKHR { XrStructureType type; const void* XR_MAY_ALIAS next; XrSystemId systemId; XrVulkanDeviceCreateFlagsKHR createFlags; PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; VkPhysicalDevice vulkanPhysicalDevice; const VkDeviceCreateInfo* vulkanCreateInfo; const VkAllocationCallbacks* vulkanAllocator; } XrVulkanDeviceCreateInfoKHR; typedef XrGraphicsBindingVulkanKHR XrGraphicsBindingVulkan2KHR; typedef struct XrVulkanGraphicsDeviceGetInfoKHR { XrStructureType type; const void* XR_MAY_ALIAS next; XrSystemId systemId; VkInstance vulkanInstance; } XrVulkanGraphicsDeviceGetInfoKHR; typedef XrSwapchainImageVulkanKHR XrSwapchainImageVulkan2KHR; typedef XrGraphicsRequirementsVulkanKHR XrGraphicsRequirementsVulkan2KHR; typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanInstanceKHR)(XrInstance instance, const XrVulkanInstanceCreateInfoKHR* createInfo, VkInstance* vulkanInstance, VkResult* vulkanResult); typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanDeviceKHR)(XrInstance instance, const XrVulkanDeviceCreateInfoKHR* createInfo, VkDevice* vulkanDevice, VkResult* vulkanResult); typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDevice2KHR)(XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR* getInfo, VkPhysicalDevice* vulkanPhysicalDevice); typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirements2KHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateVulkanInstanceKHR( XrInstance instance, const XrVulkanInstanceCreateInfoKHR* createInfo, VkInstance* vulkanInstance, VkResult* vulkanResult); XRAPI_ATTR XrResult XRAPI_CALL xrCreateVulkanDeviceKHR( XrInstance instance, const XrVulkanDeviceCreateInfoKHR* createInfo, VkDevice* vulkanDevice, VkResult* vulkanResult); XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsDevice2KHR( XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR* getInfo, VkPhysicalDevice* vulkanPhysicalDevice); XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirements2KHR( XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef XR_USE_PLATFORM_EGL #define XR_MNDX_egl_enable 1 #define XR_MNDX_egl_enable_SPEC_VERSION 1 #define XR_MNDX_EGL_ENABLE_EXTENSION_NAME "XR_MNDX_egl_enable" // XrGraphicsBindingEGLMNDX extends XrSessionCreateInfo typedef struct XrGraphicsBindingEGLMNDX { XrStructureType type; const void* XR_MAY_ALIAS next; PFNEGLGETPROCADDRESSPROC getProcAddress; EGLDisplay display; EGLConfig config; EGLContext context; } XrGraphicsBindingEGLMNDX; #endif /* XR_USE_PLATFORM_EGL */ #ifdef XR_USE_PLATFORM_WIN32 #define XR_MSFT_perception_anchor_interop 1 #define XR_MSFT_perception_anchor_interop_SPEC_VERSION 1 #define XR_MSFT_PERCEPTION_ANCHOR_INTEROP_EXTENSION_NAME "XR_MSFT_perception_anchor_interop" typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFromPerceptionAnchorMSFT)(XrSession session, IUnknown* perceptionAnchor, XrSpatialAnchorMSFT* anchor); typedef XrResult (XRAPI_PTR *PFN_xrTryGetPerceptionAnchorFromSpatialAnchorMSFT)(XrSession session, XrSpatialAnchorMSFT anchor, IUnknown** perceptionAnchor); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFromPerceptionAnchorMSFT( XrSession session, IUnknown* perceptionAnchor, XrSpatialAnchorMSFT* anchor); XRAPI_ATTR XrResult XRAPI_CALL xrTryGetPerceptionAnchorFromSpatialAnchorMSFT( XrSession session, XrSpatialAnchorMSFT anchor, IUnknown** perceptionAnchor); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_WIN32 */ #ifdef XR_USE_PLATFORM_WIN32 #define XR_MSFT_holographic_window_attachment 1 #define XR_MSFT_holographic_window_attachment_SPEC_VERSION 1 #define XR_MSFT_HOLOGRAPHIC_WINDOW_ATTACHMENT_EXTENSION_NAME "XR_MSFT_holographic_window_attachment" #ifdef XR_USE_PLATFORM_WIN32 // XrHolographicWindowAttachmentMSFT extends XrSessionCreateInfo typedef struct XrHolographicWindowAttachmentMSFT { XrStructureType type; const void* XR_MAY_ALIAS next; IUnknown* holographicSpace; IUnknown* coreWindow; } XrHolographicWindowAttachmentMSFT; #endif // XR_USE_PLATFORM_WIN32 #endif /* XR_USE_PLATFORM_WIN32 */ #ifdef XR_USE_PLATFORM_ANDROID #define XR_FB_android_surface_swapchain_create 1 #define XR_FB_android_surface_swapchain_create_SPEC_VERSION 1 #define XR_FB_ANDROID_SURFACE_SWAPCHAIN_CREATE_EXTENSION_NAME "XR_FB_android_surface_swapchain_create" typedef XrFlags64 XrAndroidSurfaceSwapchainFlagsFB; // Flag bits for XrAndroidSurfaceSwapchainFlagsFB static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_SYNCHRONOUS_BIT_FB = 0x00000001; static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_USE_TIMESTAMPS_BIT_FB = 0x00000002; #ifdef XR_USE_PLATFORM_ANDROID // XrAndroidSurfaceSwapchainCreateInfoFB extends XrSwapchainCreateInfo typedef struct XrAndroidSurfaceSwapchainCreateInfoFB { XrStructureType type; const void *XR_MAY_ALIAS next; XrAndroidSurfaceSwapchainFlagsFB createFlags; } XrAndroidSurfaceSwapchainCreateInfoFB; #endif // XR_USE_PLATFORM_ANDROID #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_PLATFORM_ML #define XR_ML_compat 1 #define XR_ML_compat_SPEC_VERSION 1 #define XR_ML_COMPAT_EXTENSION_NAME "XR_ML_compat" typedef struct XrCoordinateSpaceCreateInfoML { XrStructureType type; const void* XR_MAY_ALIAS next; MLCoordinateFrameUID cfuid; XrPosef poseInCoordinateSpace; } XrCoordinateSpaceCreateInfoML; typedef XrResult (XRAPI_PTR *PFN_xrCreateSpaceFromCoordinateFrameUIDML)(XrSession session, const XrCoordinateSpaceCreateInfoML *createInfo, XrSpace* space); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpaceFromCoordinateFrameUIDML( XrSession session, const XrCoordinateSpaceCreateInfoML * createInfo, XrSpace* space); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_ML */ #ifdef XR_USE_PLATFORM_WIN32 #define XR_OCULUS_audio_device_guid 1 #define XR_OCULUS_audio_device_guid_SPEC_VERSION 1 #define XR_OCULUS_AUDIO_DEVICE_GUID_EXTENSION_NAME "XR_OCULUS_audio_device_guid" #define XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS 128 typedef XrResult (XRAPI_PTR *PFN_xrGetAudioOutputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); typedef XrResult (XRAPI_PTR *PFN_xrGetAudioInputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); #ifndef XR_NO_PROTOTYPES #ifdef XR_EXTENSION_PROTOTYPES XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioOutputDeviceGuidOculus( XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioInputDeviceGuidOculus( XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); #endif /* XR_EXTENSION_PROTOTYPES */ #endif /* !XR_NO_PROTOTYPES */ #endif /* XR_USE_PLATFORM_WIN32 */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_FB_foveation_vulkan 1 #define XR_FB_foveation_vulkan_SPEC_VERSION 1 #define XR_FB_FOVEATION_VULKAN_EXTENSION_NAME "XR_FB_foveation_vulkan" // XrSwapchainImageFoveationVulkanFB extends XrSwapchainImageVulkanKHR typedef struct XrSwapchainImageFoveationVulkanFB { XrStructureType type; void* XR_MAY_ALIAS next; VkImage image; uint32_t width; uint32_t height; } XrSwapchainImageFoveationVulkanFB; #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef XR_USE_PLATFORM_ANDROID #define XR_FB_swapchain_update_state_android_surface 1 #define XR_FB_swapchain_update_state_android_surface_SPEC_VERSION 1 #define XR_FB_SWAPCHAIN_UPDATE_STATE_ANDROID_SURFACE_EXTENSION_NAME "XR_FB_swapchain_update_state_android_surface" #ifdef XR_USE_PLATFORM_ANDROID typedef struct XrSwapchainStateAndroidSurfaceDimensionsFB { XrStructureType type; void *XR_MAY_ALIAS next; uint32_t width; uint32_t height; } XrSwapchainStateAndroidSurfaceDimensionsFB; #endif // XR_USE_PLATFORM_ANDROID #endif /* XR_USE_PLATFORM_ANDROID */ #ifdef XR_USE_GRAPHICS_API_OPENGL_ES #define XR_FB_swapchain_update_state_opengl_es 1 #define XR_FB_swapchain_update_state_opengl_es_SPEC_VERSION 1 #define XR_FB_SWAPCHAIN_UPDATE_STATE_OPENGL_ES_EXTENSION_NAME "XR_FB_swapchain_update_state_opengl_es" #ifdef XR_USE_GRAPHICS_API_OPENGL_ES typedef struct XrSwapchainStateSamplerOpenGLESFB { XrStructureType type; void *XR_MAY_ALIAS next; EGLenum minFilter; EGLenum magFilter; EGLenum wrapModeS; EGLenum wrapModeT; EGLenum swizzleRed; EGLenum swizzleGreen; EGLenum swizzleBlue; EGLenum swizzleAlpha; float maxAnisotropy; XrColor4f borderColor; } XrSwapchainStateSamplerOpenGLESFB; #endif // XR_USE_GRAPHICS_API_OPENGL_ES #endif /* XR_USE_GRAPHICS_API_OPENGL_ES */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_FB_swapchain_update_state_vulkan 1 #define XR_FB_swapchain_update_state_vulkan_SPEC_VERSION 1 #define XR_FB_SWAPCHAIN_UPDATE_STATE_VULKAN_EXTENSION_NAME "XR_FB_swapchain_update_state_vulkan" #ifdef XR_USE_GRAPHICS_API_VULKAN typedef struct XrSwapchainStateSamplerVulkanFB { XrStructureType type; void* XR_MAY_ALIAS next; VkFilter minFilter; VkFilter magFilter; VkSamplerMipmapMode mipmapMode; VkSamplerAddressMode wrapModeS; VkSamplerAddressMode wrapModeT; VkComponentSwizzle swizzleRed; VkComponentSwizzle swizzleGreen; VkComponentSwizzle swizzleBlue; VkComponentSwizzle swizzleAlpha; float maxAnisotropy; XrColor4f borderColor; } XrSwapchainStateSamplerVulkanFB; #endif // XR_USE_GRAPHICS_API_VULKAN #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef XR_USE_GRAPHICS_API_VULKAN #define XR_META_vulkan_swapchain_create_info 1 #define XR_META_vulkan_swapchain_create_info_SPEC_VERSION 1 #define XR_META_VULKAN_SWAPCHAIN_CREATE_INFO_EXTENSION_NAME "XR_META_vulkan_swapchain_create_info" // XrVulkanSwapchainCreateInfoMETA extends XrSwapchainCreateInfo typedef struct XrVulkanSwapchainCreateInfoMETA { XrStructureType type; const void* XR_MAY_ALIAS next; VkImageCreateFlags additionalCreateFlags; VkImageUsageFlags additionalUsageFlags; } XrVulkanSwapchainCreateInfoMETA; #endif /* XR_USE_GRAPHICS_API_VULKAN */ #ifdef __cplusplus } #endif #endif ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr_platform_defines.h ================================================ /* ** Copyright (c) 2017-2023, The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ #ifndef OPENXR_PLATFORM_DEFINES_H_ #define OPENXR_PLATFORM_DEFINES_H_ 1 #ifdef __cplusplus extern "C" { #endif /* Platform-specific calling convention macros. * * Platforms should define these so that OpenXR clients call OpenXR functions * with the same calling conventions that the OpenXR implementation expects. * * XRAPI_ATTR - Placed before the return type in function declarations. * Useful for C++11 and GCC/Clang-style function attribute syntax. * XRAPI_CALL - Placed after the return type in function declarations. * Useful for MSVC-style calling convention syntax. * XRAPI_PTR - Placed between the '(' and '*' in function pointer types. * * Function declaration: XRAPI_ATTR void XRAPI_CALL xrFunction(void); * Function pointer type: typedef void (XRAPI_PTR *PFN_xrFunction)(void); */ #if defined(_WIN32) #define XRAPI_ATTR // On Windows, functions use the stdcall convention #define XRAPI_CALL __stdcall #define XRAPI_PTR XRAPI_CALL #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 #error "API not supported for the 'armeabi' NDK ABI" #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) // On Android 32-bit ARM targets, functions use the "hardfloat" // calling convention, i.e. float parameters are passed in registers. This // is true even if the rest of the application passes floats on the stack, // as it does by default when compiling for the armeabi-v7a NDK ABI. #define XRAPI_ATTR __attribute__((pcs("aapcs-vfp"))) #define XRAPI_CALL #define XRAPI_PTR XRAPI_ATTR #else // On other platforms, use the default calling convention #define XRAPI_ATTR #define XRAPI_CALL #define XRAPI_PTR #endif #include #if !defined(XR_NO_STDINT_H) #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef signed __int8 int8_t; typedef unsigned __int8 uint8_t; typedef signed __int16 int16_t; typedef unsigned __int16 uint16_t; typedef signed __int32 int32_t; typedef unsigned __int32 uint32_t; typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; #else #include #endif #endif // !defined( XR_NO_STDINT_H ) // XR_PTR_SIZE (in bytes) #if (defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)) #define XR_PTR_SIZE 8 #else #define XR_PTR_SIZE 4 #endif // Needed so we can use clang __has_feature portably. #if !defined(XR_COMPILER_HAS_FEATURE) #if defined(__clang__) #define XR_COMPILER_HAS_FEATURE(x) __has_feature(x) #else #define XR_COMPILER_HAS_FEATURE(x) 0 #endif #endif // Identifies if the current compiler has C++11 support enabled. // Does not by itself identify if any given C++11 feature is present. #if !defined(XR_CPP11_ENABLED) && defined(__cplusplus) #if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) #define XR_CPP11_ENABLED 1 #elif defined(_MSC_VER) && (_MSC_VER >= 1600) #define XR_CPP11_ENABLED 1 #elif (__cplusplus >= 201103L) // 201103 is the first C++11 version. #define XR_CPP11_ENABLED 1 #endif #endif // Identifies if the current compiler supports C++11 nullptr. #if !defined(XR_CPP_NULLPTR_SUPPORTED) #if defined(XR_CPP11_ENABLED) && \ ((defined(__clang__) && XR_COMPILER_HAS_FEATURE(cxx_nullptr)) || \ (defined(__GNUC__) && (((__GNUC__ * 1000) + __GNUC_MINOR__) >= 4006)) || \ (defined(_MSC_VER) && (_MSC_VER >= 1600)) || \ (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403))) #define XR_CPP_NULLPTR_SUPPORTED 1 #endif #endif #if !defined(XR_CPP_NULLPTR_SUPPORTED) #define XR_CPP_NULLPTR_SUPPORTED 0 #endif // !defined(XR_CPP_NULLPTR_SUPPORTED) #ifdef __cplusplus } #endif #endif ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr_reflection.h ================================================ #ifndef OPENXR_REFLECTION_H_ #define OPENXR_REFLECTION_H_ 1 /* ** Copyright (c) 2017-2023, The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ /* ** This header is generated from the Khronos OpenXR XML API Registry. ** */ #include "openxr.h" /* This file contains expansion macros (X Macros) for OpenXR enumerations and structures. Example of how to use expansion macros to make an enum-to-string function: */ #define XR_ENUM_CASE_STR(name, val) case name: return #name; #define XR_ENUM_STR(enumType) \ constexpr const char* XrEnumStr(enumType e) { \ switch (e) { \ XR_LIST_ENUM_##enumType(XR_ENUM_CASE_STR) \ default: return "Unknown"; \ } \ } \ #define XR_LIST_ENUM_XrResult(_) \ _(XR_SUCCESS, 0) \ _(XR_TIMEOUT_EXPIRED, 1) \ _(XR_SESSION_LOSS_PENDING, 3) \ _(XR_EVENT_UNAVAILABLE, 4) \ _(XR_SPACE_BOUNDS_UNAVAILABLE, 7) \ _(XR_SESSION_NOT_FOCUSED, 8) \ _(XR_FRAME_DISCARDED, 9) \ _(XR_ERROR_VALIDATION_FAILURE, -1) \ _(XR_ERROR_RUNTIME_FAILURE, -2) \ _(XR_ERROR_OUT_OF_MEMORY, -3) \ _(XR_ERROR_API_VERSION_UNSUPPORTED, -4) \ _(XR_ERROR_INITIALIZATION_FAILED, -6) \ _(XR_ERROR_FUNCTION_UNSUPPORTED, -7) \ _(XR_ERROR_FEATURE_UNSUPPORTED, -8) \ _(XR_ERROR_EXTENSION_NOT_PRESENT, -9) \ _(XR_ERROR_LIMIT_REACHED, -10) \ _(XR_ERROR_SIZE_INSUFFICIENT, -11) \ _(XR_ERROR_HANDLE_INVALID, -12) \ _(XR_ERROR_INSTANCE_LOST, -13) \ _(XR_ERROR_SESSION_RUNNING, -14) \ _(XR_ERROR_SESSION_NOT_RUNNING, -16) \ _(XR_ERROR_SESSION_LOST, -17) \ _(XR_ERROR_SYSTEM_INVALID, -18) \ _(XR_ERROR_PATH_INVALID, -19) \ _(XR_ERROR_PATH_COUNT_EXCEEDED, -20) \ _(XR_ERROR_PATH_FORMAT_INVALID, -21) \ _(XR_ERROR_PATH_UNSUPPORTED, -22) \ _(XR_ERROR_LAYER_INVALID, -23) \ _(XR_ERROR_LAYER_LIMIT_EXCEEDED, -24) \ _(XR_ERROR_SWAPCHAIN_RECT_INVALID, -25) \ _(XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED, -26) \ _(XR_ERROR_ACTION_TYPE_MISMATCH, -27) \ _(XR_ERROR_SESSION_NOT_READY, -28) \ _(XR_ERROR_SESSION_NOT_STOPPING, -29) \ _(XR_ERROR_TIME_INVALID, -30) \ _(XR_ERROR_REFERENCE_SPACE_UNSUPPORTED, -31) \ _(XR_ERROR_FILE_ACCESS_ERROR, -32) \ _(XR_ERROR_FILE_CONTENTS_INVALID, -33) \ _(XR_ERROR_FORM_FACTOR_UNSUPPORTED, -34) \ _(XR_ERROR_FORM_FACTOR_UNAVAILABLE, -35) \ _(XR_ERROR_API_LAYER_NOT_PRESENT, -36) \ _(XR_ERROR_CALL_ORDER_INVALID, -37) \ _(XR_ERROR_GRAPHICS_DEVICE_INVALID, -38) \ _(XR_ERROR_POSE_INVALID, -39) \ _(XR_ERROR_INDEX_OUT_OF_RANGE, -40) \ _(XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED, -41) \ _(XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED, -42) \ _(XR_ERROR_NAME_DUPLICATED, -44) \ _(XR_ERROR_NAME_INVALID, -45) \ _(XR_ERROR_ACTIONSET_NOT_ATTACHED, -46) \ _(XR_ERROR_ACTIONSETS_ALREADY_ATTACHED, -47) \ _(XR_ERROR_LOCALIZED_NAME_DUPLICATED, -48) \ _(XR_ERROR_LOCALIZED_NAME_INVALID, -49) \ _(XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING, -50) \ _(XR_ERROR_RUNTIME_UNAVAILABLE, -51) \ _(XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR, -1000003000) \ _(XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR, -1000003001) \ _(XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT, -1000039001) \ _(XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT, -1000053000) \ _(XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT, -1000055000) \ _(XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT, -1000066000) \ _(XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT, -1000097000) \ _(XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT, -1000097001) \ _(XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT, -1000097002) \ _(XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT, -1000097003) \ _(XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT, -1000097004) \ _(XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT, -1000097005) \ _(XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB, -1000101000) \ _(XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB, -1000108000) \ _(XR_ERROR_SPACE_COMPONENT_NOT_SUPPORTED_FB, -1000113000) \ _(XR_ERROR_SPACE_COMPONENT_NOT_ENABLED_FB, -1000113001) \ _(XR_ERROR_SPACE_COMPONENT_STATUS_PENDING_FB, -1000113002) \ _(XR_ERROR_SPACE_COMPONENT_STATUS_ALREADY_SET_FB, -1000113003) \ _(XR_ERROR_UNEXPECTED_STATE_PASSTHROUGH_FB, -1000118000) \ _(XR_ERROR_FEATURE_ALREADY_CREATED_PASSTHROUGH_FB, -1000118001) \ _(XR_ERROR_FEATURE_REQUIRED_PASSTHROUGH_FB, -1000118002) \ _(XR_ERROR_NOT_PERMITTED_PASSTHROUGH_FB, -1000118003) \ _(XR_ERROR_INSUFFICIENT_RESOURCES_PASSTHROUGH_FB, -1000118004) \ _(XR_ERROR_UNKNOWN_PASSTHROUGH_FB, -1000118050) \ _(XR_ERROR_RENDER_MODEL_KEY_INVALID_FB, -1000119000) \ _(XR_RENDER_MODEL_UNAVAILABLE_FB, 1000119020) \ _(XR_ERROR_MARKER_NOT_TRACKED_VARJO, -1000124000) \ _(XR_ERROR_MARKER_ID_INVALID_VARJO, -1000124001) \ _(XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT, -1000142001) \ _(XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT, -1000142002) \ _(XR_ERROR_SPACE_MAPPING_INSUFFICIENT_FB, -1000169000) \ _(XR_ERROR_SPACE_LOCALIZATION_FAILED_FB, -1000169001) \ _(XR_ERROR_SPACE_NETWORK_TIMEOUT_FB, -1000169002) \ _(XR_ERROR_SPACE_NETWORK_REQUEST_FAILED_FB, -1000169003) \ _(XR_ERROR_SPACE_CLOUD_STORAGE_DISABLED_FB, -1000169004) \ _(XR_ERROR_PASSTHROUGH_COLOR_LUT_BUFFER_SIZE_MISMATCH_META, -1000266000) \ _(XR_ERROR_HINT_ALREADY_SET_QCOM, -1000306000) \ _(XR_ERROR_SPACE_NOT_LOCATABLE_EXT, -1000429000) \ _(XR_ERROR_PLANE_DETECTION_PERMISSION_DENIED_EXT, -1000429001) \ _(XR_RESULT_MAX_ENUM, 0x7FFFFFFF) XR_ENUM_STR(XrResult); #define XR_LIST_ENUM_XrStructureType(_) \ _(XR_TYPE_UNKNOWN, 0) \ _(XR_TYPE_API_LAYER_PROPERTIES, 1) \ _(XR_TYPE_EXTENSION_PROPERTIES, 2) \ _(XR_TYPE_INSTANCE_CREATE_INFO, 3) \ _(XR_TYPE_SYSTEM_GET_INFO, 4) \ _(XR_TYPE_SYSTEM_PROPERTIES, 5) \ _(XR_TYPE_VIEW_LOCATE_INFO, 6) \ _(XR_TYPE_VIEW, 7) \ _(XR_TYPE_SESSION_CREATE_INFO, 8) \ _(XR_TYPE_SWAPCHAIN_CREATE_INFO, 9) \ _(XR_TYPE_SESSION_BEGIN_INFO, 10) \ _(XR_TYPE_VIEW_STATE, 11) \ _(XR_TYPE_FRAME_END_INFO, 12) \ _(XR_TYPE_HAPTIC_VIBRATION, 13) \ _(XR_TYPE_EVENT_DATA_BUFFER, 16) \ _(XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING, 17) \ _(XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED, 18) \ _(XR_TYPE_ACTION_STATE_BOOLEAN, 23) \ _(XR_TYPE_ACTION_STATE_FLOAT, 24) \ _(XR_TYPE_ACTION_STATE_VECTOR2F, 25) \ _(XR_TYPE_ACTION_STATE_POSE, 27) \ _(XR_TYPE_ACTION_SET_CREATE_INFO, 28) \ _(XR_TYPE_ACTION_CREATE_INFO, 29) \ _(XR_TYPE_INSTANCE_PROPERTIES, 32) \ _(XR_TYPE_FRAME_WAIT_INFO, 33) \ _(XR_TYPE_COMPOSITION_LAYER_PROJECTION, 35) \ _(XR_TYPE_COMPOSITION_LAYER_QUAD, 36) \ _(XR_TYPE_REFERENCE_SPACE_CREATE_INFO, 37) \ _(XR_TYPE_ACTION_SPACE_CREATE_INFO, 38) \ _(XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING, 40) \ _(XR_TYPE_VIEW_CONFIGURATION_VIEW, 41) \ _(XR_TYPE_SPACE_LOCATION, 42) \ _(XR_TYPE_SPACE_VELOCITY, 43) \ _(XR_TYPE_FRAME_STATE, 44) \ _(XR_TYPE_VIEW_CONFIGURATION_PROPERTIES, 45) \ _(XR_TYPE_FRAME_BEGIN_INFO, 46) \ _(XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW, 48) \ _(XR_TYPE_EVENT_DATA_EVENTS_LOST, 49) \ _(XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING, 51) \ _(XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED, 52) \ _(XR_TYPE_INTERACTION_PROFILE_STATE, 53) \ _(XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO, 55) \ _(XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO, 56) \ _(XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO, 57) \ _(XR_TYPE_ACTION_STATE_GET_INFO, 58) \ _(XR_TYPE_HAPTIC_ACTION_INFO, 59) \ _(XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO, 60) \ _(XR_TYPE_ACTIONS_SYNC_INFO, 61) \ _(XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO, 62) \ _(XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO, 63) \ _(XR_TYPE_COMPOSITION_LAYER_CUBE_KHR, 1000006000) \ _(XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR, 1000008000) \ _(XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, 1000010000) \ _(XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR, 1000014000) \ _(XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT, 1000015000) \ _(XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR, 1000017000) \ _(XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR, 1000018000) \ _(XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, 1000019000) \ _(XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, 1000019001) \ _(XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, 1000019002) \ _(XR_TYPE_DEBUG_UTILS_LABEL_EXT, 1000019003) \ _(XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR, 1000023000) \ _(XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR, 1000023001) \ _(XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR, 1000023002) \ _(XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR, 1000023003) \ _(XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR, 1000023004) \ _(XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR, 1000023005) \ _(XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR, 1000024001) \ _(XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR, 1000024002) \ _(XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR, 1000024003) \ _(XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, 1000025000) \ _(XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, 1000025001) \ _(XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, 1000025002) \ _(XR_TYPE_GRAPHICS_BINDING_D3D11_KHR, 1000027000) \ _(XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR, 1000027001) \ _(XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR, 1000027002) \ _(XR_TYPE_GRAPHICS_BINDING_D3D12_KHR, 1000028000) \ _(XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR, 1000028001) \ _(XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR, 1000028002) \ _(XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT, 1000030000) \ _(XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT, 1000030001) \ _(XR_TYPE_VISIBILITY_MASK_KHR, 1000031000) \ _(XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR, 1000031001) \ _(XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX, 1000033000) \ _(XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX, 1000033003) \ _(XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR, 1000034000) \ _(XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT, 1000039000) \ _(XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT, 1000039001) \ _(XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB, 1000040000) \ _(XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB, 1000041001) \ _(XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT, 1000046000) \ _(XR_TYPE_GRAPHICS_BINDING_EGL_MNDX, 1000048004) \ _(XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT, 1000049000) \ _(XR_TYPE_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT, 1000049001) \ _(XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT, 1000049002) \ _(XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT, 1000049003) \ _(XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT, 1000051000) \ _(XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, 1000051001) \ _(XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, 1000051002) \ _(XR_TYPE_HAND_JOINT_LOCATIONS_EXT, 1000051003) \ _(XR_TYPE_HAND_JOINT_VELOCITIES_EXT, 1000051004) \ _(XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT, 1000052000) \ _(XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT, 1000052001) \ _(XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT, 1000052002) \ _(XR_TYPE_HAND_MESH_MSFT, 1000052003) \ _(XR_TYPE_HAND_POSE_TYPE_INFO_MSFT, 1000052004) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT, 1000053000) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT, 1000053001) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT, 1000053002) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT, 1000053003) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT, 1000053004) \ _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT, 1000053005) \ _(XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT, 1000055000) \ _(XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT, 1000055001) \ _(XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT, 1000055002) \ _(XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT, 1000055003) \ _(XR_TYPE_CONTROLLER_MODEL_STATE_MSFT, 1000055004) \ _(XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC, 1000059000) \ _(XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT, 1000063000) \ _(XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT, 1000066000) \ _(XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT, 1000066001) \ _(XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB, 1000070000) \ _(XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB, 1000072000) \ _(XR_TYPE_BODY_TRACKER_CREATE_INFO_FB, 1000076001) \ _(XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB, 1000076002) \ _(XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_FB, 1000076004) \ _(XR_TYPE_BODY_JOINT_LOCATIONS_FB, 1000076005) \ _(XR_TYPE_BODY_SKELETON_FB, 1000076006) \ _(XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT, 1000078000) \ _(XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE, 1000079000) \ _(XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT, 1000080000) \ _(XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR, 1000089000) \ _(XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR, 1000090000) \ _(XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR, 1000090001) \ _(XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR, 1000090003) \ _(XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR, 1000091000) \ _(XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT, 1000097000) \ _(XR_TYPE_SCENE_CREATE_INFO_MSFT, 1000097001) \ _(XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT, 1000097002) \ _(XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT, 1000097003) \ _(XR_TYPE_SCENE_COMPONENTS_MSFT, 1000097004) \ _(XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT, 1000097005) \ _(XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT, 1000097006) \ _(XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT, 1000097007) \ _(XR_TYPE_SCENE_OBJECTS_MSFT, 1000097008) \ _(XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT, 1000097009) \ _(XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT, 1000097010) \ _(XR_TYPE_SCENE_PLANES_MSFT, 1000097011) \ _(XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT, 1000097012) \ _(XR_TYPE_SCENE_MESHES_MSFT, 1000097013) \ _(XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT, 1000097014) \ _(XR_TYPE_SCENE_MESH_BUFFERS_MSFT, 1000097015) \ _(XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT, 1000097016) \ _(XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT, 1000097017) \ _(XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT, 1000097018) \ _(XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT, 1000098000) \ _(XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT, 1000098001) \ _(XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB, 1000101000) \ _(XR_TYPE_VIVE_TRACKER_PATHS_HTCX, 1000103000) \ _(XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX, 1000103001) \ _(XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC, 1000104000) \ _(XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC, 1000104001) \ _(XR_TYPE_FACIAL_EXPRESSIONS_HTC, 1000104002) \ _(XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB, 1000108000) \ _(XR_TYPE_HAND_TRACKING_MESH_FB, 1000110001) \ _(XR_TYPE_HAND_TRACKING_SCALE_FB, 1000110003) \ _(XR_TYPE_HAND_TRACKING_AIM_STATE_FB, 1000111001) \ _(XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB, 1000112000) \ _(XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB, 1000113004) \ _(XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB, 1000113003) \ _(XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB, 1000113007) \ _(XR_TYPE_SPACE_COMPONENT_STATUS_FB, 1000113001) \ _(XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB, 1000113005) \ _(XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB, 1000113006) \ _(XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB, 1000114000) \ _(XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB, 1000114001) \ _(XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB, 1000114002) \ _(XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB, 1000115000) \ _(XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB, 1000116009) \ _(XR_TYPE_KEYBOARD_TRACKING_QUERY_FB, 1000116004) \ _(XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB, 1000116002) \ _(XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB, 1000117001) \ _(XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB, 1000118000) \ _(XR_TYPE_PASSTHROUGH_CREATE_INFO_FB, 1000118001) \ _(XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB, 1000118002) \ _(XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB, 1000118003) \ _(XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB, 1000118004) \ _(XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB, 1000118005) \ _(XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB, 1000118006) \ _(XR_TYPE_PASSTHROUGH_STYLE_FB, 1000118020) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB, 1000118021) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB, 1000118022) \ _(XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB, 1000118023) \ _(XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB, 1000118030) \ _(XR_TYPE_RENDER_MODEL_PATH_INFO_FB, 1000119000) \ _(XR_TYPE_RENDER_MODEL_PROPERTIES_FB, 1000119001) \ _(XR_TYPE_RENDER_MODEL_BUFFER_FB, 1000119002) \ _(XR_TYPE_RENDER_MODEL_LOAD_INFO_FB, 1000119003) \ _(XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB, 1000119004) \ _(XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB, 1000119005) \ _(XR_TYPE_BINDING_MODIFICATIONS_KHR, 1000120000) \ _(XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO, 1000121000) \ _(XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO, 1000121001) \ _(XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO, 1000121002) \ _(XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO, 1000122000) \ _(XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO, 1000124000) \ _(XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO, 1000124001) \ _(XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO, 1000124002) \ _(XR_TYPE_FRAME_END_INFO_ML, 1000135000) \ _(XR_TYPE_GLOBAL_DIMMER_FRAME_END_INFO_ML, 1000136000) \ _(XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML, 1000137000) \ _(XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT, 1000142000) \ _(XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT, 1000142001) \ _(XR_TYPE_SPACE_QUERY_INFO_FB, 1000156001) \ _(XR_TYPE_SPACE_QUERY_RESULTS_FB, 1000156002) \ _(XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB, 1000156003) \ _(XR_TYPE_SPACE_UUID_FILTER_INFO_FB, 1000156054) \ _(XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB, 1000156052) \ _(XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB, 1000156103) \ _(XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB, 1000156104) \ _(XR_TYPE_SPACE_SAVE_INFO_FB, 1000158000) \ _(XR_TYPE_SPACE_ERASE_INFO_FB, 1000158001) \ _(XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB, 1000158106) \ _(XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB, 1000158107) \ _(XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB, 1000160000) \ _(XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB, 1000161000) \ _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB, 1000162000) \ _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB, 1000163000) \ _(XR_TYPE_SPACE_SHARE_INFO_FB, 1000169001) \ _(XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB, 1000169002) \ _(XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB, 1000171000) \ _(XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB, 1000171001) \ _(XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB, 1000173001) \ _(XR_TYPE_SEMANTIC_LABELS_FB, 1000175000) \ _(XR_TYPE_ROOM_LAYOUT_FB, 1000175001) \ _(XR_TYPE_BOUNDARY_2D_FB, 1000175002) \ _(XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB, 1000175010) \ _(XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE, 1000196000) \ _(XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB, 1000198001) \ _(XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB, 1000198050) \ _(XR_TYPE_SPACE_CONTAINER_FB, 1000199000) \ _(XR_TYPE_FOVEATION_EYE_TRACKED_PROFILE_CREATE_INFO_META, 1000200000) \ _(XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META, 1000200001) \ _(XR_TYPE_SYSTEM_FOVEATION_EYE_TRACKED_PROPERTIES_META, 1000200002) \ _(XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_FB, 1000201004) \ _(XR_TYPE_FACE_TRACKER_CREATE_INFO_FB, 1000201005) \ _(XR_TYPE_FACE_EXPRESSION_INFO_FB, 1000201002) \ _(XR_TYPE_FACE_EXPRESSION_WEIGHTS_FB, 1000201006) \ _(XR_TYPE_EYE_TRACKER_CREATE_INFO_FB, 1000202001) \ _(XR_TYPE_EYE_GAZES_INFO_FB, 1000202002) \ _(XR_TYPE_EYE_GAZES_FB, 1000202003) \ _(XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB, 1000202004) \ _(XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB, 1000203002) \ _(XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB, 1000204000) \ _(XR_TYPE_HAPTIC_PCM_VIBRATION_FB, 1000209001) \ _(XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB, 1000209002) \ _(XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_FB, 1000212000) \ _(XR_TYPE_LOCAL_DIMMING_FRAME_END_INFO_META, 1000216000) \ _(XR_TYPE_SYSTEM_VIRTUAL_KEYBOARD_PROPERTIES_META, 1000219001) \ _(XR_TYPE_VIRTUAL_KEYBOARD_CREATE_INFO_META, 1000219002) \ _(XR_TYPE_VIRTUAL_KEYBOARD_SPACE_CREATE_INFO_META, 1000219003) \ _(XR_TYPE_VIRTUAL_KEYBOARD_LOCATION_INFO_META, 1000219004) \ _(XR_TYPE_VIRTUAL_KEYBOARD_MODEL_VISIBILITY_SET_INFO_META, 1000219005) \ _(XR_TYPE_VIRTUAL_KEYBOARD_ANIMATION_STATE_META, 1000219006) \ _(XR_TYPE_VIRTUAL_KEYBOARD_MODEL_ANIMATION_STATES_META, 1000219007) \ _(XR_TYPE_VIRTUAL_KEYBOARD_TEXTURE_DATA_META, 1000219009) \ _(XR_TYPE_VIRTUAL_KEYBOARD_INPUT_INFO_META, 1000219010) \ _(XR_TYPE_VIRTUAL_KEYBOARD_TEXT_CONTEXT_CHANGE_INFO_META, 1000219011) \ _(XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_COMMIT_TEXT_META, 1000219014) \ _(XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_BACKSPACE_META, 1000219015) \ _(XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_ENTER_META, 1000219016) \ _(XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_SHOWN_META, 1000219017) \ _(XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_HIDDEN_META, 1000219018) \ _(XR_TYPE_EXTERNAL_CAMERA_OCULUS, 1000226000) \ _(XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META, 1000227000) \ _(XR_TYPE_PERFORMANCE_METRICS_STATE_META, 1000232001) \ _(XR_TYPE_PERFORMANCE_METRICS_COUNTER_META, 1000232002) \ _(XR_TYPE_SPACE_LIST_SAVE_INFO_FB, 1000238000) \ _(XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB, 1000238001) \ _(XR_TYPE_SPACE_USER_CREATE_INFO_FB, 1000241001) \ _(XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META, 1000245000) \ _(XR_TYPE_SYSTEM_PASSTHROUGH_COLOR_LUT_PROPERTIES_META, 1000266000) \ _(XR_TYPE_PASSTHROUGH_COLOR_LUT_CREATE_INFO_META, 1000266001) \ _(XR_TYPE_PASSTHROUGH_COLOR_LUT_UPDATE_INFO_META, 1000266002) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_LUT_META, 1000266100) \ _(XR_TYPE_PASSTHROUGH_COLOR_MAP_INTERPOLATED_LUT_META, 1000266101) \ _(XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC, 1000317001) \ _(XR_TYPE_PASSTHROUGH_COLOR_HTC, 1000317002) \ _(XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC, 1000317003) \ _(XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC, 1000317004) \ _(XR_TYPE_FOVEATION_APPLY_INFO_HTC, 1000318000) \ _(XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC, 1000318001) \ _(XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC, 1000318002) \ _(XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT, 1000373000) \ _(XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX, 1000375000) \ _(XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX, 1000375001) \ _(XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT, 1000428000) \ _(XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT, 1000428001) \ _(XR_TYPE_PLANE_DETECTOR_CREATE_INFO_EXT, 1000429001) \ _(XR_TYPE_PLANE_DETECTOR_BEGIN_INFO_EXT, 1000429002) \ _(XR_TYPE_PLANE_DETECTOR_GET_INFO_EXT, 1000429003) \ _(XR_TYPE_PLANE_DETECTOR_LOCATIONS_EXT, 1000429004) \ _(XR_TYPE_PLANE_DETECTOR_LOCATION_EXT, 1000429005) \ _(XR_TYPE_PLANE_DETECTOR_POLYGON_BUFFER_EXT, 1000429006) \ _(XR_TYPE_SYSTEM_PLANE_DETECTION_PROPERTIES_EXT, 1000429007) \ _(XR_STRUCTURE_TYPE_MAX_ENUM, 0x7FFFFFFF) XR_ENUM_STR(XrStructureType); #define XR_LIST_ENUM_XrFormFactor(_) \ _(XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY, 1) \ _(XR_FORM_FACTOR_HANDHELD_DISPLAY, 2) \ _(XR_FORM_FACTOR_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrViewConfigurationType(_) \ _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO, 1) \ _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, 2) \ _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO, 1000037000) \ _(XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT, 1000054000) \ _(XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM, 0x7FFFFFFF) XR_ENUM_STR(XrViewConfigurationType); #define XR_LIST_ENUM_XrEnvironmentBlendMode(_) \ _(XR_ENVIRONMENT_BLEND_MODE_OPAQUE, 1) \ _(XR_ENVIRONMENT_BLEND_MODE_ADDITIVE, 2) \ _(XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND, 3) \ _(XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrReferenceSpaceType(_) \ _(XR_REFERENCE_SPACE_TYPE_VIEW, 1) \ _(XR_REFERENCE_SPACE_TYPE_LOCAL, 2) \ _(XR_REFERENCE_SPACE_TYPE_STAGE, 3) \ _(XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT, 1000038000) \ _(XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO, 1000121000) \ _(XR_REFERENCE_SPACE_TYPE_LOCAL_FLOOR_EXT, 1000426000) \ _(XR_REFERENCE_SPACE_TYPE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrActionType(_) \ _(XR_ACTION_TYPE_BOOLEAN_INPUT, 1) \ _(XR_ACTION_TYPE_FLOAT_INPUT, 2) \ _(XR_ACTION_TYPE_VECTOR2F_INPUT, 3) \ _(XR_ACTION_TYPE_POSE_INPUT, 4) \ _(XR_ACTION_TYPE_VIBRATION_OUTPUT, 100) \ _(XR_ACTION_TYPE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrEyeVisibility(_) \ _(XR_EYE_VISIBILITY_BOTH, 0) \ _(XR_EYE_VISIBILITY_LEFT, 1) \ _(XR_EYE_VISIBILITY_RIGHT, 2) \ _(XR_EYE_VISIBILITY_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSessionState(_) \ _(XR_SESSION_STATE_UNKNOWN, 0) \ _(XR_SESSION_STATE_IDLE, 1) \ _(XR_SESSION_STATE_READY, 2) \ _(XR_SESSION_STATE_SYNCHRONIZED, 3) \ _(XR_SESSION_STATE_VISIBLE, 4) \ _(XR_SESSION_STATE_FOCUSED, 5) \ _(XR_SESSION_STATE_STOPPING, 6) \ _(XR_SESSION_STATE_LOSS_PENDING, 7) \ _(XR_SESSION_STATE_EXITING, 8) \ _(XR_SESSION_STATE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrObjectType(_) \ _(XR_OBJECT_TYPE_UNKNOWN, 0) \ _(XR_OBJECT_TYPE_INSTANCE, 1) \ _(XR_OBJECT_TYPE_SESSION, 2) \ _(XR_OBJECT_TYPE_SWAPCHAIN, 3) \ _(XR_OBJECT_TYPE_SPACE, 4) \ _(XR_OBJECT_TYPE_ACTION_SET, 5) \ _(XR_OBJECT_TYPE_ACTION, 6) \ _(XR_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT, 1000019000) \ _(XR_OBJECT_TYPE_SPATIAL_ANCHOR_MSFT, 1000039000) \ _(XR_OBJECT_TYPE_SPATIAL_GRAPH_NODE_BINDING_MSFT, 1000049000) \ _(XR_OBJECT_TYPE_HAND_TRACKER_EXT, 1000051000) \ _(XR_OBJECT_TYPE_BODY_TRACKER_FB, 1000076000) \ _(XR_OBJECT_TYPE_SCENE_OBSERVER_MSFT, 1000097000) \ _(XR_OBJECT_TYPE_SCENE_MSFT, 1000097001) \ _(XR_OBJECT_TYPE_FACIAL_TRACKER_HTC, 1000104000) \ _(XR_OBJECT_TYPE_FOVEATION_PROFILE_FB, 1000114000) \ _(XR_OBJECT_TYPE_TRIANGLE_MESH_FB, 1000117000) \ _(XR_OBJECT_TYPE_PASSTHROUGH_FB, 1000118000) \ _(XR_OBJECT_TYPE_PASSTHROUGH_LAYER_FB, 1000118002) \ _(XR_OBJECT_TYPE_GEOMETRY_INSTANCE_FB, 1000118004) \ _(XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT, 1000142000) \ _(XR_OBJECT_TYPE_FACE_TRACKER_FB, 1000201000) \ _(XR_OBJECT_TYPE_EYE_TRACKER_FB, 1000202000) \ _(XR_OBJECT_TYPE_VIRTUAL_KEYBOARD_META, 1000219000) \ _(XR_OBJECT_TYPE_SPACE_USER_FB, 1000241000) \ _(XR_OBJECT_TYPE_PASSTHROUGH_COLOR_LUT_META, 1000266000) \ _(XR_OBJECT_TYPE_PASSTHROUGH_HTC, 1000317000) \ _(XR_OBJECT_TYPE_PLANE_DETECTOR_EXT, 1000429000) \ _(XR_OBJECT_TYPE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrAndroidThreadTypeKHR(_) \ _(XR_ANDROID_THREAD_TYPE_APPLICATION_MAIN_KHR, 1) \ _(XR_ANDROID_THREAD_TYPE_APPLICATION_WORKER_KHR, 2) \ _(XR_ANDROID_THREAD_TYPE_RENDERER_MAIN_KHR, 3) \ _(XR_ANDROID_THREAD_TYPE_RENDERER_WORKER_KHR, 4) \ _(XR_ANDROID_THREAD_TYPE_MAX_ENUM_KHR, 0x7FFFFFFF) #define XR_LIST_ENUM_XrVisibilityMaskTypeKHR(_) \ _(XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR, 1) \ _(XR_VISIBILITY_MASK_TYPE_VISIBLE_TRIANGLE_MESH_KHR, 2) \ _(XR_VISIBILITY_MASK_TYPE_LINE_LOOP_KHR, 3) \ _(XR_VISIBILITY_MASK_TYPE_MAX_ENUM_KHR, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPerfSettingsDomainEXT(_) \ _(XR_PERF_SETTINGS_DOMAIN_CPU_EXT, 1) \ _(XR_PERF_SETTINGS_DOMAIN_GPU_EXT, 2) \ _(XR_PERF_SETTINGS_DOMAIN_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPerfSettingsSubDomainEXT(_) \ _(XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT, 1) \ _(XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT, 2) \ _(XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT, 3) \ _(XR_PERF_SETTINGS_SUB_DOMAIN_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPerfSettingsLevelEXT(_) \ _(XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT, 0) \ _(XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT, 25) \ _(XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT, 50) \ _(XR_PERF_SETTINGS_LEVEL_BOOST_EXT, 75) \ _(XR_PERF_SETTINGS_LEVEL_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPerfSettingsNotificationLevelEXT(_) \ _(XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT, 0) \ _(XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT, 25) \ _(XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT, 75) \ _(XR_PERF_SETTINGS_NOTIFICATION_LEVEL_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrBlendFactorFB(_) \ _(XR_BLEND_FACTOR_ZERO_FB, 0) \ _(XR_BLEND_FACTOR_ONE_FB, 1) \ _(XR_BLEND_FACTOR_SRC_ALPHA_FB, 2) \ _(XR_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA_FB, 3) \ _(XR_BLEND_FACTOR_DST_ALPHA_FB, 4) \ _(XR_BLEND_FACTOR_ONE_MINUS_DST_ALPHA_FB, 5) \ _(XR_BLEND_FACTOR_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSpatialGraphNodeTypeMSFT(_) \ _(XR_SPATIAL_GRAPH_NODE_TYPE_STATIC_MSFT, 1) \ _(XR_SPATIAL_GRAPH_NODE_TYPE_DYNAMIC_MSFT, 2) \ _(XR_SPATIAL_GRAPH_NODE_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandEXT(_) \ _(XR_HAND_LEFT_EXT, 1) \ _(XR_HAND_RIGHT_EXT, 2) \ _(XR_HAND_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandJointEXT(_) \ _(XR_HAND_JOINT_PALM_EXT, 0) \ _(XR_HAND_JOINT_WRIST_EXT, 1) \ _(XR_HAND_JOINT_THUMB_METACARPAL_EXT, 2) \ _(XR_HAND_JOINT_THUMB_PROXIMAL_EXT, 3) \ _(XR_HAND_JOINT_THUMB_DISTAL_EXT, 4) \ _(XR_HAND_JOINT_THUMB_TIP_EXT, 5) \ _(XR_HAND_JOINT_INDEX_METACARPAL_EXT, 6) \ _(XR_HAND_JOINT_INDEX_PROXIMAL_EXT, 7) \ _(XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT, 8) \ _(XR_HAND_JOINT_INDEX_DISTAL_EXT, 9) \ _(XR_HAND_JOINT_INDEX_TIP_EXT, 10) \ _(XR_HAND_JOINT_MIDDLE_METACARPAL_EXT, 11) \ _(XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT, 12) \ _(XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT, 13) \ _(XR_HAND_JOINT_MIDDLE_DISTAL_EXT, 14) \ _(XR_HAND_JOINT_MIDDLE_TIP_EXT, 15) \ _(XR_HAND_JOINT_RING_METACARPAL_EXT, 16) \ _(XR_HAND_JOINT_RING_PROXIMAL_EXT, 17) \ _(XR_HAND_JOINT_RING_INTERMEDIATE_EXT, 18) \ _(XR_HAND_JOINT_RING_DISTAL_EXT, 19) \ _(XR_HAND_JOINT_RING_TIP_EXT, 20) \ _(XR_HAND_JOINT_LITTLE_METACARPAL_EXT, 21) \ _(XR_HAND_JOINT_LITTLE_PROXIMAL_EXT, 22) \ _(XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT, 23) \ _(XR_HAND_JOINT_LITTLE_DISTAL_EXT, 24) \ _(XR_HAND_JOINT_LITTLE_TIP_EXT, 25) \ _(XR_HAND_JOINT_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandJointSetEXT(_) \ _(XR_HAND_JOINT_SET_DEFAULT_EXT, 0) \ _(XR_HAND_JOINT_SET_HAND_WITH_FOREARM_ULTRALEAP, 1000149000) \ _(XR_HAND_JOINT_SET_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandPoseTypeMSFT(_) \ _(XR_HAND_POSE_TYPE_TRACKED_MSFT, 0) \ _(XR_HAND_POSE_TYPE_REFERENCE_OPEN_PALM_MSFT, 1) \ _(XR_HAND_POSE_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrReprojectionModeMSFT(_) \ _(XR_REPROJECTION_MODE_DEPTH_MSFT, 1) \ _(XR_REPROJECTION_MODE_PLANAR_FROM_DEPTH_MSFT, 2) \ _(XR_REPROJECTION_MODE_PLANAR_MANUAL_MSFT, 3) \ _(XR_REPROJECTION_MODE_ORIENTATION_ONLY_MSFT, 4) \ _(XR_REPROJECTION_MODE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrBodyJointFB(_) \ _(XR_BODY_JOINT_ROOT_FB, 0) \ _(XR_BODY_JOINT_HIPS_FB, 1) \ _(XR_BODY_JOINT_SPINE_LOWER_FB, 2) \ _(XR_BODY_JOINT_SPINE_MIDDLE_FB, 3) \ _(XR_BODY_JOINT_SPINE_UPPER_FB, 4) \ _(XR_BODY_JOINT_CHEST_FB, 5) \ _(XR_BODY_JOINT_NECK_FB, 6) \ _(XR_BODY_JOINT_HEAD_FB, 7) \ _(XR_BODY_JOINT_LEFT_SHOULDER_FB, 8) \ _(XR_BODY_JOINT_LEFT_SCAPULA_FB, 9) \ _(XR_BODY_JOINT_LEFT_ARM_UPPER_FB, 10) \ _(XR_BODY_JOINT_LEFT_ARM_LOWER_FB, 11) \ _(XR_BODY_JOINT_LEFT_HAND_WRIST_TWIST_FB, 12) \ _(XR_BODY_JOINT_RIGHT_SHOULDER_FB, 13) \ _(XR_BODY_JOINT_RIGHT_SCAPULA_FB, 14) \ _(XR_BODY_JOINT_RIGHT_ARM_UPPER_FB, 15) \ _(XR_BODY_JOINT_RIGHT_ARM_LOWER_FB, 16) \ _(XR_BODY_JOINT_RIGHT_HAND_WRIST_TWIST_FB, 17) \ _(XR_BODY_JOINT_LEFT_HAND_PALM_FB, 18) \ _(XR_BODY_JOINT_LEFT_HAND_WRIST_FB, 19) \ _(XR_BODY_JOINT_LEFT_HAND_THUMB_METACARPAL_FB, 20) \ _(XR_BODY_JOINT_LEFT_HAND_THUMB_PROXIMAL_FB, 21) \ _(XR_BODY_JOINT_LEFT_HAND_THUMB_DISTAL_FB, 22) \ _(XR_BODY_JOINT_LEFT_HAND_THUMB_TIP_FB, 23) \ _(XR_BODY_JOINT_LEFT_HAND_INDEX_METACARPAL_FB, 24) \ _(XR_BODY_JOINT_LEFT_HAND_INDEX_PROXIMAL_FB, 25) \ _(XR_BODY_JOINT_LEFT_HAND_INDEX_INTERMEDIATE_FB, 26) \ _(XR_BODY_JOINT_LEFT_HAND_INDEX_DISTAL_FB, 27) \ _(XR_BODY_JOINT_LEFT_HAND_INDEX_TIP_FB, 28) \ _(XR_BODY_JOINT_LEFT_HAND_MIDDLE_METACARPAL_FB, 29) \ _(XR_BODY_JOINT_LEFT_HAND_MIDDLE_PROXIMAL_FB, 30) \ _(XR_BODY_JOINT_LEFT_HAND_MIDDLE_INTERMEDIATE_FB, 31) \ _(XR_BODY_JOINT_LEFT_HAND_MIDDLE_DISTAL_FB, 32) \ _(XR_BODY_JOINT_LEFT_HAND_MIDDLE_TIP_FB, 33) \ _(XR_BODY_JOINT_LEFT_HAND_RING_METACARPAL_FB, 34) \ _(XR_BODY_JOINT_LEFT_HAND_RING_PROXIMAL_FB, 35) \ _(XR_BODY_JOINT_LEFT_HAND_RING_INTERMEDIATE_FB, 36) \ _(XR_BODY_JOINT_LEFT_HAND_RING_DISTAL_FB, 37) \ _(XR_BODY_JOINT_LEFT_HAND_RING_TIP_FB, 38) \ _(XR_BODY_JOINT_LEFT_HAND_LITTLE_METACARPAL_FB, 39) \ _(XR_BODY_JOINT_LEFT_HAND_LITTLE_PROXIMAL_FB, 40) \ _(XR_BODY_JOINT_LEFT_HAND_LITTLE_INTERMEDIATE_FB, 41) \ _(XR_BODY_JOINT_LEFT_HAND_LITTLE_DISTAL_FB, 42) \ _(XR_BODY_JOINT_LEFT_HAND_LITTLE_TIP_FB, 43) \ _(XR_BODY_JOINT_RIGHT_HAND_PALM_FB, 44) \ _(XR_BODY_JOINT_RIGHT_HAND_WRIST_FB, 45) \ _(XR_BODY_JOINT_RIGHT_HAND_THUMB_METACARPAL_FB, 46) \ _(XR_BODY_JOINT_RIGHT_HAND_THUMB_PROXIMAL_FB, 47) \ _(XR_BODY_JOINT_RIGHT_HAND_THUMB_DISTAL_FB, 48) \ _(XR_BODY_JOINT_RIGHT_HAND_THUMB_TIP_FB, 49) \ _(XR_BODY_JOINT_RIGHT_HAND_INDEX_METACARPAL_FB, 50) \ _(XR_BODY_JOINT_RIGHT_HAND_INDEX_PROXIMAL_FB, 51) \ _(XR_BODY_JOINT_RIGHT_HAND_INDEX_INTERMEDIATE_FB, 52) \ _(XR_BODY_JOINT_RIGHT_HAND_INDEX_DISTAL_FB, 53) \ _(XR_BODY_JOINT_RIGHT_HAND_INDEX_TIP_FB, 54) \ _(XR_BODY_JOINT_RIGHT_HAND_MIDDLE_METACARPAL_FB, 55) \ _(XR_BODY_JOINT_RIGHT_HAND_MIDDLE_PROXIMAL_FB, 56) \ _(XR_BODY_JOINT_RIGHT_HAND_MIDDLE_INTERMEDIATE_FB, 57) \ _(XR_BODY_JOINT_RIGHT_HAND_MIDDLE_DISTAL_FB, 58) \ _(XR_BODY_JOINT_RIGHT_HAND_MIDDLE_TIP_FB, 59) \ _(XR_BODY_JOINT_RIGHT_HAND_RING_METACARPAL_FB, 60) \ _(XR_BODY_JOINT_RIGHT_HAND_RING_PROXIMAL_FB, 61) \ _(XR_BODY_JOINT_RIGHT_HAND_RING_INTERMEDIATE_FB, 62) \ _(XR_BODY_JOINT_RIGHT_HAND_RING_DISTAL_FB, 63) \ _(XR_BODY_JOINT_RIGHT_HAND_RING_TIP_FB, 64) \ _(XR_BODY_JOINT_RIGHT_HAND_LITTLE_METACARPAL_FB, 65) \ _(XR_BODY_JOINT_RIGHT_HAND_LITTLE_PROXIMAL_FB, 66) \ _(XR_BODY_JOINT_RIGHT_HAND_LITTLE_INTERMEDIATE_FB, 67) \ _(XR_BODY_JOINT_RIGHT_HAND_LITTLE_DISTAL_FB, 68) \ _(XR_BODY_JOINT_RIGHT_HAND_LITTLE_TIP_FB, 69) \ _(XR_BODY_JOINT_COUNT_FB, 70) \ _(XR_BODY_JOINT_NONE_FB, -1) \ _(XR_BODY_JOINT_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrBodyJointSetFB(_) \ _(XR_BODY_JOINT_SET_DEFAULT_FB, 0) \ _(XR_BODY_JOINT_SET_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandJointsMotionRangeEXT(_) \ _(XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT, 1) \ _(XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT, 2) \ _(XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSceneComputeFeatureMSFT(_) \ _(XR_SCENE_COMPUTE_FEATURE_PLANE_MSFT, 1) \ _(XR_SCENE_COMPUTE_FEATURE_PLANE_MESH_MSFT, 2) \ _(XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT, 3) \ _(XR_SCENE_COMPUTE_FEATURE_COLLIDER_MESH_MSFT, 4) \ _(XR_SCENE_COMPUTE_FEATURE_SERIALIZE_SCENE_MSFT, 1000098000) \ _(XR_SCENE_COMPUTE_FEATURE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSceneComputeConsistencyMSFT(_) \ _(XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT, 1) \ _(XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_INCOMPLETE_FAST_MSFT, 2) \ _(XR_SCENE_COMPUTE_CONSISTENCY_OCCLUSION_OPTIMIZED_MSFT, 3) \ _(XR_SCENE_COMPUTE_CONSISTENCY_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrMeshComputeLodMSFT(_) \ _(XR_MESH_COMPUTE_LOD_COARSE_MSFT, 1) \ _(XR_MESH_COMPUTE_LOD_MEDIUM_MSFT, 2) \ _(XR_MESH_COMPUTE_LOD_FINE_MSFT, 3) \ _(XR_MESH_COMPUTE_LOD_UNLIMITED_MSFT, 4) \ _(XR_MESH_COMPUTE_LOD_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSceneComponentTypeMSFT(_) \ _(XR_SCENE_COMPONENT_TYPE_INVALID_MSFT, -1) \ _(XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT, 1) \ _(XR_SCENE_COMPONENT_TYPE_PLANE_MSFT, 2) \ _(XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT, 3) \ _(XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT, 4) \ _(XR_SCENE_COMPONENT_TYPE_SERIALIZED_SCENE_FRAGMENT_MSFT, 1000098000) \ _(XR_SCENE_COMPONENT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSceneObjectTypeMSFT(_) \ _(XR_SCENE_OBJECT_TYPE_UNCATEGORIZED_MSFT, -1) \ _(XR_SCENE_OBJECT_TYPE_BACKGROUND_MSFT, 1) \ _(XR_SCENE_OBJECT_TYPE_WALL_MSFT, 2) \ _(XR_SCENE_OBJECT_TYPE_FLOOR_MSFT, 3) \ _(XR_SCENE_OBJECT_TYPE_CEILING_MSFT, 4) \ _(XR_SCENE_OBJECT_TYPE_PLATFORM_MSFT, 5) \ _(XR_SCENE_OBJECT_TYPE_INFERRED_MSFT, 6) \ _(XR_SCENE_OBJECT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrScenePlaneAlignmentTypeMSFT(_) \ _(XR_SCENE_PLANE_ALIGNMENT_TYPE_NON_ORTHOGONAL_MSFT, 0) \ _(XR_SCENE_PLANE_ALIGNMENT_TYPE_HORIZONTAL_MSFT, 1) \ _(XR_SCENE_PLANE_ALIGNMENT_TYPE_VERTICAL_MSFT, 2) \ _(XR_SCENE_PLANE_ALIGNMENT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSceneComputeStateMSFT(_) \ _(XR_SCENE_COMPUTE_STATE_NONE_MSFT, 0) \ _(XR_SCENE_COMPUTE_STATE_UPDATING_MSFT, 1) \ _(XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT, 2) \ _(XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT, 3) \ _(XR_SCENE_COMPUTE_STATE_MAX_ENUM_MSFT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrEyeExpressionHTC(_) \ _(XR_EYE_EXPRESSION_LEFT_BLINK_HTC, 0) \ _(XR_EYE_EXPRESSION_LEFT_WIDE_HTC, 1) \ _(XR_EYE_EXPRESSION_RIGHT_BLINK_HTC, 2) \ _(XR_EYE_EXPRESSION_RIGHT_WIDE_HTC, 3) \ _(XR_EYE_EXPRESSION_LEFT_SQUEEZE_HTC, 4) \ _(XR_EYE_EXPRESSION_RIGHT_SQUEEZE_HTC, 5) \ _(XR_EYE_EXPRESSION_LEFT_DOWN_HTC, 6) \ _(XR_EYE_EXPRESSION_RIGHT_DOWN_HTC, 7) \ _(XR_EYE_EXPRESSION_LEFT_OUT_HTC, 8) \ _(XR_EYE_EXPRESSION_RIGHT_IN_HTC, 9) \ _(XR_EYE_EXPRESSION_LEFT_IN_HTC, 10) \ _(XR_EYE_EXPRESSION_RIGHT_OUT_HTC, 11) \ _(XR_EYE_EXPRESSION_LEFT_UP_HTC, 12) \ _(XR_EYE_EXPRESSION_RIGHT_UP_HTC, 13) \ _(XR_EYE_EXPRESSION_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrLipExpressionHTC(_) \ _(XR_LIP_EXPRESSION_JAW_RIGHT_HTC, 0) \ _(XR_LIP_EXPRESSION_JAW_LEFT_HTC, 1) \ _(XR_LIP_EXPRESSION_JAW_FORWARD_HTC, 2) \ _(XR_LIP_EXPRESSION_JAW_OPEN_HTC, 3) \ _(XR_LIP_EXPRESSION_MOUTH_APE_SHAPE_HTC, 4) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_RIGHT_HTC, 5) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_LEFT_HTC, 6) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_RIGHT_HTC, 7) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_LEFT_HTC, 8) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_OVERTURN_HTC, 9) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_OVERTURN_HTC, 10) \ _(XR_LIP_EXPRESSION_MOUTH_POUT_HTC, 11) \ _(XR_LIP_EXPRESSION_MOUTH_SMILE_RIGHT_HTC, 12) \ _(XR_LIP_EXPRESSION_MOUTH_SMILE_LEFT_HTC, 13) \ _(XR_LIP_EXPRESSION_MOUTH_SAD_RIGHT_HTC, 14) \ _(XR_LIP_EXPRESSION_MOUTH_SAD_LEFT_HTC, 15) \ _(XR_LIP_EXPRESSION_CHEEK_PUFF_RIGHT_HTC, 16) \ _(XR_LIP_EXPRESSION_CHEEK_PUFF_LEFT_HTC, 17) \ _(XR_LIP_EXPRESSION_CHEEK_SUCK_HTC, 18) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_UPRIGHT_HTC, 19) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_UPLEFT_HTC, 20) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNRIGHT_HTC, 21) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_DOWNLEFT_HTC, 22) \ _(XR_LIP_EXPRESSION_MOUTH_UPPER_INSIDE_HTC, 23) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_INSIDE_HTC, 24) \ _(XR_LIP_EXPRESSION_MOUTH_LOWER_OVERLAY_HTC, 25) \ _(XR_LIP_EXPRESSION_TONGUE_LONGSTEP1_HTC, 26) \ _(XR_LIP_EXPRESSION_TONGUE_LEFT_HTC, 27) \ _(XR_LIP_EXPRESSION_TONGUE_RIGHT_HTC, 28) \ _(XR_LIP_EXPRESSION_TONGUE_UP_HTC, 29) \ _(XR_LIP_EXPRESSION_TONGUE_DOWN_HTC, 30) \ _(XR_LIP_EXPRESSION_TONGUE_ROLL_HTC, 31) \ _(XR_LIP_EXPRESSION_TONGUE_LONGSTEP2_HTC, 32) \ _(XR_LIP_EXPRESSION_TONGUE_UPRIGHT_MORPH_HTC, 33) \ _(XR_LIP_EXPRESSION_TONGUE_UPLEFT_MORPH_HTC, 34) \ _(XR_LIP_EXPRESSION_TONGUE_DOWNRIGHT_MORPH_HTC, 35) \ _(XR_LIP_EXPRESSION_TONGUE_DOWNLEFT_MORPH_HTC, 36) \ _(XR_LIP_EXPRESSION_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFacialTrackingTypeHTC(_) \ _(XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC, 1) \ _(XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC, 2) \ _(XR_FACIAL_TRACKING_TYPE_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrColorSpaceFB(_) \ _(XR_COLOR_SPACE_UNMANAGED_FB, 0) \ _(XR_COLOR_SPACE_REC2020_FB, 1) \ _(XR_COLOR_SPACE_REC709_FB, 2) \ _(XR_COLOR_SPACE_RIFT_CV1_FB, 3) \ _(XR_COLOR_SPACE_RIFT_S_FB, 4) \ _(XR_COLOR_SPACE_QUEST_FB, 5) \ _(XR_COLOR_SPACE_P3_FB, 6) \ _(XR_COLOR_SPACE_ADOBE_RGB_FB, 7) \ _(XR_COLOR_SPACE_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSpaceComponentTypeFB(_) \ _(XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB, 0) \ _(XR_SPACE_COMPONENT_TYPE_STORABLE_FB, 1) \ _(XR_SPACE_COMPONENT_TYPE_SHARABLE_FB, 2) \ _(XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB, 3) \ _(XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB, 4) \ _(XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB, 5) \ _(XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB, 6) \ _(XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB, 7) \ _(XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFoveationLevelFB(_) \ _(XR_FOVEATION_LEVEL_NONE_FB, 0) \ _(XR_FOVEATION_LEVEL_LOW_FB, 1) \ _(XR_FOVEATION_LEVEL_MEDIUM_FB, 2) \ _(XR_FOVEATION_LEVEL_HIGH_FB, 3) \ _(XR_FOVEATION_LEVEL_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFoveationDynamicFB(_) \ _(XR_FOVEATION_DYNAMIC_DISABLED_FB, 0) \ _(XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_FB, 1) \ _(XR_FOVEATION_DYNAMIC_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrWindingOrderFB(_) \ _(XR_WINDING_ORDER_UNKNOWN_FB, 0) \ _(XR_WINDING_ORDER_CW_FB, 1) \ _(XR_WINDING_ORDER_CCW_FB, 2) \ _(XR_WINDING_ORDER_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPassthroughLayerPurposeFB(_) \ _(XR_PASSTHROUGH_LAYER_PURPOSE_RECONSTRUCTION_FB, 0) \ _(XR_PASSTHROUGH_LAYER_PURPOSE_PROJECTED_FB, 1) \ _(XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_HANDS_FB, 1000203001) \ _(XR_PASSTHROUGH_LAYER_PURPOSE_TRACKED_KEYBOARD_MASKED_HANDS_FB, 1000203002) \ _(XR_PASSTHROUGH_LAYER_PURPOSE_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandForearmJointULTRALEAP(_) \ _(XR_HAND_FOREARM_JOINT_PALM_ULTRALEAP, 0) \ _(XR_HAND_FOREARM_JOINT_WRIST_ULTRALEAP, 1) \ _(XR_HAND_FOREARM_JOINT_THUMB_METACARPAL_ULTRALEAP, 2) \ _(XR_HAND_FOREARM_JOINT_THUMB_PROXIMAL_ULTRALEAP, 3) \ _(XR_HAND_FOREARM_JOINT_THUMB_DISTAL_ULTRALEAP, 4) \ _(XR_HAND_FOREARM_JOINT_THUMB_TIP_ULTRALEAP, 5) \ _(XR_HAND_FOREARM_JOINT_INDEX_METACARPAL_ULTRALEAP, 6) \ _(XR_HAND_FOREARM_JOINT_INDEX_PROXIMAL_ULTRALEAP, 7) \ _(XR_HAND_FOREARM_JOINT_INDEX_INTERMEDIATE_ULTRALEAP, 8) \ _(XR_HAND_FOREARM_JOINT_INDEX_DISTAL_ULTRALEAP, 9) \ _(XR_HAND_FOREARM_JOINT_INDEX_TIP_ULTRALEAP, 10) \ _(XR_HAND_FOREARM_JOINT_MIDDLE_METACARPAL_ULTRALEAP, 11) \ _(XR_HAND_FOREARM_JOINT_MIDDLE_PROXIMAL_ULTRALEAP, 12) \ _(XR_HAND_FOREARM_JOINT_MIDDLE_INTERMEDIATE_ULTRALEAP, 13) \ _(XR_HAND_FOREARM_JOINT_MIDDLE_DISTAL_ULTRALEAP, 14) \ _(XR_HAND_FOREARM_JOINT_MIDDLE_TIP_ULTRALEAP, 15) \ _(XR_HAND_FOREARM_JOINT_RING_METACARPAL_ULTRALEAP, 16) \ _(XR_HAND_FOREARM_JOINT_RING_PROXIMAL_ULTRALEAP, 17) \ _(XR_HAND_FOREARM_JOINT_RING_INTERMEDIATE_ULTRALEAP, 18) \ _(XR_HAND_FOREARM_JOINT_RING_DISTAL_ULTRALEAP, 19) \ _(XR_HAND_FOREARM_JOINT_RING_TIP_ULTRALEAP, 20) \ _(XR_HAND_FOREARM_JOINT_LITTLE_METACARPAL_ULTRALEAP, 21) \ _(XR_HAND_FOREARM_JOINT_LITTLE_PROXIMAL_ULTRALEAP, 22) \ _(XR_HAND_FOREARM_JOINT_LITTLE_INTERMEDIATE_ULTRALEAP, 23) \ _(XR_HAND_FOREARM_JOINT_LITTLE_DISTAL_ULTRALEAP, 24) \ _(XR_HAND_FOREARM_JOINT_LITTLE_TIP_ULTRALEAP, 25) \ _(XR_HAND_FOREARM_JOINT_ELBOW_ULTRALEAP, 26) \ _(XR_HAND_FOREARM_JOINT_MAX_ENUM_ULTRALEAP, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSpaceQueryActionFB(_) \ _(XR_SPACE_QUERY_ACTION_LOAD_FB, 0) \ _(XR_SPACE_QUERY_ACTION_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSpaceStorageLocationFB(_) \ _(XR_SPACE_STORAGE_LOCATION_INVALID_FB, 0) \ _(XR_SPACE_STORAGE_LOCATION_LOCAL_FB, 1) \ _(XR_SPACE_STORAGE_LOCATION_CLOUD_FB, 2) \ _(XR_SPACE_STORAGE_LOCATION_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrSpacePersistenceModeFB(_) \ _(XR_SPACE_PERSISTENCE_MODE_INVALID_FB, 0) \ _(XR_SPACE_PERSISTENCE_MODE_INDEFINITE_FB, 1) \ _(XR_SPACE_PERSISTENCE_MODE_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFaceExpressionFB(_) \ _(XR_FACE_EXPRESSION_BROW_LOWERER_L_FB, 0) \ _(XR_FACE_EXPRESSION_BROW_LOWERER_R_FB, 1) \ _(XR_FACE_EXPRESSION_CHEEK_PUFF_L_FB, 2) \ _(XR_FACE_EXPRESSION_CHEEK_PUFF_R_FB, 3) \ _(XR_FACE_EXPRESSION_CHEEK_RAISER_L_FB, 4) \ _(XR_FACE_EXPRESSION_CHEEK_RAISER_R_FB, 5) \ _(XR_FACE_EXPRESSION_CHEEK_SUCK_L_FB, 6) \ _(XR_FACE_EXPRESSION_CHEEK_SUCK_R_FB, 7) \ _(XR_FACE_EXPRESSION_CHIN_RAISER_B_FB, 8) \ _(XR_FACE_EXPRESSION_CHIN_RAISER_T_FB, 9) \ _(XR_FACE_EXPRESSION_DIMPLER_L_FB, 10) \ _(XR_FACE_EXPRESSION_DIMPLER_R_FB, 11) \ _(XR_FACE_EXPRESSION_EYES_CLOSED_L_FB, 12) \ _(XR_FACE_EXPRESSION_EYES_CLOSED_R_FB, 13) \ _(XR_FACE_EXPRESSION_EYES_LOOK_DOWN_L_FB, 14) \ _(XR_FACE_EXPRESSION_EYES_LOOK_DOWN_R_FB, 15) \ _(XR_FACE_EXPRESSION_EYES_LOOK_LEFT_L_FB, 16) \ _(XR_FACE_EXPRESSION_EYES_LOOK_LEFT_R_FB, 17) \ _(XR_FACE_EXPRESSION_EYES_LOOK_RIGHT_L_FB, 18) \ _(XR_FACE_EXPRESSION_EYES_LOOK_RIGHT_R_FB, 19) \ _(XR_FACE_EXPRESSION_EYES_LOOK_UP_L_FB, 20) \ _(XR_FACE_EXPRESSION_EYES_LOOK_UP_R_FB, 21) \ _(XR_FACE_EXPRESSION_INNER_BROW_RAISER_L_FB, 22) \ _(XR_FACE_EXPRESSION_INNER_BROW_RAISER_R_FB, 23) \ _(XR_FACE_EXPRESSION_JAW_DROP_FB, 24) \ _(XR_FACE_EXPRESSION_JAW_SIDEWAYS_LEFT_FB, 25) \ _(XR_FACE_EXPRESSION_JAW_SIDEWAYS_RIGHT_FB, 26) \ _(XR_FACE_EXPRESSION_JAW_THRUST_FB, 27) \ _(XR_FACE_EXPRESSION_LID_TIGHTENER_L_FB, 28) \ _(XR_FACE_EXPRESSION_LID_TIGHTENER_R_FB, 29) \ _(XR_FACE_EXPRESSION_LIP_CORNER_DEPRESSOR_L_FB, 30) \ _(XR_FACE_EXPRESSION_LIP_CORNER_DEPRESSOR_R_FB, 31) \ _(XR_FACE_EXPRESSION_LIP_CORNER_PULLER_L_FB, 32) \ _(XR_FACE_EXPRESSION_LIP_CORNER_PULLER_R_FB, 33) \ _(XR_FACE_EXPRESSION_LIP_FUNNELER_LB_FB, 34) \ _(XR_FACE_EXPRESSION_LIP_FUNNELER_LT_FB, 35) \ _(XR_FACE_EXPRESSION_LIP_FUNNELER_RB_FB, 36) \ _(XR_FACE_EXPRESSION_LIP_FUNNELER_RT_FB, 37) \ _(XR_FACE_EXPRESSION_LIP_PRESSOR_L_FB, 38) \ _(XR_FACE_EXPRESSION_LIP_PRESSOR_R_FB, 39) \ _(XR_FACE_EXPRESSION_LIP_PUCKER_L_FB, 40) \ _(XR_FACE_EXPRESSION_LIP_PUCKER_R_FB, 41) \ _(XR_FACE_EXPRESSION_LIP_STRETCHER_L_FB, 42) \ _(XR_FACE_EXPRESSION_LIP_STRETCHER_R_FB, 43) \ _(XR_FACE_EXPRESSION_LIP_SUCK_LB_FB, 44) \ _(XR_FACE_EXPRESSION_LIP_SUCK_LT_FB, 45) \ _(XR_FACE_EXPRESSION_LIP_SUCK_RB_FB, 46) \ _(XR_FACE_EXPRESSION_LIP_SUCK_RT_FB, 47) \ _(XR_FACE_EXPRESSION_LIP_TIGHTENER_L_FB, 48) \ _(XR_FACE_EXPRESSION_LIP_TIGHTENER_R_FB, 49) \ _(XR_FACE_EXPRESSION_LIPS_TOWARD_FB, 50) \ _(XR_FACE_EXPRESSION_LOWER_LIP_DEPRESSOR_L_FB, 51) \ _(XR_FACE_EXPRESSION_LOWER_LIP_DEPRESSOR_R_FB, 52) \ _(XR_FACE_EXPRESSION_MOUTH_LEFT_FB, 53) \ _(XR_FACE_EXPRESSION_MOUTH_RIGHT_FB, 54) \ _(XR_FACE_EXPRESSION_NOSE_WRINKLER_L_FB, 55) \ _(XR_FACE_EXPRESSION_NOSE_WRINKLER_R_FB, 56) \ _(XR_FACE_EXPRESSION_OUTER_BROW_RAISER_L_FB, 57) \ _(XR_FACE_EXPRESSION_OUTER_BROW_RAISER_R_FB, 58) \ _(XR_FACE_EXPRESSION_UPPER_LID_RAISER_L_FB, 59) \ _(XR_FACE_EXPRESSION_UPPER_LID_RAISER_R_FB, 60) \ _(XR_FACE_EXPRESSION_UPPER_LIP_RAISER_L_FB, 61) \ _(XR_FACE_EXPRESSION_UPPER_LIP_RAISER_R_FB, 62) \ _(XR_FACE_EXPRESSION_COUNT_FB, 63) \ _(XR_FACE_EXPRESSION_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFaceExpressionSetFB(_) \ _(XR_FACE_EXPRESSION_SET_DEFAULT_FB, 0) \ _(XR_FACE_EXPRESSION_SET_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFaceConfidenceFB(_) \ _(XR_FACE_CONFIDENCE_LOWER_FACE_FB, 0) \ _(XR_FACE_CONFIDENCE_UPPER_FACE_FB, 1) \ _(XR_FACE_CONFIDENCE_COUNT_FB, 2) \ _(XR_FACE_CONFIDENCE_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrEyePositionFB(_) \ _(XR_EYE_POSITION_LEFT_FB, 0) \ _(XR_EYE_POSITION_RIGHT_FB, 1) \ _(XR_EYE_POSITION_COUNT_FB, 2) \ _(XR_EYE_POSITION_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrCompareOpFB(_) \ _(XR_COMPARE_OP_NEVER_FB, 0) \ _(XR_COMPARE_OP_LESS_FB, 1) \ _(XR_COMPARE_OP_EQUAL_FB, 2) \ _(XR_COMPARE_OP_LESS_OR_EQUAL_FB, 3) \ _(XR_COMPARE_OP_GREATER_FB, 4) \ _(XR_COMPARE_OP_NOT_EQUAL_FB, 5) \ _(XR_COMPARE_OP_GREATER_OR_EQUAL_FB, 6) \ _(XR_COMPARE_OP_ALWAYS_FB, 7) \ _(XR_COMPARE_OPFB_MAX_ENUM_FB, 0x7FFFFFFF) #define XR_LIST_ENUM_XrLocalDimmingModeMETA(_) \ _(XR_LOCAL_DIMMING_MODE_OFF_META, 0) \ _(XR_LOCAL_DIMMING_MODE_ON_META, 1) \ _(XR_LOCAL_DIMMING_MODE_MAX_ENUM_META, 0x7FFFFFFF) #define XR_LIST_ENUM_XrVirtualKeyboardLocationTypeMETA(_) \ _(XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_CUSTOM_META, 0) \ _(XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_FAR_META, 1) \ _(XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_DIRECT_META, 2) \ _(XR_VIRTUAL_KEYBOARD_LOCATION_TYPE_MAX_ENUM_META, 0x7FFFFFFF) #define XR_LIST_ENUM_XrVirtualKeyboardInputSourceMETA(_) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_RAY_LEFT_META, 1) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_RAY_RIGHT_META, 2) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_RAY_LEFT_META, 3) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_RAY_RIGHT_META, 4) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_DIRECT_LEFT_META, 5) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_CONTROLLER_DIRECT_RIGHT_META, 6) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_DIRECT_INDEX_TIP_LEFT_META, 7) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_HAND_DIRECT_INDEX_TIP_RIGHT_META, 8) \ _(XR_VIRTUAL_KEYBOARD_INPUT_SOURCE_MAX_ENUM_META, 0x7FFFFFFF) #define XR_LIST_ENUM_XrExternalCameraAttachedToDeviceOCULUS(_) \ _(XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_NONE_OCULUS, 0) \ _(XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_HMD_OCULUS, 1) \ _(XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_LTOUCH_OCULUS, 2) \ _(XR_EXTERNAL_CAMERA_ATTACHED_TO_DEVICE_RTOUCH_OCULUS, 3) \ _(XR_EXTERNAL_CAMERA_ATTACHED_TODEVICE_MAX_ENUM_OCULUS, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPerformanceMetricsCounterUnitMETA(_) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_GENERIC_META, 0) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_PERCENTAGE_META, 1) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_MILLISECONDS_META, 2) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_BYTES_META, 3) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_HERTZ_META, 4) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_MAX_ENUM_META, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPassthroughColorLutChannelsMETA(_) \ _(XR_PASSTHROUGH_COLOR_LUT_CHANNELS_RGB_META, 1) \ _(XR_PASSTHROUGH_COLOR_LUT_CHANNELS_RGBA_META, 2) \ _(XR_PASSTHROUGH_COLOR_LUT_CHANNELS_MAX_ENUM_META, 0x7FFFFFFF) #define XR_LIST_ENUM_XrTrackingOptimizationSettingsDomainQCOM(_) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_DOMAIN_ALL_QCOM, 1) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_DOMAIN_MAX_ENUM_QCOM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrTrackingOptimizationSettingsHintQCOM(_) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_NONE_QCOM, 0) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_LONG_RANGE_PRIORIZATION_QCOM, 1) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_CLOSE_RANGE_PRIORIZATION_QCOM, 2) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_LOW_POWER_PRIORIZATION_QCOM, 3) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_HIGH_POWER_PRIORIZATION_QCOM, 4) \ _(XR_TRACKING_OPTIMIZATION_SETTINGS_HINT_MAX_ENUM_QCOM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPassthroughFormHTC(_) \ _(XR_PASSTHROUGH_FORM_PLANAR_HTC, 0) \ _(XR_PASSTHROUGH_FORM_PROJECTED_HTC, 1) \ _(XR_PASSTHROUGH_FORM_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFoveationModeHTC(_) \ _(XR_FOVEATION_MODE_DISABLE_HTC, 0) \ _(XR_FOVEATION_MODE_FIXED_HTC, 1) \ _(XR_FOVEATION_MODE_DYNAMIC_HTC, 2) \ _(XR_FOVEATION_MODE_CUSTOM_HTC, 3) \ _(XR_FOVEATION_MODE_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFoveationLevelHTC(_) \ _(XR_FOVEATION_LEVEL_NONE_HTC, 0) \ _(XR_FOVEATION_LEVEL_LOW_HTC, 1) \ _(XR_FOVEATION_LEVEL_MEDIUM_HTC, 2) \ _(XR_FOVEATION_LEVEL_HIGH_HTC, 3) \ _(XR_FOVEATION_LEVEL_MAX_ENUM_HTC, 0x7FFFFFFF) #define XR_LIST_ENUM_XrForceFeedbackCurlLocationMNDX(_) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_THUMB_CURL_MNDX, 0) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_INDEX_CURL_MNDX, 1) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_MIDDLE_CURL_MNDX, 2) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_RING_CURL_MNDX, 3) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_LITTLE_CURL_MNDX, 4) \ _(XR_FORCE_FEEDBACK_CURL_LOCATION_MAX_ENUM_MNDX, 0x7FFFFFFF) #define XR_LIST_ENUM_XrHandTrackingDataSourceEXT(_) \ _(XR_HAND_TRACKING_DATA_SOURCE_UNOBSTRUCTED_EXT, 1) \ _(XR_HAND_TRACKING_DATA_SOURCE_CONTROLLER_EXT, 2) \ _(XR_HAND_TRACKING_DATA_SOURCE_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPlaneDetectorOrientationEXT(_) \ _(XR_PLANE_DETECTOR_ORIENTATION_HORIZONTAL_UPWARD_EXT, 0) \ _(XR_PLANE_DETECTOR_ORIENTATION_HORIZONTAL_DOWNWARD_EXT, 1) \ _(XR_PLANE_DETECTOR_ORIENTATION_VERTICAL_EXT, 2) \ _(XR_PLANE_DETECTOR_ORIENTATION_ARBITRARY_EXT, 3) \ _(XR_PLANE_DETECTOR_ORIENTATION_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPlaneDetectorSemanticTypeEXT(_) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_UNDEFINED_EXT, 0) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_CEILING_EXT, 1) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_FLOOR_EXT, 2) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_WALL_EXT, 3) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_PLATFORM_EXT, 4) \ _(XR_PLANE_DETECTOR_SEMANTIC_TYPE_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_ENUM_XrPlaneDetectionStateEXT(_) \ _(XR_PLANE_DETECTION_STATE_NONE_EXT, 0) \ _(XR_PLANE_DETECTION_STATE_PENDING_EXT, 1) \ _(XR_PLANE_DETECTION_STATE_DONE_EXT, 2) \ _(XR_PLANE_DETECTION_STATE_ERROR_EXT, 3) \ _(XR_PLANE_DETECTION_STATE_FATAL_EXT, 4) \ _(XR_PLANE_DETECTION_STATE_MAX_ENUM_EXT, 0x7FFFFFFF) #define XR_LIST_BITS_XrInstanceCreateFlags(_) #define XR_LIST_BITS_XrSessionCreateFlags(_) #define XR_LIST_BITS_XrSpaceVelocityFlags(_) \ _(XR_SPACE_VELOCITY_LINEAR_VALID_BIT, 0x00000001) \ _(XR_SPACE_VELOCITY_ANGULAR_VALID_BIT, 0x00000002) \ #define XR_LIST_BITS_XrSpaceLocationFlags(_) \ _(XR_SPACE_LOCATION_ORIENTATION_VALID_BIT, 0x00000001) \ _(XR_SPACE_LOCATION_POSITION_VALID_BIT, 0x00000002) \ _(XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT, 0x00000004) \ _(XR_SPACE_LOCATION_POSITION_TRACKED_BIT, 0x00000008) \ #define XR_LIST_BITS_XrSwapchainCreateFlags(_) \ _(XR_SWAPCHAIN_CREATE_PROTECTED_CONTENT_BIT, 0x00000001) \ _(XR_SWAPCHAIN_CREATE_STATIC_IMAGE_BIT, 0x00000002) \ #define XR_LIST_BITS_XrSwapchainUsageFlags(_) \ _(XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT, 0x00000001) \ _(XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0x00000002) \ _(XR_SWAPCHAIN_USAGE_UNORDERED_ACCESS_BIT, 0x00000004) \ _(XR_SWAPCHAIN_USAGE_TRANSFER_SRC_BIT, 0x00000008) \ _(XR_SWAPCHAIN_USAGE_TRANSFER_DST_BIT, 0x00000010) \ _(XR_SWAPCHAIN_USAGE_SAMPLED_BIT, 0x00000020) \ _(XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, 0x00000040) \ _(XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND, 0x00000080) \ _(XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_KHR, XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND) \ #define XR_LIST_BITS_XrCompositionLayerFlags(_) \ _(XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, 0x00000001) \ _(XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT, 0x00000002) \ _(XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT, 0x00000004) \ #define XR_LIST_BITS_XrViewStateFlags(_) \ _(XR_VIEW_STATE_ORIENTATION_VALID_BIT, 0x00000001) \ _(XR_VIEW_STATE_POSITION_VALID_BIT, 0x00000002) \ _(XR_VIEW_STATE_ORIENTATION_TRACKED_BIT, 0x00000004) \ _(XR_VIEW_STATE_POSITION_TRACKED_BIT, 0x00000008) \ #define XR_LIST_BITS_XrInputSourceLocalizedNameFlags(_) \ _(XR_INPUT_SOURCE_LOCALIZED_NAME_USER_PATH_BIT, 0x00000001) \ _(XR_INPUT_SOURCE_LOCALIZED_NAME_INTERACTION_PROFILE_BIT, 0x00000002) \ _(XR_INPUT_SOURCE_LOCALIZED_NAME_COMPONENT_BIT, 0x00000004) \ #define XR_LIST_BITS_XrVulkanInstanceCreateFlagsKHR(_) #define XR_LIST_BITS_XrVulkanDeviceCreateFlagsKHR(_) #define XR_LIST_BITS_XrDebugUtilsMessageSeverityFlagsEXT(_) \ _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT, 0x00000001) \ _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, 0x00000010) \ _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, 0x00000100) \ _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, 0x00001000) \ #define XR_LIST_BITS_XrDebugUtilsMessageTypeFlagsEXT(_) \ _(XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 0x00000001) \ _(XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 0x00000002) \ _(XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, 0x00000004) \ _(XR_DEBUG_UTILS_MESSAGE_TYPE_CONFORMANCE_BIT_EXT, 0x00000008) \ #define XR_LIST_BITS_XrOverlaySessionCreateFlagsEXTX(_) #define XR_LIST_BITS_XrOverlayMainSessionFlagsEXTX(_) \ _(XR_OVERLAY_MAIN_SESSION_ENABLED_COMPOSITION_LAYER_INFO_DEPTH_BIT_EXTX, 0x00000001) \ #define XR_LIST_BITS_XrCompositionLayerImageLayoutFlagsFB(_) \ _(XR_COMPOSITION_LAYER_IMAGE_LAYOUT_VERTICAL_FLIP_BIT_FB, 0x00000001) \ #define XR_LIST_BITS_XrAndroidSurfaceSwapchainFlagsFB(_) \ _(XR_ANDROID_SURFACE_SWAPCHAIN_SYNCHRONOUS_BIT_FB, 0x00000001) \ _(XR_ANDROID_SURFACE_SWAPCHAIN_USE_TIMESTAMPS_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrCompositionLayerSecureContentFlagsFB(_) \ _(XR_COMPOSITION_LAYER_SECURE_CONTENT_EXCLUDE_LAYER_BIT_FB, 0x00000001) \ _(XR_COMPOSITION_LAYER_SECURE_CONTENT_REPLACE_LAYER_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrHandTrackingAimFlagsFB(_) \ _(XR_HAND_TRACKING_AIM_COMPUTED_BIT_FB, 0x00000001) \ _(XR_HAND_TRACKING_AIM_VALID_BIT_FB, 0x00000002) \ _(XR_HAND_TRACKING_AIM_INDEX_PINCHING_BIT_FB, 0x00000004) \ _(XR_HAND_TRACKING_AIM_MIDDLE_PINCHING_BIT_FB, 0x00000008) \ _(XR_HAND_TRACKING_AIM_RING_PINCHING_BIT_FB, 0x00000010) \ _(XR_HAND_TRACKING_AIM_LITTLE_PINCHING_BIT_FB, 0x00000020) \ _(XR_HAND_TRACKING_AIM_SYSTEM_GESTURE_BIT_FB, 0x00000040) \ _(XR_HAND_TRACKING_AIM_DOMINANT_HAND_BIT_FB, 0x00000080) \ _(XR_HAND_TRACKING_AIM_MENU_PRESSED_BIT_FB, 0x00000100) \ #define XR_LIST_BITS_XrSwapchainCreateFoveationFlagsFB(_) \ _(XR_SWAPCHAIN_CREATE_FOVEATION_SCALED_BIN_BIT_FB, 0x00000001) \ _(XR_SWAPCHAIN_CREATE_FOVEATION_FRAGMENT_DENSITY_MAP_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrSwapchainStateFoveationFlagsFB(_) #define XR_LIST_BITS_XrKeyboardTrackingFlagsFB(_) \ _(XR_KEYBOARD_TRACKING_EXISTS_BIT_FB, 0x00000001) \ _(XR_KEYBOARD_TRACKING_LOCAL_BIT_FB, 0x00000002) \ _(XR_KEYBOARD_TRACKING_REMOTE_BIT_FB, 0x00000004) \ _(XR_KEYBOARD_TRACKING_CONNECTED_BIT_FB, 0x00000008) \ #define XR_LIST_BITS_XrKeyboardTrackingQueryFlagsFB(_) \ _(XR_KEYBOARD_TRACKING_QUERY_LOCAL_BIT_FB, 0x00000002) \ _(XR_KEYBOARD_TRACKING_QUERY_REMOTE_BIT_FB, 0x00000004) \ #define XR_LIST_BITS_XrTriangleMeshFlagsFB(_) \ _(XR_TRIANGLE_MESH_MUTABLE_BIT_FB, 0x00000001) \ #define XR_LIST_BITS_XrPassthroughCapabilityFlagsFB(_) \ _(XR_PASSTHROUGH_CAPABILITY_BIT_FB, 0x00000001) \ _(XR_PASSTHROUGH_CAPABILITY_COLOR_BIT_FB, 0x00000002) \ _(XR_PASSTHROUGH_CAPABILITY_LAYER_DEPTH_BIT_FB, 0x00000004) \ #define XR_LIST_BITS_XrPassthroughFlagsFB(_) \ _(XR_PASSTHROUGH_IS_RUNNING_AT_CREATION_BIT_FB, 0x00000001) \ _(XR_PASSTHROUGH_LAYER_DEPTH_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrPassthroughStateChangedFlagsFB(_) \ _(XR_PASSTHROUGH_STATE_CHANGED_REINIT_REQUIRED_BIT_FB, 0x00000001) \ _(XR_PASSTHROUGH_STATE_CHANGED_NON_RECOVERABLE_ERROR_BIT_FB, 0x00000002) \ _(XR_PASSTHROUGH_STATE_CHANGED_RECOVERABLE_ERROR_BIT_FB, 0x00000004) \ _(XR_PASSTHROUGH_STATE_CHANGED_RESTORED_ERROR_BIT_FB, 0x00000008) \ #define XR_LIST_BITS_XrRenderModelFlagsFB(_) \ _(XR_RENDER_MODEL_SUPPORTS_GLTF_2_0_SUBSET_1_BIT_FB, 0x00000001) \ _(XR_RENDER_MODEL_SUPPORTS_GLTF_2_0_SUBSET_2_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrFrameEndInfoFlagsML(_) \ _(XR_FRAME_END_INFO_PROTECTED_BIT_ML, 0x00000001) \ _(XR_FRAME_END_INFO_VIGNETTE_BIT_ML, 0x00000002) \ #define XR_LIST_BITS_XrGlobalDimmerFrameEndInfoFlagsML(_) \ _(XR_GLOBAL_DIMMER_FRAME_END_INFO_ENABLED_BIT_ML, 0x00000001) \ #define XR_LIST_BITS_XrCompositionLayerSpaceWarpInfoFlagsFB(_) \ _(XR_COMPOSITION_LAYER_SPACE_WARP_INFO_FRAME_SKIP_BIT_FB, 0x00000001) \ #define XR_LIST_BITS_XrSemanticLabelsSupportFlagsFB(_) \ _(XR_SEMANTIC_LABELS_SUPPORT_MULTIPLE_SEMANTIC_LABELS_BIT_FB, 0x00000001) \ _(XR_SEMANTIC_LABELS_SUPPORT_ACCEPT_DESK_TO_TABLE_MIGRATION_BIT_FB, 0x00000002) \ #define XR_LIST_BITS_XrDigitalLensControlFlagsALMALENCE(_) \ _(XR_DIGITAL_LENS_CONTROL_PROCESSING_DISABLE_BIT_ALMALENCE, 0x00000001) \ #define XR_LIST_BITS_XrFoveationEyeTrackedProfileCreateFlagsMETA(_) #define XR_LIST_BITS_XrFoveationEyeTrackedStateFlagsMETA(_) \ _(XR_FOVEATION_EYE_TRACKED_STATE_VALID_BIT_META, 0x00000001) \ #define XR_LIST_BITS_XrCompositionLayerSettingsFlagsFB(_) \ _(XR_COMPOSITION_LAYER_SETTINGS_NORMAL_SUPER_SAMPLING_BIT_FB, 0x00000001) \ _(XR_COMPOSITION_LAYER_SETTINGS_QUALITY_SUPER_SAMPLING_BIT_FB, 0x00000002) \ _(XR_COMPOSITION_LAYER_SETTINGS_NORMAL_SHARPENING_BIT_FB, 0x00000004) \ _(XR_COMPOSITION_LAYER_SETTINGS_QUALITY_SHARPENING_BIT_FB, 0x00000008) \ #define XR_LIST_BITS_XrVirtualKeyboardInputStateFlagsMETA(_) \ _(XR_VIRTUAL_KEYBOARD_INPUT_STATE_PRESSED_BIT_META, 0x00000001) \ #define XR_LIST_BITS_XrExternalCameraStatusFlagsOCULUS(_) \ _(XR_EXTERNAL_CAMERA_STATUS_CONNECTED_BIT_OCULUS, 0x00000001) \ _(XR_EXTERNAL_CAMERA_STATUS_CALIBRATING_BIT_OCULUS, 0x00000002) \ _(XR_EXTERNAL_CAMERA_STATUS_CALIBRATION_FAILED_BIT_OCULUS, 0x00000004) \ _(XR_EXTERNAL_CAMERA_STATUS_CALIBRATED_BIT_OCULUS, 0x00000008) \ _(XR_EXTERNAL_CAMERA_STATUS_CAPTURING_BIT_OCULUS, 0x00000010) \ #define XR_LIST_BITS_XrPerformanceMetricsCounterFlagsMETA(_) \ _(XR_PERFORMANCE_METRICS_COUNTER_ANY_VALUE_VALID_BIT_META, 0x00000001) \ _(XR_PERFORMANCE_METRICS_COUNTER_UINT_VALUE_VALID_BIT_META, 0x00000002) \ _(XR_PERFORMANCE_METRICS_COUNTER_FLOAT_VALUE_VALID_BIT_META, 0x00000004) \ #define XR_LIST_BITS_XrFoveationDynamicFlagsHTC(_) \ _(XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_BIT_HTC, 0x00000001) \ _(XR_FOVEATION_DYNAMIC_CLEAR_FOV_ENABLED_BIT_HTC, 0x00000002) \ _(XR_FOVEATION_DYNAMIC_FOCAL_CENTER_OFFSET_ENABLED_BIT_HTC, 0x00000004) \ #define XR_LIST_BITS_XrPlaneDetectionCapabilityFlagsEXT(_) \ _(XR_PLANE_DETECTION_CAPABILITY_PLANE_DETECTION_BIT_EXT, 0x00000001) \ _(XR_PLANE_DETECTION_CAPABILITY_PLANE_HOLES_BIT_EXT, 0x00000002) \ _(XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_CEILING_BIT_EXT, 0x00000004) \ _(XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_FLOOR_BIT_EXT, 0x00000008) \ _(XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_WALL_BIT_EXT, 0x00000010) \ _(XR_PLANE_DETECTION_CAPABILITY_SEMANTIC_PLATFORM_BIT_EXT, 0x00000020) \ _(XR_PLANE_DETECTION_CAPABILITY_ORIENTATION_BIT_EXT, 0x00000040) \ #define XR_LIST_BITS_XrPlaneDetectorFlagsEXT(_) \ _(XR_PLANE_DETECTOR_ENABLE_CONTOUR_BIT_EXT, 0x00000001) \ /// Calls your macro with the name of each member of XrApiLayerProperties, in order. #define XR_LIST_STRUCT_XrApiLayerProperties(_) \ _(type) \ _(next) \ _(layerName) \ _(specVersion) \ _(layerVersion) \ _(description) \ /// Calls your macro with the name of each member of XrExtensionProperties, in order. #define XR_LIST_STRUCT_XrExtensionProperties(_) \ _(type) \ _(next) \ _(extensionName) \ _(extensionVersion) \ /// Calls your macro with the name of each member of XrApplicationInfo, in order. #define XR_LIST_STRUCT_XrApplicationInfo(_) \ _(applicationName) \ _(applicationVersion) \ _(engineName) \ _(engineVersion) \ _(apiVersion) \ /// Calls your macro with the name of each member of XrInstanceCreateInfo, in order. #define XR_LIST_STRUCT_XrInstanceCreateInfo(_) \ _(type) \ _(next) \ _(createFlags) \ _(applicationInfo) \ _(enabledApiLayerCount) \ _(enabledApiLayerNames) \ _(enabledExtensionCount) \ _(enabledExtensionNames) \ /// Calls your macro with the name of each member of XrInstanceProperties, in order. #define XR_LIST_STRUCT_XrInstanceProperties(_) \ _(type) \ _(next) \ _(runtimeVersion) \ _(runtimeName) \ /// Calls your macro with the name of each member of XrEventDataBuffer, in order. #define XR_LIST_STRUCT_XrEventDataBuffer(_) \ _(type) \ _(next) \ _(varying) \ /// Calls your macro with the name of each member of XrSystemGetInfo, in order. #define XR_LIST_STRUCT_XrSystemGetInfo(_) \ _(type) \ _(next) \ _(formFactor) \ /// Calls your macro with the name of each member of XrSystemGraphicsProperties, in order. #define XR_LIST_STRUCT_XrSystemGraphicsProperties(_) \ _(maxSwapchainImageHeight) \ _(maxSwapchainImageWidth) \ _(maxLayerCount) \ /// Calls your macro with the name of each member of XrSystemTrackingProperties, in order. #define XR_LIST_STRUCT_XrSystemTrackingProperties(_) \ _(orientationTracking) \ _(positionTracking) \ /// Calls your macro with the name of each member of XrSystemProperties, in order. #define XR_LIST_STRUCT_XrSystemProperties(_) \ _(type) \ _(next) \ _(systemId) \ _(vendorId) \ _(systemName) \ _(graphicsProperties) \ _(trackingProperties) \ /// Calls your macro with the name of each member of XrSessionCreateInfo, in order. #define XR_LIST_STRUCT_XrSessionCreateInfo(_) \ _(type) \ _(next) \ _(createFlags) \ _(systemId) \ /// Calls your macro with the name of each member of XrVector3f, in order. #define XR_LIST_STRUCT_XrVector3f(_) \ _(x) \ _(y) \ _(z) \ /// Calls your macro with the name of each member of XrSpaceVelocity, in order. #define XR_LIST_STRUCT_XrSpaceVelocity(_) \ _(type) \ _(next) \ _(velocityFlags) \ _(linearVelocity) \ _(angularVelocity) \ /// Calls your macro with the name of each member of XrQuaternionf, in order. #define XR_LIST_STRUCT_XrQuaternionf(_) \ _(x) \ _(y) \ _(z) \ _(w) \ /// Calls your macro with the name of each member of XrPosef, in order. #define XR_LIST_STRUCT_XrPosef(_) \ _(orientation) \ _(position) \ /// Calls your macro with the name of each member of XrReferenceSpaceCreateInfo, in order. #define XR_LIST_STRUCT_XrReferenceSpaceCreateInfo(_) \ _(type) \ _(next) \ _(referenceSpaceType) \ _(poseInReferenceSpace) \ /// Calls your macro with the name of each member of XrExtent2Df, in order. #define XR_LIST_STRUCT_XrExtent2Df(_) \ _(width) \ _(height) \ /// Calls your macro with the name of each member of XrActionSpaceCreateInfo, in order. #define XR_LIST_STRUCT_XrActionSpaceCreateInfo(_) \ _(type) \ _(next) \ _(action) \ _(subactionPath) \ _(poseInActionSpace) \ /// Calls your macro with the name of each member of XrSpaceLocation, in order. #define XR_LIST_STRUCT_XrSpaceLocation(_) \ _(type) \ _(next) \ _(locationFlags) \ _(pose) \ /// Calls your macro with the name of each member of XrViewConfigurationProperties, in order. #define XR_LIST_STRUCT_XrViewConfigurationProperties(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(fovMutable) \ /// Calls your macro with the name of each member of XrViewConfigurationView, in order. #define XR_LIST_STRUCT_XrViewConfigurationView(_) \ _(type) \ _(next) \ _(recommendedImageRectWidth) \ _(maxImageRectWidth) \ _(recommendedImageRectHeight) \ _(maxImageRectHeight) \ _(recommendedSwapchainSampleCount) \ _(maxSwapchainSampleCount) \ /// Calls your macro with the name of each member of XrSwapchainCreateInfo, in order. #define XR_LIST_STRUCT_XrSwapchainCreateInfo(_) \ _(type) \ _(next) \ _(createFlags) \ _(usageFlags) \ _(format) \ _(sampleCount) \ _(width) \ _(height) \ _(faceCount) \ _(arraySize) \ _(mipCount) \ /// Calls your macro with the name of each member of XrSwapchainImageBaseHeader, in order. #define XR_LIST_STRUCT_XrSwapchainImageBaseHeader(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSwapchainImageAcquireInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageAcquireInfo(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSwapchainImageWaitInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageWaitInfo(_) \ _(type) \ _(next) \ _(timeout) \ /// Calls your macro with the name of each member of XrSwapchainImageReleaseInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageReleaseInfo(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSessionBeginInfo, in order. #define XR_LIST_STRUCT_XrSessionBeginInfo(_) \ _(type) \ _(next) \ _(primaryViewConfigurationType) \ /// Calls your macro with the name of each member of XrFrameWaitInfo, in order. #define XR_LIST_STRUCT_XrFrameWaitInfo(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrFrameState, in order. #define XR_LIST_STRUCT_XrFrameState(_) \ _(type) \ _(next) \ _(predictedDisplayTime) \ _(predictedDisplayPeriod) \ _(shouldRender) \ /// Calls your macro with the name of each member of XrFrameBeginInfo, in order. #define XR_LIST_STRUCT_XrFrameBeginInfo(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrCompositionLayerBaseHeader, in order. #define XR_LIST_STRUCT_XrCompositionLayerBaseHeader(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ /// Calls your macro with the name of each member of XrFrameEndInfo, in order. #define XR_LIST_STRUCT_XrFrameEndInfo(_) \ _(type) \ _(next) \ _(displayTime) \ _(environmentBlendMode) \ _(layerCount) \ _(layers) \ /// Calls your macro with the name of each member of XrViewLocateInfo, in order. #define XR_LIST_STRUCT_XrViewLocateInfo(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(displayTime) \ _(space) \ /// Calls your macro with the name of each member of XrViewState, in order. #define XR_LIST_STRUCT_XrViewState(_) \ _(type) \ _(next) \ _(viewStateFlags) \ /// Calls your macro with the name of each member of XrFovf, in order. #define XR_LIST_STRUCT_XrFovf(_) \ _(angleLeft) \ _(angleRight) \ _(angleUp) \ _(angleDown) \ /// Calls your macro with the name of each member of XrView, in order. #define XR_LIST_STRUCT_XrView(_) \ _(type) \ _(next) \ _(pose) \ _(fov) \ /// Calls your macro with the name of each member of XrActionSetCreateInfo, in order. #define XR_LIST_STRUCT_XrActionSetCreateInfo(_) \ _(type) \ _(next) \ _(actionSetName) \ _(localizedActionSetName) \ _(priority) \ /// Calls your macro with the name of each member of XrActionCreateInfo, in order. #define XR_LIST_STRUCT_XrActionCreateInfo(_) \ _(type) \ _(next) \ _(actionName) \ _(actionType) \ _(countSubactionPaths) \ _(subactionPaths) \ _(localizedActionName) \ /// Calls your macro with the name of each member of XrActionSuggestedBinding, in order. #define XR_LIST_STRUCT_XrActionSuggestedBinding(_) \ _(action) \ _(binding) \ /// Calls your macro with the name of each member of XrInteractionProfileSuggestedBinding, in order. #define XR_LIST_STRUCT_XrInteractionProfileSuggestedBinding(_) \ _(type) \ _(next) \ _(interactionProfile) \ _(countSuggestedBindings) \ _(suggestedBindings) \ /// Calls your macro with the name of each member of XrSessionActionSetsAttachInfo, in order. #define XR_LIST_STRUCT_XrSessionActionSetsAttachInfo(_) \ _(type) \ _(next) \ _(countActionSets) \ _(actionSets) \ /// Calls your macro with the name of each member of XrInteractionProfileState, in order. #define XR_LIST_STRUCT_XrInteractionProfileState(_) \ _(type) \ _(next) \ _(interactionProfile) \ /// Calls your macro with the name of each member of XrActionStateGetInfo, in order. #define XR_LIST_STRUCT_XrActionStateGetInfo(_) \ _(type) \ _(next) \ _(action) \ _(subactionPath) \ /// Calls your macro with the name of each member of XrActionStateBoolean, in order. #define XR_LIST_STRUCT_XrActionStateBoolean(_) \ _(type) \ _(next) \ _(currentState) \ _(changedSinceLastSync) \ _(lastChangeTime) \ _(isActive) \ /// Calls your macro with the name of each member of XrActionStateFloat, in order. #define XR_LIST_STRUCT_XrActionStateFloat(_) \ _(type) \ _(next) \ _(currentState) \ _(changedSinceLastSync) \ _(lastChangeTime) \ _(isActive) \ /// Calls your macro with the name of each member of XrVector2f, in order. #define XR_LIST_STRUCT_XrVector2f(_) \ _(x) \ _(y) \ /// Calls your macro with the name of each member of XrActionStateVector2f, in order. #define XR_LIST_STRUCT_XrActionStateVector2f(_) \ _(type) \ _(next) \ _(currentState) \ _(changedSinceLastSync) \ _(lastChangeTime) \ _(isActive) \ /// Calls your macro with the name of each member of XrActionStatePose, in order. #define XR_LIST_STRUCT_XrActionStatePose(_) \ _(type) \ _(next) \ _(isActive) \ /// Calls your macro with the name of each member of XrActiveActionSet, in order. #define XR_LIST_STRUCT_XrActiveActionSet(_) \ _(actionSet) \ _(subactionPath) \ /// Calls your macro with the name of each member of XrActionsSyncInfo, in order. #define XR_LIST_STRUCT_XrActionsSyncInfo(_) \ _(type) \ _(next) \ _(countActiveActionSets) \ _(activeActionSets) \ /// Calls your macro with the name of each member of XrBoundSourcesForActionEnumerateInfo, in order. #define XR_LIST_STRUCT_XrBoundSourcesForActionEnumerateInfo(_) \ _(type) \ _(next) \ _(action) \ /// Calls your macro with the name of each member of XrInputSourceLocalizedNameGetInfo, in order. #define XR_LIST_STRUCT_XrInputSourceLocalizedNameGetInfo(_) \ _(type) \ _(next) \ _(sourcePath) \ _(whichComponents) \ /// Calls your macro with the name of each member of XrHapticActionInfo, in order. #define XR_LIST_STRUCT_XrHapticActionInfo(_) \ _(type) \ _(next) \ _(action) \ _(subactionPath) \ /// Calls your macro with the name of each member of XrHapticBaseHeader, in order. #define XR_LIST_STRUCT_XrHapticBaseHeader(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrBaseInStructure, in order. #define XR_LIST_STRUCT_XrBaseInStructure(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrBaseOutStructure, in order. #define XR_LIST_STRUCT_XrBaseOutStructure(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrOffset2Di, in order. #define XR_LIST_STRUCT_XrOffset2Di(_) \ _(x) \ _(y) \ /// Calls your macro with the name of each member of XrExtent2Di, in order. #define XR_LIST_STRUCT_XrExtent2Di(_) \ _(width) \ _(height) \ /// Calls your macro with the name of each member of XrRect2Di, in order. #define XR_LIST_STRUCT_XrRect2Di(_) \ _(offset) \ _(extent) \ /// Calls your macro with the name of each member of XrSwapchainSubImage, in order. #define XR_LIST_STRUCT_XrSwapchainSubImage(_) \ _(swapchain) \ _(imageRect) \ _(imageArrayIndex) \ /// Calls your macro with the name of each member of XrCompositionLayerProjectionView, in order. #define XR_LIST_STRUCT_XrCompositionLayerProjectionView(_) \ _(type) \ _(next) \ _(pose) \ _(fov) \ _(subImage) \ /// Calls your macro with the name of each member of XrCompositionLayerProjection, in order. #define XR_LIST_STRUCT_XrCompositionLayerProjection(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(viewCount) \ _(views) \ /// Calls your macro with the name of each member of XrCompositionLayerQuad, in order. #define XR_LIST_STRUCT_XrCompositionLayerQuad(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(eyeVisibility) \ _(subImage) \ _(pose) \ _(size) \ /// Calls your macro with the name of each member of XrEventDataBaseHeader, in order. #define XR_LIST_STRUCT_XrEventDataBaseHeader(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrEventDataEventsLost, in order. #define XR_LIST_STRUCT_XrEventDataEventsLost(_) \ _(type) \ _(next) \ _(lostEventCount) \ /// Calls your macro with the name of each member of XrEventDataInstanceLossPending, in order. #define XR_LIST_STRUCT_XrEventDataInstanceLossPending(_) \ _(type) \ _(next) \ _(lossTime) \ /// Calls your macro with the name of each member of XrEventDataSessionStateChanged, in order. #define XR_LIST_STRUCT_XrEventDataSessionStateChanged(_) \ _(type) \ _(next) \ _(session) \ _(state) \ _(time) \ /// Calls your macro with the name of each member of XrEventDataReferenceSpaceChangePending, in order. #define XR_LIST_STRUCT_XrEventDataReferenceSpaceChangePending(_) \ _(type) \ _(next) \ _(session) \ _(referenceSpaceType) \ _(changeTime) \ _(poseValid) \ _(poseInPreviousSpace) \ /// Calls your macro with the name of each member of XrEventDataInteractionProfileChanged, in order. #define XR_LIST_STRUCT_XrEventDataInteractionProfileChanged(_) \ _(type) \ _(next) \ _(session) \ /// Calls your macro with the name of each member of XrHapticVibration, in order. #define XR_LIST_STRUCT_XrHapticVibration(_) \ _(type) \ _(next) \ _(duration) \ _(frequency) \ _(amplitude) \ /// Calls your macro with the name of each member of XrOffset2Df, in order. #define XR_LIST_STRUCT_XrOffset2Df(_) \ _(x) \ _(y) \ /// Calls your macro with the name of each member of XrRect2Df, in order. #define XR_LIST_STRUCT_XrRect2Df(_) \ _(offset) \ _(extent) \ /// Calls your macro with the name of each member of XrVector4f, in order. #define XR_LIST_STRUCT_XrVector4f(_) \ _(x) \ _(y) \ _(z) \ _(w) \ /// Calls your macro with the name of each member of XrColor4f, in order. #define XR_LIST_STRUCT_XrColor4f(_) \ _(r) \ _(g) \ _(b) \ _(a) \ /// Calls your macro with the name of each member of XrCompositionLayerCubeKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerCubeKHR(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(eyeVisibility) \ _(swapchain) \ _(imageArrayIndex) \ _(orientation) \ /// Calls your macro with the name of each member of XrInstanceCreateInfoAndroidKHR, in order. #define XR_LIST_STRUCT_XrInstanceCreateInfoAndroidKHR(_) \ _(type) \ _(next) \ _(applicationVM) \ _(applicationActivity) \ /// Calls your macro with the name of each member of XrCompositionLayerDepthInfoKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerDepthInfoKHR(_) \ _(type) \ _(next) \ _(subImage) \ _(minDepth) \ _(maxDepth) \ _(nearZ) \ _(farZ) \ /// Calls your macro with the name of each member of XrVulkanSwapchainFormatListCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanSwapchainFormatListCreateInfoKHR(_) \ _(type) \ _(next) \ _(viewFormatCount) \ _(viewFormats) \ /// Calls your macro with the name of each member of XrCompositionLayerCylinderKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerCylinderKHR(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(eyeVisibility) \ _(subImage) \ _(pose) \ _(radius) \ _(centralAngle) \ _(aspectRatio) \ /// Calls your macro with the name of each member of XrCompositionLayerEquirectKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerEquirectKHR(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(eyeVisibility) \ _(subImage) \ _(pose) \ _(radius) \ _(scale) \ _(bias) \ /// Calls your macro with the name of each member of XrGraphicsBindingOpenGLWin32KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWin32KHR(_) \ _(type) \ _(next) \ _(hDC) \ _(hGLRC) \ /// Calls your macro with the name of each member of XrGraphicsBindingOpenGLXlibKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXlibKHR(_) \ _(type) \ _(next) \ _(xDisplay) \ _(visualid) \ _(glxFBConfig) \ _(glxDrawable) \ _(glxContext) \ /// Calls your macro with the name of each member of XrGraphicsBindingOpenGLXcbKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXcbKHR(_) \ _(type) \ _(next) \ _(connection) \ _(screenNumber) \ _(fbconfigid) \ _(visualid) \ _(glxDrawable) \ _(glxContext) \ /// Calls your macro with the name of each member of XrGraphicsBindingOpenGLWaylandKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWaylandKHR(_) \ _(type) \ _(next) \ _(display) \ /// Calls your macro with the name of each member of XrSwapchainImageOpenGLKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageOpenGLKHR(_) \ _(type) \ _(next) \ _(image) \ /// Calls your macro with the name of each member of XrGraphicsRequirementsOpenGLKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ /// Calls your macro with the name of each member of XrGraphicsBindingOpenGLESAndroidKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLESAndroidKHR(_) \ _(type) \ _(next) \ _(display) \ _(config) \ _(context) \ /// Calls your macro with the name of each member of XrSwapchainImageOpenGLESKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageOpenGLESKHR(_) \ _(type) \ _(next) \ _(image) \ /// Calls your macro with the name of each member of XrGraphicsRequirementsOpenGLESKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLESKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ /// Calls your macro with the name of each member of XrGraphicsBindingVulkanKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingVulkanKHR(_) \ _(type) \ _(next) \ _(instance) \ _(physicalDevice) \ _(device) \ _(queueFamilyIndex) \ _(queueIndex) \ /// Calls your macro with the name of each member of XrSwapchainImageVulkanKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageVulkanKHR(_) \ _(type) \ _(next) \ _(image) \ /// Calls your macro with the name of each member of XrGraphicsRequirementsVulkanKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsVulkanKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ /// Calls your macro with the name of each member of XrGraphicsBindingD3D11KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingD3D11KHR(_) \ _(type) \ _(next) \ _(device) \ /// Calls your macro with the name of each member of XrSwapchainImageD3D11KHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageD3D11KHR(_) \ _(type) \ _(next) \ _(texture) \ /// Calls your macro with the name of each member of XrGraphicsRequirementsD3D11KHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsD3D11KHR(_) \ _(type) \ _(next) \ _(adapterLuid) \ _(minFeatureLevel) \ /// Calls your macro with the name of each member of XrGraphicsBindingD3D12KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingD3D12KHR(_) \ _(type) \ _(next) \ _(device) \ _(queue) \ /// Calls your macro with the name of each member of XrSwapchainImageD3D12KHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageD3D12KHR(_) \ _(type) \ _(next) \ _(texture) \ /// Calls your macro with the name of each member of XrGraphicsRequirementsD3D12KHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsD3D12KHR(_) \ _(type) \ _(next) \ _(adapterLuid) \ _(minFeatureLevel) \ /// Calls your macro with the name of each member of XrVisibilityMaskKHR, in order. #define XR_LIST_STRUCT_XrVisibilityMaskKHR(_) \ _(type) \ _(next) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ /// Calls your macro with the name of each member of XrEventDataVisibilityMaskChangedKHR, in order. #define XR_LIST_STRUCT_XrEventDataVisibilityMaskChangedKHR(_) \ _(type) \ _(next) \ _(session) \ _(viewConfigurationType) \ _(viewIndex) \ /// Calls your macro with the name of each member of XrCompositionLayerColorScaleBiasKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerColorScaleBiasKHR(_) \ _(type) \ _(next) \ _(colorScale) \ _(colorBias) \ /// Calls your macro with the name of each member of XrLoaderInitInfoBaseHeaderKHR, in order. #define XR_LIST_STRUCT_XrLoaderInitInfoBaseHeaderKHR(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrLoaderInitInfoAndroidKHR, in order. #define XR_LIST_STRUCT_XrLoaderInitInfoAndroidKHR(_) \ _(type) \ _(next) \ _(applicationVM) \ _(applicationContext) \ /// Calls your macro with the name of each member of XrVulkanInstanceCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanInstanceCreateInfoKHR(_) \ _(type) \ _(next) \ _(systemId) \ _(createFlags) \ _(pfnGetInstanceProcAddr) \ _(vulkanCreateInfo) \ _(vulkanAllocator) \ /// Calls your macro with the name of each member of XrVulkanDeviceCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanDeviceCreateInfoKHR(_) \ _(type) \ _(next) \ _(systemId) \ _(createFlags) \ _(pfnGetInstanceProcAddr) \ _(vulkanPhysicalDevice) \ _(vulkanCreateInfo) \ _(vulkanAllocator) \ /// Calls your macro with the name of each member of XrVulkanGraphicsDeviceGetInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanGraphicsDeviceGetInfoKHR(_) \ _(type) \ _(next) \ _(systemId) \ _(vulkanInstance) \ /// Calls your macro with the name of each member of XrCompositionLayerEquirect2KHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerEquirect2KHR(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(eyeVisibility) \ _(subImage) \ _(pose) \ _(radius) \ _(centralHorizontalAngle) \ _(upperVerticalAngle) \ _(lowerVerticalAngle) \ /// Calls your macro with the name of each member of XrBindingModificationBaseHeaderKHR, in order. #define XR_LIST_STRUCT_XrBindingModificationBaseHeaderKHR(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrBindingModificationsKHR, in order. #define XR_LIST_STRUCT_XrBindingModificationsKHR(_) \ _(type) \ _(next) \ _(bindingModificationCount) \ _(bindingModifications) \ /// Calls your macro with the name of each member of XrEventDataPerfSettingsEXT, in order. #define XR_LIST_STRUCT_XrEventDataPerfSettingsEXT(_) \ _(type) \ _(next) \ _(domain) \ _(subDomain) \ _(fromLevel) \ _(toLevel) \ /// Calls your macro with the name of each member of XrDebugUtilsObjectNameInfoEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsObjectNameInfoEXT(_) \ _(type) \ _(next) \ _(objectType) \ _(objectHandle) \ _(objectName) \ /// Calls your macro with the name of each member of XrDebugUtilsLabelEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsLabelEXT(_) \ _(type) \ _(next) \ _(labelName) \ /// Calls your macro with the name of each member of XrDebugUtilsMessengerCallbackDataEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsMessengerCallbackDataEXT(_) \ _(type) \ _(next) \ _(messageId) \ _(functionName) \ _(message) \ _(objectCount) \ _(objects) \ _(sessionLabelCount) \ _(sessionLabels) \ /// Calls your macro with the name of each member of XrDebugUtilsMessengerCreateInfoEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsMessengerCreateInfoEXT(_) \ _(type) \ _(next) \ _(messageSeverities) \ _(messageTypes) \ _(userCallback) \ _(userData) \ /// Calls your macro with the name of each member of XrSystemEyeGazeInteractionPropertiesEXT, in order. #define XR_LIST_STRUCT_XrSystemEyeGazeInteractionPropertiesEXT(_) \ _(type) \ _(next) \ _(supportsEyeGazeInteraction) \ /// Calls your macro with the name of each member of XrEyeGazeSampleTimeEXT, in order. #define XR_LIST_STRUCT_XrEyeGazeSampleTimeEXT(_) \ _(type) \ _(next) \ _(time) \ /// Calls your macro with the name of each member of XrSessionCreateInfoOverlayEXTX, in order. #define XR_LIST_STRUCT_XrSessionCreateInfoOverlayEXTX(_) \ _(type) \ _(next) \ _(createFlags) \ _(sessionLayersPlacement) \ /// Calls your macro with the name of each member of XrEventDataMainSessionVisibilityChangedEXTX, in order. #define XR_LIST_STRUCT_XrEventDataMainSessionVisibilityChangedEXTX(_) \ _(type) \ _(next) \ _(visible) \ _(flags) \ /// Calls your macro with the name of each member of XrSpatialAnchorCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorCreateInfoMSFT(_) \ _(type) \ _(next) \ _(space) \ _(pose) \ _(time) \ /// Calls your macro with the name of each member of XrSpatialAnchorSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ _(anchor) \ _(poseInAnchorSpace) \ /// Calls your macro with the name of each member of XrCompositionLayerImageLayoutFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerImageLayoutFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrCompositionLayerAlphaBlendFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerAlphaBlendFB(_) \ _(type) \ _(next) \ _(srcFactorColor) \ _(dstFactorColor) \ _(srcFactorAlpha) \ _(dstFactorAlpha) \ /// Calls your macro with the name of each member of XrViewConfigurationDepthRangeEXT, in order. #define XR_LIST_STRUCT_XrViewConfigurationDepthRangeEXT(_) \ _(type) \ _(next) \ _(recommendedNearZ) \ _(minNearZ) \ _(recommendedFarZ) \ _(maxFarZ) \ /// Calls your macro with the name of each member of XrGraphicsBindingEGLMNDX, in order. #define XR_LIST_STRUCT_XrGraphicsBindingEGLMNDX(_) \ _(type) \ _(next) \ _(getProcAddress) \ _(display) \ _(config) \ _(context) \ /// Calls your macro with the name of each member of XrSpatialGraphNodeSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ _(nodeType) \ _(nodeId) \ _(pose) \ /// Calls your macro with the name of each member of XrSpatialGraphStaticNodeBindingCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphStaticNodeBindingCreateInfoMSFT(_) \ _(type) \ _(next) \ _(space) \ _(poseInSpace) \ _(time) \ /// Calls your macro with the name of each member of XrSpatialGraphNodeBindingPropertiesGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeBindingPropertiesGetInfoMSFT(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSpatialGraphNodeBindingPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeBindingPropertiesMSFT(_) \ _(type) \ _(next) \ _(nodeId) \ _(poseInNodeSpace) \ /// Calls your macro with the name of each member of XrSystemHandTrackingPropertiesEXT, in order. #define XR_LIST_STRUCT_XrSystemHandTrackingPropertiesEXT(_) \ _(type) \ _(next) \ _(supportsHandTracking) \ /// Calls your macro with the name of each member of XrHandTrackerCreateInfoEXT, in order. #define XR_LIST_STRUCT_XrHandTrackerCreateInfoEXT(_) \ _(type) \ _(next) \ _(hand) \ _(handJointSet) \ /// Calls your macro with the name of each member of XrHandJointsLocateInfoEXT, in order. #define XR_LIST_STRUCT_XrHandJointsLocateInfoEXT(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ /// Calls your macro with the name of each member of XrHandJointLocationEXT, in order. #define XR_LIST_STRUCT_XrHandJointLocationEXT(_) \ _(locationFlags) \ _(pose) \ _(radius) \ /// Calls your macro with the name of each member of XrHandJointVelocityEXT, in order. #define XR_LIST_STRUCT_XrHandJointVelocityEXT(_) \ _(velocityFlags) \ _(linearVelocity) \ _(angularVelocity) \ /// Calls your macro with the name of each member of XrHandJointLocationsEXT, in order. #define XR_LIST_STRUCT_XrHandJointLocationsEXT(_) \ _(type) \ _(next) \ _(isActive) \ _(jointCount) \ _(jointLocations) \ /// Calls your macro with the name of each member of XrHandJointVelocitiesEXT, in order. #define XR_LIST_STRUCT_XrHandJointVelocitiesEXT(_) \ _(type) \ _(next) \ _(jointCount) \ _(jointVelocities) \ /// Calls your macro with the name of each member of XrSystemHandTrackingMeshPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrSystemHandTrackingMeshPropertiesMSFT(_) \ _(type) \ _(next) \ _(supportsHandTrackingMesh) \ _(maxHandMeshIndexCount) \ _(maxHandMeshVertexCount) \ /// Calls your macro with the name of each member of XrHandMeshSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ _(handPoseType) \ _(poseInHandMeshSpace) \ /// Calls your macro with the name of each member of XrHandMeshUpdateInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshUpdateInfoMSFT(_) \ _(type) \ _(next) \ _(time) \ _(handPoseType) \ /// Calls your macro with the name of each member of XrHandMeshIndexBufferMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshIndexBufferMSFT(_) \ _(indexBufferKey) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ /// Calls your macro with the name of each member of XrHandMeshVertexMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshVertexMSFT(_) \ _(position) \ _(normal) \ /// Calls your macro with the name of each member of XrHandMeshVertexBufferMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshVertexBufferMSFT(_) \ _(vertexUpdateTime) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ /// Calls your macro with the name of each member of XrHandMeshMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshMSFT(_) \ _(type) \ _(next) \ _(isActive) \ _(indexBufferChanged) \ _(vertexBufferChanged) \ _(indexBuffer) \ _(vertexBuffer) \ /// Calls your macro with the name of each member of XrHandPoseTypeInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandPoseTypeInfoMSFT(_) \ _(type) \ _(next) \ _(handPoseType) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationSessionBeginInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationSessionBeginInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(enabledViewConfigurationTypes) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationStateMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationStateMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(active) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationFrameStateMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameStateMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(viewConfigurationStates) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationLayerInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationLayerInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(environmentBlendMode) \ _(layerCount) \ _(layers) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationFrameEndInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameEndInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(viewConfigurationLayersInfo) \ /// Calls your macro with the name of each member of XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationSwapchainCreateInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ /// Calls your macro with the name of each member of XrControllerModelKeyStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelKeyStateMSFT(_) \ _(type) \ _(next) \ _(modelKey) \ /// Calls your macro with the name of each member of XrControllerModelNodePropertiesMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelNodePropertiesMSFT(_) \ _(type) \ _(next) \ _(parentNodeName) \ _(nodeName) \ /// Calls your macro with the name of each member of XrControllerModelPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelPropertiesMSFT(_) \ _(type) \ _(next) \ _(nodeCapacityInput) \ _(nodeCountOutput) \ _(nodeProperties) \ /// Calls your macro with the name of each member of XrControllerModelNodeStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelNodeStateMSFT(_) \ _(type) \ _(next) \ _(nodePose) \ /// Calls your macro with the name of each member of XrControllerModelStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelStateMSFT(_) \ _(type) \ _(next) \ _(nodeCapacityInput) \ _(nodeCountOutput) \ _(nodeStates) \ /// Calls your macro with the name of each member of XrViewConfigurationViewFovEPIC, in order. #define XR_LIST_STRUCT_XrViewConfigurationViewFovEPIC(_) \ _(type) \ _(next) \ _(recommendedFov) \ _(maxMutableFov) \ /// Calls your macro with the name of each member of XrHolographicWindowAttachmentMSFT, in order. #define XR_LIST_STRUCT_XrHolographicWindowAttachmentMSFT(_) \ _(type) \ _(next) \ _(holographicSpace) \ _(coreWindow) \ /// Calls your macro with the name of each member of XrCompositionLayerReprojectionInfoMSFT, in order. #define XR_LIST_STRUCT_XrCompositionLayerReprojectionInfoMSFT(_) \ _(type) \ _(next) \ _(reprojectionMode) \ /// Calls your macro with the name of each member of XrCompositionLayerReprojectionPlaneOverrideMSFT, in order. #define XR_LIST_STRUCT_XrCompositionLayerReprojectionPlaneOverrideMSFT(_) \ _(type) \ _(next) \ _(position) \ _(normal) \ _(velocity) \ /// Calls your macro with the name of each member of XrAndroidSurfaceSwapchainCreateInfoFB, in order. #define XR_LIST_STRUCT_XrAndroidSurfaceSwapchainCreateInfoFB(_) \ _(type) \ _(next) \ _(createFlags) \ /// Calls your macro with the name of each member of XrSwapchainStateBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateBaseHeaderFB(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrCompositionLayerSecureContentFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSecureContentFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrBodyJointLocationFB, in order. #define XR_LIST_STRUCT_XrBodyJointLocationFB(_) \ _(locationFlags) \ _(pose) \ /// Calls your macro with the name of each member of XrSystemBodyTrackingPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemBodyTrackingPropertiesFB(_) \ _(type) \ _(next) \ _(supportsBodyTracking) \ /// Calls your macro with the name of each member of XrBodyTrackerCreateInfoFB, in order. #define XR_LIST_STRUCT_XrBodyTrackerCreateInfoFB(_) \ _(type) \ _(next) \ _(bodyJointSet) \ /// Calls your macro with the name of each member of XrBodySkeletonJointFB, in order. #define XR_LIST_STRUCT_XrBodySkeletonJointFB(_) \ _(joint) \ _(parentJoint) \ _(pose) \ /// Calls your macro with the name of each member of XrBodySkeletonFB, in order. #define XR_LIST_STRUCT_XrBodySkeletonFB(_) \ _(type) \ _(next) \ _(jointCount) \ _(joints) \ /// Calls your macro with the name of each member of XrBodyJointsLocateInfoFB, in order. #define XR_LIST_STRUCT_XrBodyJointsLocateInfoFB(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ /// Calls your macro with the name of each member of XrBodyJointLocationsFB, in order. #define XR_LIST_STRUCT_XrBodyJointLocationsFB(_) \ _(type) \ _(next) \ _(isActive) \ _(confidence) \ _(jointCount) \ _(jointLocations) \ _(skeletonChangedCount) \ _(time) \ /// Calls your macro with the name of each member of XrInteractionProfileDpadBindingEXT, in order. #define XR_LIST_STRUCT_XrInteractionProfileDpadBindingEXT(_) \ _(type) \ _(next) \ _(binding) \ _(actionSet) \ _(forceThreshold) \ _(forceThresholdReleased) \ _(centerRegion) \ _(wedgeAngle) \ _(isSticky) \ _(onHaptic) \ _(offHaptic) \ /// Calls your macro with the name of each member of XrInteractionProfileAnalogThresholdVALVE, in order. #define XR_LIST_STRUCT_XrInteractionProfileAnalogThresholdVALVE(_) \ _(type) \ _(next) \ _(action) \ _(binding) \ _(onThreshold) \ _(offThreshold) \ _(onHaptic) \ _(offHaptic) \ /// Calls your macro with the name of each member of XrHandJointsMotionRangeInfoEXT, in order. #define XR_LIST_STRUCT_XrHandJointsMotionRangeInfoEXT(_) \ _(type) \ _(next) \ _(handJointsMotionRange) \ /// Calls your macro with the name of each member of XrUuidMSFT, in order. #define XR_LIST_STRUCT_XrUuidMSFT(_) \ _(bytes) \ /// Calls your macro with the name of each member of XrSceneObserverCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneObserverCreateInfoMSFT(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSceneCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneCreateInfoMSFT(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSceneSphereBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneSphereBoundMSFT(_) \ _(center) \ _(radius) \ /// Calls your macro with the name of each member of XrSceneOrientedBoxBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneOrientedBoxBoundMSFT(_) \ _(pose) \ _(extents) \ /// Calls your macro with the name of each member of XrSceneFrustumBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneFrustumBoundMSFT(_) \ _(pose) \ _(fov) \ _(farDistance) \ /// Calls your macro with the name of each member of XrSceneBoundsMSFT, in order. #define XR_LIST_STRUCT_XrSceneBoundsMSFT(_) \ _(space) \ _(time) \ _(sphereCount) \ _(spheres) \ _(boxCount) \ _(boxes) \ _(frustumCount) \ _(frustums) \ /// Calls your macro with the name of each member of XrNewSceneComputeInfoMSFT, in order. #define XR_LIST_STRUCT_XrNewSceneComputeInfoMSFT(_) \ _(type) \ _(next) \ _(requestedFeatureCount) \ _(requestedFeatures) \ _(consistency) \ _(bounds) \ /// Calls your macro with the name of each member of XrVisualMeshComputeLodInfoMSFT, in order. #define XR_LIST_STRUCT_XrVisualMeshComputeLodInfoMSFT(_) \ _(type) \ _(next) \ _(lod) \ /// Calls your macro with the name of each member of XrSceneComponentMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentMSFT(_) \ _(componentType) \ _(id) \ _(parentId) \ _(updateTime) \ /// Calls your macro with the name of each member of XrSceneComponentsMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsMSFT(_) \ _(type) \ _(next) \ _(componentCapacityInput) \ _(componentCountOutput) \ _(components) \ /// Calls your macro with the name of each member of XrSceneComponentsGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsGetInfoMSFT(_) \ _(type) \ _(next) \ _(componentType) \ /// Calls your macro with the name of each member of XrSceneComponentLocationMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentLocationMSFT(_) \ _(flags) \ _(pose) \ /// Calls your macro with the name of each member of XrSceneComponentLocationsMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentLocationsMSFT(_) \ _(type) \ _(next) \ _(locationCount) \ _(locations) \ /// Calls your macro with the name of each member of XrSceneComponentsLocateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsLocateInfoMSFT(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ _(componentIdCount) \ _(componentIds) \ /// Calls your macro with the name of each member of XrSceneObjectMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectMSFT(_) \ _(objectType) \ /// Calls your macro with the name of each member of XrSceneObjectsMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectsMSFT(_) \ _(type) \ _(next) \ _(sceneObjectCount) \ _(sceneObjects) \ /// Calls your macro with the name of each member of XrSceneComponentParentFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentParentFilterInfoMSFT(_) \ _(type) \ _(next) \ _(parentId) \ /// Calls your macro with the name of each member of XrSceneObjectTypesFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectTypesFilterInfoMSFT(_) \ _(type) \ _(next) \ _(objectTypeCount) \ _(objectTypes) \ /// Calls your macro with the name of each member of XrScenePlaneMSFT, in order. #define XR_LIST_STRUCT_XrScenePlaneMSFT(_) \ _(alignment) \ _(size) \ _(meshBufferId) \ _(supportsIndicesUint16) \ /// Calls your macro with the name of each member of XrScenePlanesMSFT, in order. #define XR_LIST_STRUCT_XrScenePlanesMSFT(_) \ _(type) \ _(next) \ _(scenePlaneCount) \ _(scenePlanes) \ /// Calls your macro with the name of each member of XrScenePlaneAlignmentFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrScenePlaneAlignmentFilterInfoMSFT(_) \ _(type) \ _(next) \ _(alignmentCount) \ _(alignments) \ /// Calls your macro with the name of each member of XrSceneMeshMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshMSFT(_) \ _(meshBufferId) \ _(supportsIndicesUint16) \ /// Calls your macro with the name of each member of XrSceneMeshesMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshesMSFT(_) \ _(type) \ _(next) \ _(sceneMeshCount) \ _(sceneMeshes) \ /// Calls your macro with the name of each member of XrSceneMeshBuffersGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshBuffersGetInfoMSFT(_) \ _(type) \ _(next) \ _(meshBufferId) \ /// Calls your macro with the name of each member of XrSceneMeshBuffersMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshBuffersMSFT(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSceneMeshVertexBufferMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshVertexBufferMSFT(_) \ _(type) \ _(next) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ /// Calls your macro with the name of each member of XrSceneMeshIndicesUint32MSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshIndicesUint32MSFT(_) \ _(type) \ _(next) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ /// Calls your macro with the name of each member of XrSceneMeshIndicesUint16MSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshIndicesUint16MSFT(_) \ _(type) \ _(next) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ /// Calls your macro with the name of each member of XrSerializedSceneFragmentDataGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSerializedSceneFragmentDataGetInfoMSFT(_) \ _(type) \ _(next) \ _(sceneFragmentId) \ /// Calls your macro with the name of each member of XrDeserializeSceneFragmentMSFT, in order. #define XR_LIST_STRUCT_XrDeserializeSceneFragmentMSFT(_) \ _(bufferSize) \ _(buffer) \ /// Calls your macro with the name of each member of XrSceneDeserializeInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneDeserializeInfoMSFT(_) \ _(type) \ _(next) \ _(fragmentCount) \ _(fragments) \ /// Calls your macro with the name of each member of XrEventDataDisplayRefreshRateChangedFB, in order. #define XR_LIST_STRUCT_XrEventDataDisplayRefreshRateChangedFB(_) \ _(type) \ _(next) \ _(fromDisplayRefreshRate) \ _(toDisplayRefreshRate) \ /// Calls your macro with the name of each member of XrViveTrackerPathsHTCX, in order. #define XR_LIST_STRUCT_XrViveTrackerPathsHTCX(_) \ _(type) \ _(next) \ _(persistentPath) \ _(rolePath) \ /// Calls your macro with the name of each member of XrEventDataViveTrackerConnectedHTCX, in order. #define XR_LIST_STRUCT_XrEventDataViveTrackerConnectedHTCX(_) \ _(type) \ _(next) \ _(paths) \ /// Calls your macro with the name of each member of XrSystemFacialTrackingPropertiesHTC, in order. #define XR_LIST_STRUCT_XrSystemFacialTrackingPropertiesHTC(_) \ _(type) \ _(next) \ _(supportEyeFacialTracking) \ _(supportLipFacialTracking) \ /// Calls your macro with the name of each member of XrFacialExpressionsHTC, in order. #define XR_LIST_STRUCT_XrFacialExpressionsHTC(_) \ _(type) \ _(next) \ _(isActive) \ _(sampleTime) \ _(expressionCount) \ _(expressionWeightings) \ /// Calls your macro with the name of each member of XrFacialTrackerCreateInfoHTC, in order. #define XR_LIST_STRUCT_XrFacialTrackerCreateInfoHTC(_) \ _(type) \ _(next) \ _(facialTrackingType) \ /// Calls your macro with the name of each member of XrSystemColorSpacePropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemColorSpacePropertiesFB(_) \ _(type) \ _(next) \ _(colorSpace) \ /// Calls your macro with the name of each member of XrVector4sFB, in order. #define XR_LIST_STRUCT_XrVector4sFB(_) \ _(x) \ _(y) \ _(z) \ _(w) \ /// Calls your macro with the name of each member of XrHandTrackingMeshFB, in order. #define XR_LIST_STRUCT_XrHandTrackingMeshFB(_) \ _(type) \ _(next) \ _(jointCapacityInput) \ _(jointCountOutput) \ _(jointBindPoses) \ _(jointRadii) \ _(jointParents) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertexPositions) \ _(vertexNormals) \ _(vertexUVs) \ _(vertexBlendIndices) \ _(vertexBlendWeights) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ /// Calls your macro with the name of each member of XrHandTrackingScaleFB, in order. #define XR_LIST_STRUCT_XrHandTrackingScaleFB(_) \ _(type) \ _(next) \ _(sensorOutput) \ _(currentOutput) \ _(overrideHandScale) \ _(overrideValueInput) \ /// Calls your macro with the name of each member of XrHandTrackingAimStateFB, in order. #define XR_LIST_STRUCT_XrHandTrackingAimStateFB(_) \ _(type) \ _(next) \ _(status) \ _(aimPose) \ _(pinchStrengthIndex) \ _(pinchStrengthMiddle) \ _(pinchStrengthRing) \ _(pinchStrengthLittle) \ /// Calls your macro with the name of each member of XrHandCapsuleFB, in order. #define XR_LIST_STRUCT_XrHandCapsuleFB(_) \ _(points) \ _(radius) \ _(joint) \ /// Calls your macro with the name of each member of XrHandTrackingCapsulesStateFB, in order. #define XR_LIST_STRUCT_XrHandTrackingCapsulesStateFB(_) \ _(type) \ _(next) \ _(capsules) \ /// Calls your macro with the name of each member of XrSystemSpatialEntityPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemSpatialEntityPropertiesFB(_) \ _(type) \ _(next) \ _(supportsSpatialEntity) \ /// Calls your macro with the name of each member of XrSpatialAnchorCreateInfoFB, in order. #define XR_LIST_STRUCT_XrSpatialAnchorCreateInfoFB(_) \ _(type) \ _(next) \ _(space) \ _(poseInSpace) \ _(time) \ /// Calls your macro with the name of each member of XrSpaceComponentStatusSetInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentStatusSetInfoFB(_) \ _(type) \ _(next) \ _(componentType) \ _(enabled) \ _(timeout) \ /// Calls your macro with the name of each member of XrSpaceComponentStatusFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentStatusFB(_) \ _(type) \ _(next) \ _(enabled) \ _(changePending) \ /// Calls your macro with the name of each member of XrUuidEXT, in order. #define XR_LIST_STRUCT_XrUuidEXT(_) \ _(data) \ /// Calls your macro with the name of each member of XrEventDataSpatialAnchorCreateCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpatialAnchorCreateCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ _(space) \ _(uuid) \ /// Calls your macro with the name of each member of XrEventDataSpaceSetStatusCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceSetStatusCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ _(space) \ _(uuid) \ _(componentType) \ _(enabled) \ /// Calls your macro with the name of each member of XrFoveationProfileCreateInfoFB, in order. #define XR_LIST_STRUCT_XrFoveationProfileCreateInfoFB(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSwapchainCreateInfoFoveationFB, in order. #define XR_LIST_STRUCT_XrSwapchainCreateInfoFoveationFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrSwapchainStateFoveationFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateFoveationFB(_) \ _(type) \ _(next) \ _(flags) \ _(profile) \ /// Calls your macro with the name of each member of XrFoveationLevelProfileCreateInfoFB, in order. #define XR_LIST_STRUCT_XrFoveationLevelProfileCreateInfoFB(_) \ _(type) \ _(next) \ _(level) \ _(verticalOffset) \ _(dynamic) \ /// Calls your macro with the name of each member of XrSystemKeyboardTrackingPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemKeyboardTrackingPropertiesFB(_) \ _(type) \ _(next) \ _(supportsKeyboardTracking) \ /// Calls your macro with the name of each member of XrKeyboardTrackingDescriptionFB, in order. #define XR_LIST_STRUCT_XrKeyboardTrackingDescriptionFB(_) \ _(trackedKeyboardId) \ _(size) \ _(flags) \ _(name) \ /// Calls your macro with the name of each member of XrKeyboardSpaceCreateInfoFB, in order. #define XR_LIST_STRUCT_XrKeyboardSpaceCreateInfoFB(_) \ _(type) \ _(next) \ _(trackedKeyboardId) \ /// Calls your macro with the name of each member of XrKeyboardTrackingQueryFB, in order. #define XR_LIST_STRUCT_XrKeyboardTrackingQueryFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrTriangleMeshCreateInfoFB, in order. #define XR_LIST_STRUCT_XrTriangleMeshCreateInfoFB(_) \ _(type) \ _(next) \ _(flags) \ _(windingOrder) \ _(vertexCount) \ _(vertexBuffer) \ _(triangleCount) \ _(indexBuffer) \ /// Calls your macro with the name of each member of XrSystemPassthroughPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemPassthroughPropertiesFB(_) \ _(type) \ _(next) \ _(supportsPassthrough) \ /// Calls your macro with the name of each member of XrSystemPassthroughProperties2FB, in order. #define XR_LIST_STRUCT_XrSystemPassthroughProperties2FB(_) \ _(type) \ _(next) \ _(capabilities) \ /// Calls your macro with the name of each member of XrPassthroughCreateInfoFB, in order. #define XR_LIST_STRUCT_XrPassthroughCreateInfoFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrPassthroughLayerCreateInfoFB, in order. #define XR_LIST_STRUCT_XrPassthroughLayerCreateInfoFB(_) \ _(type) \ _(next) \ _(passthrough) \ _(flags) \ _(purpose) \ /// Calls your macro with the name of each member of XrCompositionLayerPassthroughFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerPassthroughFB(_) \ _(type) \ _(next) \ _(flags) \ _(space) \ _(layerHandle) \ /// Calls your macro with the name of each member of XrGeometryInstanceCreateInfoFB, in order. #define XR_LIST_STRUCT_XrGeometryInstanceCreateInfoFB(_) \ _(type) \ _(next) \ _(layer) \ _(mesh) \ _(baseSpace) \ _(pose) \ _(scale) \ /// Calls your macro with the name of each member of XrGeometryInstanceTransformFB, in order. #define XR_LIST_STRUCT_XrGeometryInstanceTransformFB(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ _(pose) \ _(scale) \ /// Calls your macro with the name of each member of XrPassthroughStyleFB, in order. #define XR_LIST_STRUCT_XrPassthroughStyleFB(_) \ _(type) \ _(next) \ _(textureOpacityFactor) \ _(edgeColor) \ /// Calls your macro with the name of each member of XrPassthroughColorMapMonoToRgbaFB, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapMonoToRgbaFB(_) \ _(type) \ _(next) \ _(textureColorMap) \ /// Calls your macro with the name of each member of XrPassthroughColorMapMonoToMonoFB, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapMonoToMonoFB(_) \ _(type) \ _(next) \ _(textureColorMap) \ /// Calls your macro with the name of each member of XrPassthroughBrightnessContrastSaturationFB, in order. #define XR_LIST_STRUCT_XrPassthroughBrightnessContrastSaturationFB(_) \ _(type) \ _(next) \ _(brightness) \ _(contrast) \ _(saturation) \ /// Calls your macro with the name of each member of XrEventDataPassthroughStateChangedFB, in order. #define XR_LIST_STRUCT_XrEventDataPassthroughStateChangedFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrRenderModelPathInfoFB, in order. #define XR_LIST_STRUCT_XrRenderModelPathInfoFB(_) \ _(type) \ _(next) \ _(path) \ /// Calls your macro with the name of each member of XrRenderModelPropertiesFB, in order. #define XR_LIST_STRUCT_XrRenderModelPropertiesFB(_) \ _(type) \ _(next) \ _(vendorId) \ _(modelName) \ _(modelKey) \ _(modelVersion) \ _(flags) \ /// Calls your macro with the name of each member of XrRenderModelBufferFB, in order. #define XR_LIST_STRUCT_XrRenderModelBufferFB(_) \ _(type) \ _(next) \ _(bufferCapacityInput) \ _(bufferCountOutput) \ _(buffer) \ /// Calls your macro with the name of each member of XrRenderModelLoadInfoFB, in order. #define XR_LIST_STRUCT_XrRenderModelLoadInfoFB(_) \ _(type) \ _(next) \ _(modelKey) \ /// Calls your macro with the name of each member of XrSystemRenderModelPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemRenderModelPropertiesFB(_) \ _(type) \ _(next) \ _(supportsRenderModelLoading) \ /// Calls your macro with the name of each member of XrRenderModelCapabilitiesRequestFB, in order. #define XR_LIST_STRUCT_XrRenderModelCapabilitiesRequestFB(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrViewLocateFoveatedRenderingVARJO, in order. #define XR_LIST_STRUCT_XrViewLocateFoveatedRenderingVARJO(_) \ _(type) \ _(next) \ _(foveatedRenderingActive) \ /// Calls your macro with the name of each member of XrFoveatedViewConfigurationViewVARJO, in order. #define XR_LIST_STRUCT_XrFoveatedViewConfigurationViewVARJO(_) \ _(type) \ _(next) \ _(foveatedRenderingActive) \ /// Calls your macro with the name of each member of XrSystemFoveatedRenderingPropertiesVARJO, in order. #define XR_LIST_STRUCT_XrSystemFoveatedRenderingPropertiesVARJO(_) \ _(type) \ _(next) \ _(supportsFoveatedRendering) \ /// Calls your macro with the name of each member of XrCompositionLayerDepthTestVARJO, in order. #define XR_LIST_STRUCT_XrCompositionLayerDepthTestVARJO(_) \ _(type) \ _(next) \ _(depthTestRangeNearZ) \ _(depthTestRangeFarZ) \ /// Calls your macro with the name of each member of XrSystemMarkerTrackingPropertiesVARJO, in order. #define XR_LIST_STRUCT_XrSystemMarkerTrackingPropertiesVARJO(_) \ _(type) \ _(next) \ _(supportsMarkerTracking) \ /// Calls your macro with the name of each member of XrEventDataMarkerTrackingUpdateVARJO, in order. #define XR_LIST_STRUCT_XrEventDataMarkerTrackingUpdateVARJO(_) \ _(type) \ _(next) \ _(markerId) \ _(isActive) \ _(isPredicted) \ _(time) \ /// Calls your macro with the name of each member of XrMarkerSpaceCreateInfoVARJO, in order. #define XR_LIST_STRUCT_XrMarkerSpaceCreateInfoVARJO(_) \ _(type) \ _(next) \ _(markerId) \ _(poseInMarkerSpace) \ /// Calls your macro with the name of each member of XrFrameEndInfoML, in order. #define XR_LIST_STRUCT_XrFrameEndInfoML(_) \ _(type) \ _(next) \ _(focusDistance) \ _(flags) \ /// Calls your macro with the name of each member of XrGlobalDimmerFrameEndInfoML, in order. #define XR_LIST_STRUCT_XrGlobalDimmerFrameEndInfoML(_) \ _(type) \ _(next) \ _(dimmerValue) \ _(flags) \ /// Calls your macro with the name of each member of XrCoordinateSpaceCreateInfoML, in order. #define XR_LIST_STRUCT_XrCoordinateSpaceCreateInfoML(_) \ _(type) \ _(next) \ _(cfuid) \ _(poseInCoordinateSpace) \ /// Calls your macro with the name of each member of XrSpatialAnchorPersistenceNameMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorPersistenceNameMSFT(_) \ _(name) \ /// Calls your macro with the name of each member of XrSpatialAnchorPersistenceInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorPersistenceInfoMSFT(_) \ _(type) \ _(next) \ _(spatialAnchorPersistenceName) \ _(spatialAnchor) \ /// Calls your macro with the name of each member of XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT(_) \ _(type) \ _(next) \ _(spatialAnchorStore) \ _(spatialAnchorPersistenceName) \ /// Calls your macro with the name of each member of XrSpaceQueryInfoBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryInfoBaseHeaderFB(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSpaceFilterInfoBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSpaceFilterInfoBaseHeaderFB(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrSpaceQueryInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryInfoFB(_) \ _(type) \ _(next) \ _(queryAction) \ _(maxResultCount) \ _(timeout) \ _(filter) \ _(excludeFilter) \ /// Calls your macro with the name of each member of XrSpaceStorageLocationFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceStorageLocationFilterInfoFB(_) \ _(type) \ _(next) \ _(location) \ /// Calls your macro with the name of each member of XrSpaceUuidFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceUuidFilterInfoFB(_) \ _(type) \ _(next) \ _(uuidCount) \ _(uuids) \ /// Calls your macro with the name of each member of XrSpaceComponentFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentFilterInfoFB(_) \ _(type) \ _(next) \ _(componentType) \ /// Calls your macro with the name of each member of XrSpaceQueryResultFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryResultFB(_) \ _(space) \ _(uuid) \ /// Calls your macro with the name of each member of XrSpaceQueryResultsFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryResultsFB(_) \ _(type) \ _(next) \ _(resultCapacityInput) \ _(resultCountOutput) \ _(results) \ /// Calls your macro with the name of each member of XrEventDataSpaceQueryResultsAvailableFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceQueryResultsAvailableFB(_) \ _(type) \ _(next) \ _(requestId) \ /// Calls your macro with the name of each member of XrEventDataSpaceQueryCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceQueryCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ /// Calls your macro with the name of each member of XrSpaceSaveInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceSaveInfoFB(_) \ _(type) \ _(next) \ _(space) \ _(location) \ _(persistenceMode) \ /// Calls your macro with the name of each member of XrSpaceEraseInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceEraseInfoFB(_) \ _(type) \ _(next) \ _(space) \ _(location) \ /// Calls your macro with the name of each member of XrEventDataSpaceSaveCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceSaveCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ _(space) \ _(uuid) \ _(location) \ /// Calls your macro with the name of each member of XrEventDataSpaceEraseCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceEraseCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ _(space) \ _(uuid) \ _(location) \ /// Calls your macro with the name of each member of XrSwapchainImageFoveationVulkanFB, in order. #define XR_LIST_STRUCT_XrSwapchainImageFoveationVulkanFB(_) \ _(type) \ _(next) \ _(image) \ _(width) \ _(height) \ /// Calls your macro with the name of each member of XrSwapchainStateAndroidSurfaceDimensionsFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateAndroidSurfaceDimensionsFB(_) \ _(type) \ _(next) \ _(width) \ _(height) \ /// Calls your macro with the name of each member of XrSwapchainStateSamplerOpenGLESFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateSamplerOpenGLESFB(_) \ _(type) \ _(next) \ _(minFilter) \ _(magFilter) \ _(wrapModeS) \ _(wrapModeT) \ _(swizzleRed) \ _(swizzleGreen) \ _(swizzleBlue) \ _(swizzleAlpha) \ _(maxAnisotropy) \ _(borderColor) \ /// Calls your macro with the name of each member of XrSwapchainStateSamplerVulkanFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateSamplerVulkanFB(_) \ _(type) \ _(next) \ _(minFilter) \ _(magFilter) \ _(mipmapMode) \ _(wrapModeS) \ _(wrapModeT) \ _(swizzleRed) \ _(swizzleGreen) \ _(swizzleBlue) \ _(swizzleAlpha) \ _(maxAnisotropy) \ _(borderColor) \ /// Calls your macro with the name of each member of XrSpaceShareInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceShareInfoFB(_) \ _(type) \ _(next) \ _(spaceCount) \ _(spaces) \ _(userCount) \ _(users) \ /// Calls your macro with the name of each member of XrEventDataSpaceShareCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceShareCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ /// Calls your macro with the name of each member of XrCompositionLayerSpaceWarpInfoFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSpaceWarpInfoFB(_) \ _(type) \ _(next) \ _(layerFlags) \ _(motionVectorSubImage) \ _(appSpaceDeltaPose) \ _(depthSubImage) \ _(minDepth) \ _(maxDepth) \ _(nearZ) \ _(farZ) \ /// Calls your macro with the name of each member of XrSystemSpaceWarpPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemSpaceWarpPropertiesFB(_) \ _(type) \ _(next) \ _(recommendedMotionVectorImageRectWidth) \ _(recommendedMotionVectorImageRectHeight) \ /// Calls your macro with the name of each member of XrHapticAmplitudeEnvelopeVibrationFB, in order. #define XR_LIST_STRUCT_XrHapticAmplitudeEnvelopeVibrationFB(_) \ _(type) \ _(next) \ _(duration) \ _(amplitudeCount) \ _(amplitudes) \ /// Calls your macro with the name of each member of XrExtent3DfFB, in order. #define XR_LIST_STRUCT_XrExtent3DfFB(_) \ _(width) \ _(height) \ _(depth) \ /// Calls your macro with the name of each member of XrOffset3DfFB, in order. #define XR_LIST_STRUCT_XrOffset3DfFB(_) \ _(x) \ _(y) \ _(z) \ /// Calls your macro with the name of each member of XrRect3DfFB, in order. #define XR_LIST_STRUCT_XrRect3DfFB(_) \ _(offset) \ _(extent) \ /// Calls your macro with the name of each member of XrSemanticLabelsFB, in order. #define XR_LIST_STRUCT_XrSemanticLabelsFB(_) \ _(type) \ _(next) \ _(bufferCapacityInput) \ _(bufferCountOutput) \ _(buffer) \ /// Calls your macro with the name of each member of XrRoomLayoutFB, in order. #define XR_LIST_STRUCT_XrRoomLayoutFB(_) \ _(type) \ _(next) \ _(floorUuid) \ _(ceilingUuid) \ _(wallUuidCapacityInput) \ _(wallUuidCountOutput) \ _(wallUuids) \ /// Calls your macro with the name of each member of XrBoundary2DFB, in order. #define XR_LIST_STRUCT_XrBoundary2DFB(_) \ _(type) \ _(next) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ /// Calls your macro with the name of each member of XrSemanticLabelsSupportInfoFB, in order. #define XR_LIST_STRUCT_XrSemanticLabelsSupportInfoFB(_) \ _(type) \ _(next) \ _(flags) \ _(recognizedLabels) \ /// Calls your macro with the name of each member of XrDigitalLensControlALMALENCE, in order. #define XR_LIST_STRUCT_XrDigitalLensControlALMALENCE(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrEventDataSceneCaptureCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSceneCaptureCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ /// Calls your macro with the name of each member of XrSceneCaptureRequestInfoFB, in order. #define XR_LIST_STRUCT_XrSceneCaptureRequestInfoFB(_) \ _(type) \ _(next) \ _(requestByteCount) \ _(request) \ /// Calls your macro with the name of each member of XrSpaceContainerFB, in order. #define XR_LIST_STRUCT_XrSpaceContainerFB(_) \ _(type) \ _(next) \ _(uuidCapacityInput) \ _(uuidCountOutput) \ _(uuids) \ /// Calls your macro with the name of each member of XrFoveationEyeTrackedProfileCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrFoveationEyeTrackedProfileCreateInfoMETA(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrFoveationEyeTrackedStateMETA, in order. #define XR_LIST_STRUCT_XrFoveationEyeTrackedStateMETA(_) \ _(type) \ _(next) \ _(foveationCenter) \ _(flags) \ /// Calls your macro with the name of each member of XrSystemFoveationEyeTrackedPropertiesMETA, in order. #define XR_LIST_STRUCT_XrSystemFoveationEyeTrackedPropertiesMETA(_) \ _(type) \ _(next) \ _(supportsFoveationEyeTracked) \ /// Calls your macro with the name of each member of XrSystemFaceTrackingPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemFaceTrackingPropertiesFB(_) \ _(type) \ _(next) \ _(supportsFaceTracking) \ /// Calls your macro with the name of each member of XrFaceTrackerCreateInfoFB, in order. #define XR_LIST_STRUCT_XrFaceTrackerCreateInfoFB(_) \ _(type) \ _(next) \ _(faceExpressionSet) \ /// Calls your macro with the name of each member of XrFaceExpressionInfoFB, in order. #define XR_LIST_STRUCT_XrFaceExpressionInfoFB(_) \ _(type) \ _(next) \ _(time) \ /// Calls your macro with the name of each member of XrFaceExpressionStatusFB, in order. #define XR_LIST_STRUCT_XrFaceExpressionStatusFB(_) \ _(isValid) \ _(isEyeFollowingBlendshapesValid) \ /// Calls your macro with the name of each member of XrFaceExpressionWeightsFB, in order. #define XR_LIST_STRUCT_XrFaceExpressionWeightsFB(_) \ _(type) \ _(next) \ _(weightCount) \ _(weights) \ _(confidenceCount) \ _(confidences) \ _(status) \ _(time) \ /// Calls your macro with the name of each member of XrEyeGazeFB, in order. #define XR_LIST_STRUCT_XrEyeGazeFB(_) \ _(isValid) \ _(gazePose) \ _(gazeConfidence) \ /// Calls your macro with the name of each member of XrEyeTrackerCreateInfoFB, in order. #define XR_LIST_STRUCT_XrEyeTrackerCreateInfoFB(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrEyeGazesInfoFB, in order. #define XR_LIST_STRUCT_XrEyeGazesInfoFB(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ /// Calls your macro with the name of each member of XrSystemEyeTrackingPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemEyeTrackingPropertiesFB(_) \ _(type) \ _(next) \ _(supportsEyeTracking) \ /// Calls your macro with the name of each member of XrEyeGazesFB, in order. #define XR_LIST_STRUCT_XrEyeGazesFB(_) \ _(type) \ _(next) \ _(gaze) \ _(time) \ /// Calls your macro with the name of each member of XrPassthroughKeyboardHandsIntensityFB, in order. #define XR_LIST_STRUCT_XrPassthroughKeyboardHandsIntensityFB(_) \ _(type) \ _(next) \ _(leftHandIntensity) \ _(rightHandIntensity) \ /// Calls your macro with the name of each member of XrCompositionLayerSettingsFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSettingsFB(_) \ _(type) \ _(next) \ _(layerFlags) \ /// Calls your macro with the name of each member of XrHapticPcmVibrationFB, in order. #define XR_LIST_STRUCT_XrHapticPcmVibrationFB(_) \ _(type) \ _(next) \ _(bufferSize) \ _(buffer) \ _(sampleRate) \ _(append) \ _(samplesConsumed) \ /// Calls your macro with the name of each member of XrDevicePcmSampleRateStateFB, in order. #define XR_LIST_STRUCT_XrDevicePcmSampleRateStateFB(_) \ _(type) \ _(next) \ _(sampleRate) \ /// Calls your macro with the name of each member of XrCompositionLayerDepthTestFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerDepthTestFB(_) \ _(type) \ _(next) \ _(depthMask) \ _(compareOp) \ /// Calls your macro with the name of each member of XrLocalDimmingFrameEndInfoMETA, in order. #define XR_LIST_STRUCT_XrLocalDimmingFrameEndInfoMETA(_) \ _(type) \ _(next) \ _(localDimmingMode) \ /// Calls your macro with the name of each member of XrSystemVirtualKeyboardPropertiesMETA, in order. #define XR_LIST_STRUCT_XrSystemVirtualKeyboardPropertiesMETA(_) \ _(type) \ _(next) \ _(supportsVirtualKeyboard) \ /// Calls your macro with the name of each member of XrVirtualKeyboardCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardCreateInfoMETA(_) \ _(type) \ _(next) \ /// Calls your macro with the name of each member of XrVirtualKeyboardSpaceCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardSpaceCreateInfoMETA(_) \ _(type) \ _(next) \ _(locationType) \ _(space) \ _(poseInSpace) \ /// Calls your macro with the name of each member of XrVirtualKeyboardLocationInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardLocationInfoMETA(_) \ _(type) \ _(next) \ _(locationType) \ _(space) \ _(poseInSpace) \ _(scale) \ /// Calls your macro with the name of each member of XrVirtualKeyboardModelVisibilitySetInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardModelVisibilitySetInfoMETA(_) \ _(type) \ _(next) \ _(visible) \ /// Calls your macro with the name of each member of XrVirtualKeyboardAnimationStateMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardAnimationStateMETA(_) \ _(type) \ _(next) \ _(animationIndex) \ _(fraction) \ /// Calls your macro with the name of each member of XrVirtualKeyboardModelAnimationStatesMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardModelAnimationStatesMETA(_) \ _(type) \ _(next) \ _(stateCapacityInput) \ _(stateCountOutput) \ _(states) \ /// Calls your macro with the name of each member of XrVirtualKeyboardTextureDataMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardTextureDataMETA(_) \ _(type) \ _(next) \ _(textureWidth) \ _(textureHeight) \ _(bufferCapacityInput) \ _(bufferCountOutput) \ _(buffer) \ /// Calls your macro with the name of each member of XrVirtualKeyboardInputInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardInputInfoMETA(_) \ _(type) \ _(next) \ _(inputSource) \ _(inputSpace) \ _(inputPoseInSpace) \ _(inputState) \ /// Calls your macro with the name of each member of XrVirtualKeyboardTextContextChangeInfoMETA, in order. #define XR_LIST_STRUCT_XrVirtualKeyboardTextContextChangeInfoMETA(_) \ _(type) \ _(next) \ _(textContext) \ /// Calls your macro with the name of each member of XrEventDataVirtualKeyboardCommitTextMETA, in order. #define XR_LIST_STRUCT_XrEventDataVirtualKeyboardCommitTextMETA(_) \ _(type) \ _(next) \ _(keyboard) \ _(text) \ /// Calls your macro with the name of each member of XrEventDataVirtualKeyboardBackspaceMETA, in order. #define XR_LIST_STRUCT_XrEventDataVirtualKeyboardBackspaceMETA(_) \ _(type) \ _(next) \ _(keyboard) \ /// Calls your macro with the name of each member of XrEventDataVirtualKeyboardEnterMETA, in order. #define XR_LIST_STRUCT_XrEventDataVirtualKeyboardEnterMETA(_) \ _(type) \ _(next) \ _(keyboard) \ /// Calls your macro with the name of each member of XrEventDataVirtualKeyboardShownMETA, in order. #define XR_LIST_STRUCT_XrEventDataVirtualKeyboardShownMETA(_) \ _(type) \ _(next) \ _(keyboard) \ /// Calls your macro with the name of each member of XrEventDataVirtualKeyboardHiddenMETA, in order. #define XR_LIST_STRUCT_XrEventDataVirtualKeyboardHiddenMETA(_) \ _(type) \ _(next) \ _(keyboard) \ /// Calls your macro with the name of each member of XrExternalCameraIntrinsicsOCULUS, in order. #define XR_LIST_STRUCT_XrExternalCameraIntrinsicsOCULUS(_) \ _(lastChangeTime) \ _(fov) \ _(virtualNearPlaneDistance) \ _(virtualFarPlaneDistance) \ _(imageSensorPixelResolution) \ /// Calls your macro with the name of each member of XrExternalCameraExtrinsicsOCULUS, in order. #define XR_LIST_STRUCT_XrExternalCameraExtrinsicsOCULUS(_) \ _(lastChangeTime) \ _(cameraStatusFlags) \ _(attachedToDevice) \ _(relativePose) \ /// Calls your macro with the name of each member of XrExternalCameraOCULUS, in order. #define XR_LIST_STRUCT_XrExternalCameraOCULUS(_) \ _(type) \ _(next) \ _(name) \ _(intrinsics) \ _(extrinsics) \ /// Calls your macro with the name of each member of XrVulkanSwapchainCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrVulkanSwapchainCreateInfoMETA(_) \ _(type) \ _(next) \ _(additionalCreateFlags) \ _(additionalUsageFlags) \ /// Calls your macro with the name of each member of XrPerformanceMetricsStateMETA, in order. #define XR_LIST_STRUCT_XrPerformanceMetricsStateMETA(_) \ _(type) \ _(next) \ _(enabled) \ /// Calls your macro with the name of each member of XrPerformanceMetricsCounterMETA, in order. #define XR_LIST_STRUCT_XrPerformanceMetricsCounterMETA(_) \ _(type) \ _(next) \ _(counterFlags) \ _(counterUnit) \ _(uintValue) \ _(floatValue) \ /// Calls your macro with the name of each member of XrSpaceListSaveInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceListSaveInfoFB(_) \ _(type) \ _(next) \ _(spaceCount) \ _(spaces) \ _(location) \ /// Calls your macro with the name of each member of XrEventDataSpaceListSaveCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceListSaveCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ /// Calls your macro with the name of each member of XrSpaceUserCreateInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceUserCreateInfoFB(_) \ _(type) \ _(next) \ _(userId) \ /// Calls your macro with the name of each member of XrSystemHeadsetIdPropertiesMETA, in order. #define XR_LIST_STRUCT_XrSystemHeadsetIdPropertiesMETA(_) \ _(type) \ _(next) \ _(id) \ /// Calls your macro with the name of each member of XrPassthroughColorLutDataMETA, in order. #define XR_LIST_STRUCT_XrPassthroughColorLutDataMETA(_) \ _(bufferSize) \ _(buffer) \ /// Calls your macro with the name of each member of XrPassthroughColorLutCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrPassthroughColorLutCreateInfoMETA(_) \ _(type) \ _(next) \ _(channels) \ _(resolution) \ _(data) \ /// Calls your macro with the name of each member of XrPassthroughColorLutUpdateInfoMETA, in order. #define XR_LIST_STRUCT_XrPassthroughColorLutUpdateInfoMETA(_) \ _(type) \ _(next) \ _(data) \ /// Calls your macro with the name of each member of XrPassthroughColorMapLutMETA, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapLutMETA(_) \ _(type) \ _(next) \ _(colorLut) \ _(weight) \ /// Calls your macro with the name of each member of XrPassthroughColorMapInterpolatedLutMETA, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapInterpolatedLutMETA(_) \ _(type) \ _(next) \ _(sourceColorLut) \ _(targetColorLut) \ _(weight) \ /// Calls your macro with the name of each member of XrSystemPassthroughColorLutPropertiesMETA, in order. #define XR_LIST_STRUCT_XrSystemPassthroughColorLutPropertiesMETA(_) \ _(type) \ _(next) \ _(maxColorLutResolution) \ /// Calls your macro with the name of each member of XrPassthroughCreateInfoHTC, in order. #define XR_LIST_STRUCT_XrPassthroughCreateInfoHTC(_) \ _(type) \ _(next) \ _(form) \ /// Calls your macro with the name of each member of XrPassthroughColorHTC, in order. #define XR_LIST_STRUCT_XrPassthroughColorHTC(_) \ _(type) \ _(next) \ _(alpha) \ /// Calls your macro with the name of each member of XrPassthroughMeshTransformInfoHTC, in order. #define XR_LIST_STRUCT_XrPassthroughMeshTransformInfoHTC(_) \ _(type) \ _(next) \ _(vertexCount) \ _(vertices) \ _(indexCount) \ _(indices) \ _(baseSpace) \ _(time) \ _(pose) \ _(scale) \ /// Calls your macro with the name of each member of XrCompositionLayerPassthroughHTC, in order. #define XR_LIST_STRUCT_XrCompositionLayerPassthroughHTC(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ _(passthrough) \ _(color) \ /// Calls your macro with the name of each member of XrFoveationApplyInfoHTC, in order. #define XR_LIST_STRUCT_XrFoveationApplyInfoHTC(_) \ _(type) \ _(next) \ _(mode) \ _(subImageCount) \ _(subImages) \ /// Calls your macro with the name of each member of XrFoveationConfigurationHTC, in order. #define XR_LIST_STRUCT_XrFoveationConfigurationHTC(_) \ _(level) \ _(clearFovDegree) \ _(focalCenterOffset) \ /// Calls your macro with the name of each member of XrFoveationDynamicModeInfoHTC, in order. #define XR_LIST_STRUCT_XrFoveationDynamicModeInfoHTC(_) \ _(type) \ _(next) \ _(dynamicFlags) \ /// Calls your macro with the name of each member of XrFoveationCustomModeInfoHTC, in order. #define XR_LIST_STRUCT_XrFoveationCustomModeInfoHTC(_) \ _(type) \ _(next) \ _(configCount) \ _(configs) \ /// Calls your macro with the name of each member of XrActiveActionSetPriorityEXT, in order. #define XR_LIST_STRUCT_XrActiveActionSetPriorityEXT(_) \ _(actionSet) \ _(priorityOverride) \ /// Calls your macro with the name of each member of XrActiveActionSetPrioritiesEXT, in order. #define XR_LIST_STRUCT_XrActiveActionSetPrioritiesEXT(_) \ _(type) \ _(next) \ _(actionSetPriorityCount) \ _(actionSetPriorities) \ /// Calls your macro with the name of each member of XrSystemForceFeedbackCurlPropertiesMNDX, in order. #define XR_LIST_STRUCT_XrSystemForceFeedbackCurlPropertiesMNDX(_) \ _(type) \ _(next) \ _(supportsForceFeedbackCurl) \ /// Calls your macro with the name of each member of XrForceFeedbackCurlApplyLocationMNDX, in order. #define XR_LIST_STRUCT_XrForceFeedbackCurlApplyLocationMNDX(_) \ _(location) \ _(value) \ /// Calls your macro with the name of each member of XrForceFeedbackCurlApplyLocationsMNDX, in order. #define XR_LIST_STRUCT_XrForceFeedbackCurlApplyLocationsMNDX(_) \ _(type) \ _(next) \ _(locationCount) \ _(locations) \ /// Calls your macro with the name of each member of XrHandTrackingDataSourceInfoEXT, in order. #define XR_LIST_STRUCT_XrHandTrackingDataSourceInfoEXT(_) \ _(type) \ _(next) \ _(requestedDataSourceCount) \ _(requestedDataSources) \ /// Calls your macro with the name of each member of XrHandTrackingDataSourceStateEXT, in order. #define XR_LIST_STRUCT_XrHandTrackingDataSourceStateEXT(_) \ _(type) \ _(next) \ _(isActive) \ _(dataSource) \ /// Calls your macro with the name of each member of XrSystemPlaneDetectionPropertiesEXT, in order. #define XR_LIST_STRUCT_XrSystemPlaneDetectionPropertiesEXT(_) \ _(type) \ _(next) \ _(supportedFeatures) \ /// Calls your macro with the name of each member of XrPlaneDetectorCreateInfoEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorCreateInfoEXT(_) \ _(type) \ _(next) \ _(flags) \ /// Calls your macro with the name of each member of XrExtent3DfEXT, in order. #define XR_LIST_STRUCT_XrExtent3DfEXT(_) \ _(width) \ _(height) \ _(depth) \ /// Calls your macro with the name of each member of XrPlaneDetectorBeginInfoEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorBeginInfoEXT(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ _(orientationCount) \ _(orientations) \ _(semanticTypeCount) \ _(semanticTypes) \ _(maxPlanes) \ _(minArea) \ _(boundingBoxPose) \ _(boundingBoxExtent) \ /// Calls your macro with the name of each member of XrPlaneDetectorGetInfoEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorGetInfoEXT(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ /// Calls your macro with the name of each member of XrPlaneDetectorLocationEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorLocationEXT(_) \ _(type) \ _(next) \ _(planeId) \ _(locationFlags) \ _(pose) \ _(extents) \ _(orientation) \ _(semanticType) \ _(polygonBufferCount) \ /// Calls your macro with the name of each member of XrPlaneDetectorLocationsEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorLocationsEXT(_) \ _(type) \ _(next) \ _(planeLocationCapacityInput) \ _(planeLocationCountOutput) \ _(planeLocations) \ /// Calls your macro with the name of each member of XrPlaneDetectorPolygonBufferEXT, in order. #define XR_LIST_STRUCT_XrPlaneDetectorPolygonBufferEXT(_) \ _(type) \ _(next) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ /// Calls your macro with the structure type name and the XrStructureType constant for /// each known/available structure type, excluding those unavailable due to preprocessor definitions. #define XR_LIST_STRUCTURE_TYPES(_) \ XR_LIST_STRUCTURE_TYPES_CORE(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_) \ XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ /// Implementation detail of XR_LIST_STRUCTURE_TYPES() - structure types available without any preprocessor definitions #define XR_LIST_STRUCTURE_TYPES_CORE(_) \ _(XrApiLayerProperties, XR_TYPE_API_LAYER_PROPERTIES) \ _(XrExtensionProperties, XR_TYPE_EXTENSION_PROPERTIES) \ _(XrInstanceCreateInfo, XR_TYPE_INSTANCE_CREATE_INFO) \ _(XrInstanceProperties, XR_TYPE_INSTANCE_PROPERTIES) \ _(XrEventDataBuffer, XR_TYPE_EVENT_DATA_BUFFER) \ _(XrSystemGetInfo, XR_TYPE_SYSTEM_GET_INFO) \ _(XrSystemProperties, XR_TYPE_SYSTEM_PROPERTIES) \ _(XrSessionCreateInfo, XR_TYPE_SESSION_CREATE_INFO) \ _(XrSpaceVelocity, XR_TYPE_SPACE_VELOCITY) \ _(XrReferenceSpaceCreateInfo, XR_TYPE_REFERENCE_SPACE_CREATE_INFO) \ _(XrActionSpaceCreateInfo, XR_TYPE_ACTION_SPACE_CREATE_INFO) \ _(XrSpaceLocation, XR_TYPE_SPACE_LOCATION) \ _(XrViewConfigurationProperties, XR_TYPE_VIEW_CONFIGURATION_PROPERTIES) \ _(XrViewConfigurationView, XR_TYPE_VIEW_CONFIGURATION_VIEW) \ _(XrSwapchainCreateInfo, XR_TYPE_SWAPCHAIN_CREATE_INFO) \ _(XrSwapchainImageAcquireInfo, XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO) \ _(XrSwapchainImageWaitInfo, XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO) \ _(XrSwapchainImageReleaseInfo, XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO) \ _(XrSessionBeginInfo, XR_TYPE_SESSION_BEGIN_INFO) \ _(XrFrameWaitInfo, XR_TYPE_FRAME_WAIT_INFO) \ _(XrFrameState, XR_TYPE_FRAME_STATE) \ _(XrFrameBeginInfo, XR_TYPE_FRAME_BEGIN_INFO) \ _(XrFrameEndInfo, XR_TYPE_FRAME_END_INFO) \ _(XrViewLocateInfo, XR_TYPE_VIEW_LOCATE_INFO) \ _(XrViewState, XR_TYPE_VIEW_STATE) \ _(XrView, XR_TYPE_VIEW) \ _(XrActionSetCreateInfo, XR_TYPE_ACTION_SET_CREATE_INFO) \ _(XrActionCreateInfo, XR_TYPE_ACTION_CREATE_INFO) \ _(XrInteractionProfileSuggestedBinding, XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING) \ _(XrSessionActionSetsAttachInfo, XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO) \ _(XrInteractionProfileState, XR_TYPE_INTERACTION_PROFILE_STATE) \ _(XrActionStateGetInfo, XR_TYPE_ACTION_STATE_GET_INFO) \ _(XrActionStateBoolean, XR_TYPE_ACTION_STATE_BOOLEAN) \ _(XrActionStateFloat, XR_TYPE_ACTION_STATE_FLOAT) \ _(XrActionStateVector2f, XR_TYPE_ACTION_STATE_VECTOR2F) \ _(XrActionStatePose, XR_TYPE_ACTION_STATE_POSE) \ _(XrActionsSyncInfo, XR_TYPE_ACTIONS_SYNC_INFO) \ _(XrBoundSourcesForActionEnumerateInfo, XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO) \ _(XrInputSourceLocalizedNameGetInfo, XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO) \ _(XrHapticActionInfo, XR_TYPE_HAPTIC_ACTION_INFO) \ _(XrCompositionLayerProjectionView, XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW) \ _(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ _(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ _(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ _(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ _(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ _(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ _(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ _(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ _(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ _(XrCompositionLayerDepthInfoKHR, XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR) \ _(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ _(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ _(XrVisibilityMaskKHR, XR_TYPE_VISIBILITY_MASK_KHR) \ _(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ _(XrCompositionLayerColorScaleBiasKHR, XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR) \ _(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ _(XrBindingModificationsKHR, XR_TYPE_BINDING_MODIFICATIONS_KHR) \ _(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ _(XrDebugUtilsObjectNameInfoEXT, XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT) \ _(XrDebugUtilsLabelEXT, XR_TYPE_DEBUG_UTILS_LABEL_EXT) \ _(XrDebugUtilsMessengerCallbackDataEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT) \ _(XrDebugUtilsMessengerCreateInfoEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) \ _(XrSystemEyeGazeInteractionPropertiesEXT, XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT) \ _(XrEyeGazeSampleTimeEXT, XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT) \ _(XrSessionCreateInfoOverlayEXTX, XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX) \ _(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ _(XrSpatialAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT) \ _(XrSpatialAnchorSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT) \ _(XrCompositionLayerImageLayoutFB, XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB) \ _(XrCompositionLayerAlphaBlendFB, XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB) \ _(XrViewConfigurationDepthRangeEXT, XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT) \ _(XrSpatialGraphNodeSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT) \ _(XrSpatialGraphStaticNodeBindingCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT) \ _(XrSpatialGraphNodeBindingPropertiesGetInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT) \ _(XrSpatialGraphNodeBindingPropertiesMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT) \ _(XrSystemHandTrackingPropertiesEXT, XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT) \ _(XrHandTrackerCreateInfoEXT, XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT) \ _(XrHandJointsLocateInfoEXT, XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT) \ _(XrHandJointLocationsEXT, XR_TYPE_HAND_JOINT_LOCATIONS_EXT) \ _(XrHandJointVelocitiesEXT, XR_TYPE_HAND_JOINT_VELOCITIES_EXT) \ _(XrSystemHandTrackingMeshPropertiesMSFT, XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT) \ _(XrHandMeshSpaceCreateInfoMSFT, XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT) \ _(XrHandMeshUpdateInfoMSFT, XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT) \ _(XrHandMeshMSFT, XR_TYPE_HAND_MESH_MSFT) \ _(XrHandPoseTypeInfoMSFT, XR_TYPE_HAND_POSE_TYPE_INFO_MSFT) \ _(XrSecondaryViewConfigurationSessionBeginInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT) \ _(XrSecondaryViewConfigurationStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT) \ _(XrSecondaryViewConfigurationFrameStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT) \ _(XrSecondaryViewConfigurationLayerInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT) \ _(XrSecondaryViewConfigurationFrameEndInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT) \ _(XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT) \ _(XrControllerModelKeyStateMSFT, XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT) \ _(XrControllerModelNodePropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT) \ _(XrControllerModelPropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT) \ _(XrControllerModelNodeStateMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT) \ _(XrControllerModelStateMSFT, XR_TYPE_CONTROLLER_MODEL_STATE_MSFT) \ _(XrViewConfigurationViewFovEPIC, XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC) \ _(XrCompositionLayerReprojectionInfoMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT) \ _(XrCompositionLayerReprojectionPlaneOverrideMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT) \ _(XrCompositionLayerSecureContentFB, XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB) \ _(XrSystemBodyTrackingPropertiesFB, XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_FB) \ _(XrBodyTrackerCreateInfoFB, XR_TYPE_BODY_TRACKER_CREATE_INFO_FB) \ _(XrBodySkeletonFB, XR_TYPE_BODY_SKELETON_FB) \ _(XrBodyJointsLocateInfoFB, XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB) \ _(XrBodyJointLocationsFB, XR_TYPE_BODY_JOINT_LOCATIONS_FB) \ _(XrInteractionProfileDpadBindingEXT, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT) \ _(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ _(XrHandJointsMotionRangeInfoEXT, XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT) \ _(XrSceneObserverCreateInfoMSFT, XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT) \ _(XrSceneCreateInfoMSFT, XR_TYPE_SCENE_CREATE_INFO_MSFT) \ _(XrNewSceneComputeInfoMSFT, XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT) \ _(XrVisualMeshComputeLodInfoMSFT, XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT) \ _(XrSceneComponentsMSFT, XR_TYPE_SCENE_COMPONENTS_MSFT) \ _(XrSceneComponentsGetInfoMSFT, XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT) \ _(XrSceneComponentLocationsMSFT, XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT) \ _(XrSceneComponentsLocateInfoMSFT, XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT) \ _(XrSceneObjectsMSFT, XR_TYPE_SCENE_OBJECTS_MSFT) \ _(XrSceneComponentParentFilterInfoMSFT, XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT) \ _(XrSceneObjectTypesFilterInfoMSFT, XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT) \ _(XrScenePlanesMSFT, XR_TYPE_SCENE_PLANES_MSFT) \ _(XrScenePlaneAlignmentFilterInfoMSFT, XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT) \ _(XrSceneMeshesMSFT, XR_TYPE_SCENE_MESHES_MSFT) \ _(XrSceneMeshBuffersGetInfoMSFT, XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT) \ _(XrSceneMeshBuffersMSFT, XR_TYPE_SCENE_MESH_BUFFERS_MSFT) \ _(XrSceneMeshVertexBufferMSFT, XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT) \ _(XrSceneMeshIndicesUint32MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT) \ _(XrSceneMeshIndicesUint16MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT) \ _(XrSerializedSceneFragmentDataGetInfoMSFT, XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT) \ _(XrSceneDeserializeInfoMSFT, XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT) \ _(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ _(XrViveTrackerPathsHTCX, XR_TYPE_VIVE_TRACKER_PATHS_HTCX) \ _(XrEventDataViveTrackerConnectedHTCX, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX) \ _(XrSystemFacialTrackingPropertiesHTC, XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC) \ _(XrFacialExpressionsHTC, XR_TYPE_FACIAL_EXPRESSIONS_HTC) \ _(XrFacialTrackerCreateInfoHTC, XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC) \ _(XrSystemColorSpacePropertiesFB, XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB) \ _(XrHandTrackingMeshFB, XR_TYPE_HAND_TRACKING_MESH_FB) \ _(XrHandTrackingScaleFB, XR_TYPE_HAND_TRACKING_SCALE_FB) \ _(XrHandTrackingAimStateFB, XR_TYPE_HAND_TRACKING_AIM_STATE_FB) \ _(XrHandTrackingCapsulesStateFB, XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB) \ _(XrSystemSpatialEntityPropertiesFB, XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB) \ _(XrSpatialAnchorCreateInfoFB, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB) \ _(XrSpaceComponentStatusSetInfoFB, XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB) \ _(XrSpaceComponentStatusFB, XR_TYPE_SPACE_COMPONENT_STATUS_FB) \ _(XrEventDataSpatialAnchorCreateCompleteFB, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB) \ _(XrEventDataSpaceSetStatusCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) \ _(XrFoveationProfileCreateInfoFB, XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB) \ _(XrSwapchainCreateInfoFoveationFB, XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB) \ _(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ _(XrFoveationLevelProfileCreateInfoFB, XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB) \ _(XrSystemKeyboardTrackingPropertiesFB, XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB) \ _(XrKeyboardSpaceCreateInfoFB, XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB) \ _(XrKeyboardTrackingQueryFB, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB) \ _(XrTriangleMeshCreateInfoFB, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB) \ _(XrSystemPassthroughPropertiesFB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB) \ _(XrSystemPassthroughProperties2FB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB) \ _(XrPassthroughCreateInfoFB, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB) \ _(XrPassthroughLayerCreateInfoFB, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB) \ _(XrCompositionLayerPassthroughFB, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB) \ _(XrGeometryInstanceCreateInfoFB, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB) \ _(XrGeometryInstanceTransformFB, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB) \ _(XrPassthroughStyleFB, XR_TYPE_PASSTHROUGH_STYLE_FB) \ _(XrPassthroughColorMapMonoToRgbaFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB) \ _(XrPassthroughColorMapMonoToMonoFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB) \ _(XrPassthroughBrightnessContrastSaturationFB, XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB) \ _(XrEventDataPassthroughStateChangedFB, XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB) \ _(XrRenderModelPathInfoFB, XR_TYPE_RENDER_MODEL_PATH_INFO_FB) \ _(XrRenderModelPropertiesFB, XR_TYPE_RENDER_MODEL_PROPERTIES_FB) \ _(XrRenderModelBufferFB, XR_TYPE_RENDER_MODEL_BUFFER_FB) \ _(XrRenderModelLoadInfoFB, XR_TYPE_RENDER_MODEL_LOAD_INFO_FB) \ _(XrSystemRenderModelPropertiesFB, XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB) \ _(XrRenderModelCapabilitiesRequestFB, XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB) \ _(XrViewLocateFoveatedRenderingVARJO, XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO) \ _(XrFoveatedViewConfigurationViewVARJO, XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO) \ _(XrSystemFoveatedRenderingPropertiesVARJO, XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO) \ _(XrCompositionLayerDepthTestVARJO, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO) \ _(XrSystemMarkerTrackingPropertiesVARJO, XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO) \ _(XrEventDataMarkerTrackingUpdateVARJO, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO) \ _(XrMarkerSpaceCreateInfoVARJO, XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO) \ _(XrFrameEndInfoML, XR_TYPE_FRAME_END_INFO_ML) \ _(XrGlobalDimmerFrameEndInfoML, XR_TYPE_GLOBAL_DIMMER_FRAME_END_INFO_ML) \ _(XrSpatialAnchorPersistenceInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT) \ _(XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT) \ _(XrSpaceQueryInfoFB, XR_TYPE_SPACE_QUERY_INFO_FB) \ _(XrSpaceStorageLocationFilterInfoFB, XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB) \ _(XrSpaceUuidFilterInfoFB, XR_TYPE_SPACE_UUID_FILTER_INFO_FB) \ _(XrSpaceComponentFilterInfoFB, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB) \ _(XrSpaceQueryResultsFB, XR_TYPE_SPACE_QUERY_RESULTS_FB) \ _(XrEventDataSpaceQueryResultsAvailableFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) \ _(XrEventDataSpaceQueryCompleteFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) \ _(XrSpaceSaveInfoFB, XR_TYPE_SPACE_SAVE_INFO_FB) \ _(XrSpaceEraseInfoFB, XR_TYPE_SPACE_ERASE_INFO_FB) \ _(XrEventDataSpaceSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB) \ _(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ _(XrSpaceShareInfoFB, XR_TYPE_SPACE_SHARE_INFO_FB) \ _(XrEventDataSpaceShareCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB) \ _(XrCompositionLayerSpaceWarpInfoFB, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB) \ _(XrSystemSpaceWarpPropertiesFB, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB) \ _(XrHapticAmplitudeEnvelopeVibrationFB, XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB) \ _(XrSemanticLabelsFB, XR_TYPE_SEMANTIC_LABELS_FB) \ _(XrRoomLayoutFB, XR_TYPE_ROOM_LAYOUT_FB) \ _(XrBoundary2DFB, XR_TYPE_BOUNDARY_2D_FB) \ _(XrSemanticLabelsSupportInfoFB, XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB) \ _(XrDigitalLensControlALMALENCE, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE) \ _(XrEventDataSceneCaptureCompleteFB, XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB) \ _(XrSceneCaptureRequestInfoFB, XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB) \ _(XrSpaceContainerFB, XR_TYPE_SPACE_CONTAINER_FB) \ _(XrFoveationEyeTrackedProfileCreateInfoMETA, XR_TYPE_FOVEATION_EYE_TRACKED_PROFILE_CREATE_INFO_META) \ _(XrFoveationEyeTrackedStateMETA, XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META) \ _(XrSystemFoveationEyeTrackedPropertiesMETA, XR_TYPE_SYSTEM_FOVEATION_EYE_TRACKED_PROPERTIES_META) \ _(XrSystemFaceTrackingPropertiesFB, XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_FB) \ _(XrFaceTrackerCreateInfoFB, XR_TYPE_FACE_TRACKER_CREATE_INFO_FB) \ _(XrFaceExpressionInfoFB, XR_TYPE_FACE_EXPRESSION_INFO_FB) \ _(XrFaceExpressionWeightsFB, XR_TYPE_FACE_EXPRESSION_WEIGHTS_FB) \ _(XrEyeTrackerCreateInfoFB, XR_TYPE_EYE_TRACKER_CREATE_INFO_FB) \ _(XrEyeGazesInfoFB, XR_TYPE_EYE_GAZES_INFO_FB) \ _(XrSystemEyeTrackingPropertiesFB, XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB) \ _(XrEyeGazesFB, XR_TYPE_EYE_GAZES_FB) \ _(XrPassthroughKeyboardHandsIntensityFB, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB) \ _(XrCompositionLayerSettingsFB, XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB) \ _(XrHapticPcmVibrationFB, XR_TYPE_HAPTIC_PCM_VIBRATION_FB) \ _(XrDevicePcmSampleRateStateFB, XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB) \ _(XrCompositionLayerDepthTestFB, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_FB) \ _(XrLocalDimmingFrameEndInfoMETA, XR_TYPE_LOCAL_DIMMING_FRAME_END_INFO_META) \ _(XrSystemVirtualKeyboardPropertiesMETA, XR_TYPE_SYSTEM_VIRTUAL_KEYBOARD_PROPERTIES_META) \ _(XrVirtualKeyboardCreateInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_CREATE_INFO_META) \ _(XrVirtualKeyboardSpaceCreateInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_SPACE_CREATE_INFO_META) \ _(XrVirtualKeyboardLocationInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_LOCATION_INFO_META) \ _(XrVirtualKeyboardModelVisibilitySetInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_VISIBILITY_SET_INFO_META) \ _(XrVirtualKeyboardAnimationStateMETA, XR_TYPE_VIRTUAL_KEYBOARD_ANIMATION_STATE_META) \ _(XrVirtualKeyboardModelAnimationStatesMETA, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_ANIMATION_STATES_META) \ _(XrVirtualKeyboardTextureDataMETA, XR_TYPE_VIRTUAL_KEYBOARD_TEXTURE_DATA_META) \ _(XrVirtualKeyboardInputInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_INPUT_INFO_META) \ _(XrVirtualKeyboardTextContextChangeInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_TEXT_CONTEXT_CHANGE_INFO_META) \ _(XrEventDataVirtualKeyboardCommitTextMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_COMMIT_TEXT_META) \ _(XrEventDataVirtualKeyboardBackspaceMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_BACKSPACE_META) \ _(XrEventDataVirtualKeyboardEnterMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_ENTER_META) \ _(XrEventDataVirtualKeyboardShownMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_SHOWN_META) \ _(XrEventDataVirtualKeyboardHiddenMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_HIDDEN_META) \ _(XrExternalCameraOCULUS, XR_TYPE_EXTERNAL_CAMERA_OCULUS) \ _(XrPerformanceMetricsStateMETA, XR_TYPE_PERFORMANCE_METRICS_STATE_META) \ _(XrPerformanceMetricsCounterMETA, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META) \ _(XrSpaceListSaveInfoFB, XR_TYPE_SPACE_LIST_SAVE_INFO_FB) \ _(XrEventDataSpaceListSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB) \ _(XrSpaceUserCreateInfoFB, XR_TYPE_SPACE_USER_CREATE_INFO_FB) \ _(XrSystemHeadsetIdPropertiesMETA, XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META) \ _(XrPassthroughColorLutCreateInfoMETA, XR_TYPE_PASSTHROUGH_COLOR_LUT_CREATE_INFO_META) \ _(XrPassthroughColorLutUpdateInfoMETA, XR_TYPE_PASSTHROUGH_COLOR_LUT_UPDATE_INFO_META) \ _(XrPassthroughColorMapLutMETA, XR_TYPE_PASSTHROUGH_COLOR_MAP_LUT_META) \ _(XrPassthroughColorMapInterpolatedLutMETA, XR_TYPE_PASSTHROUGH_COLOR_MAP_INTERPOLATED_LUT_META) \ _(XrSystemPassthroughColorLutPropertiesMETA, XR_TYPE_SYSTEM_PASSTHROUGH_COLOR_LUT_PROPERTIES_META) \ _(XrPassthroughCreateInfoHTC, XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC) \ _(XrPassthroughColorHTC, XR_TYPE_PASSTHROUGH_COLOR_HTC) \ _(XrPassthroughMeshTransformInfoHTC, XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC) \ _(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ _(XrFoveationApplyInfoHTC, XR_TYPE_FOVEATION_APPLY_INFO_HTC) \ _(XrFoveationDynamicModeInfoHTC, XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC) \ _(XrFoveationCustomModeInfoHTC, XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC) \ _(XrActiveActionSetPrioritiesEXT, XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT) \ _(XrSystemForceFeedbackCurlPropertiesMNDX, XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX) \ _(XrForceFeedbackCurlApplyLocationsMNDX, XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX) \ _(XrHandTrackingDataSourceInfoEXT, XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT) \ _(XrHandTrackingDataSourceStateEXT, XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT) \ _(XrSystemPlaneDetectionPropertiesEXT, XR_TYPE_SYSTEM_PLANE_DETECTION_PROPERTIES_EXT) \ _(XrPlaneDetectorCreateInfoEXT, XR_TYPE_PLANE_DETECTOR_CREATE_INFO_EXT) \ _(XrPlaneDetectorBeginInfoEXT, XR_TYPE_PLANE_DETECTOR_BEGIN_INFO_EXT) \ _(XrPlaneDetectorGetInfoEXT, XR_TYPE_PLANE_DETECTOR_GET_INFO_EXT) \ _(XrPlaneDetectorLocationEXT, XR_TYPE_PLANE_DETECTOR_LOCATION_EXT) \ _(XrPlaneDetectorLocationsEXT, XR_TYPE_PLANE_DETECTOR_LOCATIONS_EXT) \ _(XrPlaneDetectorPolygonBufferEXT, XR_TYPE_PLANE_DETECTOR_POLYGON_BUFFER_EXT) \ #if defined(XR_USE_GRAPHICS_API_D3D11) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_D3D11 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ _(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ _(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ _(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) #endif #if defined(XR_USE_GRAPHICS_API_D3D12) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_D3D12 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ _(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ _(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ _(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ _(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ _(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WAYLAND) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_WAYLAND are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ _(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WIN32) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_WIN32 are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ _(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XCB) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_XCB are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ _(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XLIB) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_XLIB are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ _(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL_ES is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ _(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ _(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ _(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) && defined(XR_USE_PLATFORM_ANDROID) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_OPENGL_ES and XR_USE_PLATFORM_ANDROID are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ _(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) #endif #if defined(XR_USE_GRAPHICS_API_VULKAN) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_GRAPHICS_API_VULKAN is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ _(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ _(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ _(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ _(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ _(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ _(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ _(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ _(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ _(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ _(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) #endif #if defined(XR_USE_PLATFORM_ANDROID) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_PLATFORM_ANDROID is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ _(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ _(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ _(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ _(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) #endif #if defined(XR_USE_PLATFORM_EGL) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_PLATFORM_EGL is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ _(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) #endif #if defined(XR_USE_PLATFORM_ML) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_PLATFORM_ML is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_) \ _(XrCoordinateSpaceCreateInfoML, XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_) #endif #if defined(XR_USE_PLATFORM_WIN32) /// Implementation detail of XR_LIST_STRUCTURE_TYPES() /// Structure types available only when XR_USE_PLATFORM_WIN32 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ _(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) #endif /// Calls your macro with the name and extension number of all known /// extensions in this version of the spec. #define XR_LIST_EXTENSIONS(_) \ _(XR_KHR_android_thread_settings, 4) \ _(XR_KHR_android_surface_swapchain, 5) \ _(XR_KHR_composition_layer_cube, 7) \ _(XR_KHR_android_create_instance, 9) \ _(XR_KHR_composition_layer_depth, 11) \ _(XR_KHR_vulkan_swapchain_format_list, 15) \ _(XR_EXT_performance_settings, 16) \ _(XR_EXT_thermal_query, 17) \ _(XR_KHR_composition_layer_cylinder, 18) \ _(XR_KHR_composition_layer_equirect, 19) \ _(XR_EXT_debug_utils, 20) \ _(XR_KHR_opengl_enable, 24) \ _(XR_KHR_opengl_es_enable, 25) \ _(XR_KHR_vulkan_enable, 26) \ _(XR_KHR_D3D11_enable, 28) \ _(XR_KHR_D3D12_enable, 29) \ _(XR_EXT_eye_gaze_interaction, 31) \ _(XR_KHR_visibility_mask, 32) \ _(XR_EXTX_overlay, 34) \ _(XR_KHR_composition_layer_color_scale_bias, 35) \ _(XR_KHR_win32_convert_performance_counter_time, 36) \ _(XR_KHR_convert_timespec_time, 37) \ _(XR_VARJO_quad_views, 38) \ _(XR_MSFT_unbounded_reference_space, 39) \ _(XR_MSFT_spatial_anchor, 40) \ _(XR_FB_composition_layer_image_layout, 41) \ _(XR_FB_composition_layer_alpha_blend, 42) \ _(XR_MND_headless, 43) \ _(XR_OCULUS_android_session_state_enable, 45) \ _(XR_EXT_view_configuration_depth_range, 47) \ _(XR_EXT_conformance_automation, 48) \ _(XR_MNDX_egl_enable, 49) \ _(XR_MSFT_spatial_graph_bridge, 50) \ _(XR_MSFT_hand_interaction, 51) \ _(XR_EXT_hand_tracking, 52) \ _(XR_MSFT_hand_tracking_mesh, 53) \ _(XR_MSFT_secondary_view_configuration, 54) \ _(XR_MSFT_first_person_observer, 55) \ _(XR_MSFT_controller_model, 56) \ _(XR_MSFT_perception_anchor_interop, 57) \ _(XR_EXT_win32_appcontainer_compatible, 58) \ _(XR_EPIC_view_configuration_fov, 60) \ _(XR_MSFT_holographic_window_attachment, 64) \ _(XR_MSFT_composition_layer_reprojection, 67) \ _(XR_HUAWEI_controller_interaction, 70) \ _(XR_FB_android_surface_swapchain_create, 71) \ _(XR_FB_swapchain_update_state, 72) \ _(XR_FB_composition_layer_secure_content, 73) \ _(XR_FB_body_tracking, 77) \ _(XR_EXT_dpad_binding, 79) \ _(XR_VALVE_analog_threshold, 80) \ _(XR_EXT_hand_joints_motion_range, 81) \ _(XR_KHR_loader_init, 89) \ _(XR_KHR_loader_init_android, 90) \ _(XR_KHR_vulkan_enable2, 91) \ _(XR_KHR_composition_layer_equirect2, 92) \ _(XR_EXT_samsung_odyssey_controller, 95) \ _(XR_EXT_hp_mixed_reality_controller, 96) \ _(XR_MND_swapchain_usage_input_attachment_bit, 97) \ _(XR_MSFT_scene_understanding, 98) \ _(XR_MSFT_scene_understanding_serialization, 99) \ _(XR_FB_display_refresh_rate, 102) \ _(XR_HTC_vive_cosmos_controller_interaction, 103) \ _(XR_HTCX_vive_tracker_interaction, 104) \ _(XR_HTC_facial_tracking, 105) \ _(XR_HTC_vive_focus3_controller_interaction, 106) \ _(XR_HTC_hand_interaction, 107) \ _(XR_HTC_vive_wrist_tracker_interaction, 108) \ _(XR_FB_color_space, 109) \ _(XR_FB_hand_tracking_mesh, 111) \ _(XR_FB_hand_tracking_aim, 112) \ _(XR_FB_hand_tracking_capsules, 113) \ _(XR_FB_spatial_entity, 114) \ _(XR_FB_foveation, 115) \ _(XR_FB_foveation_configuration, 116) \ _(XR_FB_keyboard_tracking, 117) \ _(XR_FB_triangle_mesh, 118) \ _(XR_FB_passthrough, 119) \ _(XR_FB_render_model, 120) \ _(XR_KHR_binding_modification, 121) \ _(XR_VARJO_foveated_rendering, 122) \ _(XR_VARJO_composition_layer_depth_test, 123) \ _(XR_VARJO_environment_depth_estimation, 124) \ _(XR_VARJO_marker_tracking, 125) \ _(XR_VARJO_view_offset, 126) \ _(XR_ML_ml2_controller_interaction, 135) \ _(XR_ML_frame_end_info, 136) \ _(XR_ML_global_dimmer, 137) \ _(XR_ML_compat, 138) \ _(XR_MSFT_spatial_anchor_persistence, 143) \ _(XR_ULTRALEAP_hand_tracking_forearm, 150) \ _(XR_FB_spatial_entity_query, 157) \ _(XR_FB_spatial_entity_storage, 159) \ _(XR_OCULUS_audio_device_guid, 160) \ _(XR_FB_foveation_vulkan, 161) \ _(XR_FB_swapchain_update_state_android_surface, 162) \ _(XR_FB_swapchain_update_state_opengl_es, 163) \ _(XR_FB_swapchain_update_state_vulkan, 164) \ _(XR_KHR_swapchain_usage_input_attachment_bit, 166) \ _(XR_FB_touch_controller_pro, 168) \ _(XR_FB_spatial_entity_sharing, 170) \ _(XR_FB_space_warp, 172) \ _(XR_FB_haptic_amplitude_envelope, 174) \ _(XR_FB_scene, 176) \ _(XR_EXT_palm_pose, 177) \ _(XR_ALMALENCE_digital_lens_control, 197) \ _(XR_FB_scene_capture, 199) \ _(XR_FB_spatial_entity_container, 200) \ _(XR_META_foveation_eye_tracked, 201) \ _(XR_FB_face_tracking, 202) \ _(XR_FB_eye_tracking_social, 203) \ _(XR_FB_passthrough_keyboard_hands, 204) \ _(XR_FB_composition_layer_settings, 205) \ _(XR_FB_touch_controller_proximity, 207) \ _(XR_FB_haptic_pcm, 210) \ _(XR_FB_composition_layer_depth_test, 213) \ _(XR_META_local_dimming, 217) \ _(XR_META_virtual_keyboard, 220) \ _(XR_OCULUS_external_camera, 227) \ _(XR_META_vulkan_swapchain_create_info, 228) \ _(XR_META_performance_metrics, 233) \ _(XR_FB_spatial_entity_storage_batch, 239) \ _(XR_FB_spatial_entity_user, 242) \ _(XR_META_headset_id, 246) \ _(XR_META_passthrough_color_lut, 267) \ _(XR_EXT_uuid, 300) \ _(XR_EXT_hand_interaction, 303) \ _(XR_QCOM_tracking_optimization_settings, 307) \ _(XR_HTC_passthrough, 318) \ _(XR_HTC_foveation, 319) \ _(XR_EXT_active_action_set_priority, 374) \ _(XR_MNDX_force_feedback_curl, 376) \ _(XR_BD_controller_interaction, 385) \ _(XR_EXT_local_floor, 427) \ _(XR_EXT_hand_tracking_data_source, 429) \ _(XR_EXT_plane_detection, 430) \ _(XR_OPPO_controller_interaction, 454) \ #endif ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr_reflection_parent_structs.h ================================================ #ifndef OPENXR_REFLECTION_PARENT_STRUCTS_H_ #define OPENXR_REFLECTION_PARENT_STRUCTS_H_ 1 /* ** Copyright (c) 2017-2023, The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ /* ** This header is generated from the Khronos OpenXR XML API Registry. ** */ #include "openxr.h" /* This file contains expansion macros (X Macros) for OpenXR structures that have a parent type. */ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrCompositionLayerBaseHeader #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader_CORE(_avail, _unavail) \ _avail(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ _avail(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ _avail(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ _avail(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ _avail(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ _avail(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ _avail(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrEventDataBaseHeader #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader_CORE(_avail, _unavail) \ _avail(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ _avail(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ _avail(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ _avail(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ _avail(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ _avail(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ _avail(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ _avail(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ _avail(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ _avail(XrEventDataViveTrackerConnectedHTCX, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX) \ _avail(XrEventDataSpatialAnchorCreateCompleteFB, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB) \ _avail(XrEventDataSpaceSetStatusCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) \ _avail(XrEventDataMarkerTrackingUpdateVARJO, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO) \ _avail(XrEventDataSpaceQueryResultsAvailableFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) \ _avail(XrEventDataSpaceQueryCompleteFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) \ _avail(XrEventDataSpaceSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB) \ _avail(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ _avail(XrEventDataSpaceShareCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB) \ _avail(XrEventDataSpaceListSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB) \ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrHapticBaseHeader #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader_CORE(_avail, _unavail) \ _avail(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ _avail(XrHapticAmplitudeEnvelopeVibrationFB, XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB) \ _avail(XrHapticPcmVibrationFB, XR_TYPE_HAPTIC_PCM_VIBRATION_FB) \ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSwapchainImageBaseHeader #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_CORE(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_CORE(_avail, _unavail) \ #if defined(XR_USE_GRAPHICS_API_D3D11) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _avail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _unavail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_D3D12) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _avail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _unavail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _avail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _unavail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _avail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _unavail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_VULKAN) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _avail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _unavail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ #endif /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrLoaderInitInfoBaseHeaderKHR #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_CORE(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_CORE(_avail, _unavail) \ #if defined(XR_USE_PLATFORM_ANDROID) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _avail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _unavail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ #endif /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrBindingModificationBaseHeaderKHR #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR_CORE(_avail, _unavail) \ _avail(XrInteractionProfileDpadBindingEXT, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT) \ _avail(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSwapchainStateBaseHeaderFB #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_CORE(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_CORE(_avail, _unavail) \ _avail(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _avail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _unavail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ #endif #if defined(XR_USE_GRAPHICS_API_VULKAN) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _avail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _unavail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ #endif #if defined(XR_USE_PLATFORM_ANDROID) #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _avail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ #else #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _unavail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ #endif /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSpaceQueryInfoBaseHeaderFB #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB_CORE(_avail, _unavail) \ _avail(XrSpaceQueryInfoFB, XR_TYPE_SPACE_QUERY_INFO_FB) \ /// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSpaceFilterInfoBaseHeaderFB #define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB(_avail, _unavail) \ _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB_CORE(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB() #define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB_CORE(_avail, _unavail) \ _avail(XrSpaceUuidFilterInfoFB, XR_TYPE_SPACE_UUID_FILTER_INFO_FB) \ _avail(XrSpaceComponentFilterInfoFB, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB) \ #endif ================================================ FILE: modules/rayneoSDKHeaders/openxr/openxr_reflection_structs.h ================================================ #ifndef OPENXR_REFLECTION_STRUCTS_H_ #define OPENXR_REFLECTION_STRUCTS_H_ 1 /* ** Copyright (c) 2017-2023, The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 OR MIT */ /* ** This header is generated from the Khronos OpenXR XML API Registry. ** */ #include "openxr.h" /* This file contains expansion macros (X Macros) for OpenXR structures. */ /// Calls one of your macros with the structure type name and the XrStructureType constant for /// each known structure type. The first macro (_avail) is called for those that are available, /// while the second macro (_unavail) is called for those unavailable due to preprocessor definitions. #define XR_LIST_ALL_STRUCTURE_TYPES(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_CORE(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_avail, _unavail) \ _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ // Implementation detail of XR_LIST_ALL_STRUCTURE_TYPES() #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_CORE(_avail, _unavail) \ _avail(XrApiLayerProperties, XR_TYPE_API_LAYER_PROPERTIES) \ _avail(XrExtensionProperties, XR_TYPE_EXTENSION_PROPERTIES) \ _avail(XrInstanceCreateInfo, XR_TYPE_INSTANCE_CREATE_INFO) \ _avail(XrInstanceProperties, XR_TYPE_INSTANCE_PROPERTIES) \ _avail(XrEventDataBuffer, XR_TYPE_EVENT_DATA_BUFFER) \ _avail(XrSystemGetInfo, XR_TYPE_SYSTEM_GET_INFO) \ _avail(XrSystemProperties, XR_TYPE_SYSTEM_PROPERTIES) \ _avail(XrSessionCreateInfo, XR_TYPE_SESSION_CREATE_INFO) \ _avail(XrSpaceVelocity, XR_TYPE_SPACE_VELOCITY) \ _avail(XrReferenceSpaceCreateInfo, XR_TYPE_REFERENCE_SPACE_CREATE_INFO) \ _avail(XrActionSpaceCreateInfo, XR_TYPE_ACTION_SPACE_CREATE_INFO) \ _avail(XrSpaceLocation, XR_TYPE_SPACE_LOCATION) \ _avail(XrViewConfigurationProperties, XR_TYPE_VIEW_CONFIGURATION_PROPERTIES) \ _avail(XrViewConfigurationView, XR_TYPE_VIEW_CONFIGURATION_VIEW) \ _avail(XrSwapchainCreateInfo, XR_TYPE_SWAPCHAIN_CREATE_INFO) \ _avail(XrSwapchainImageAcquireInfo, XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO) \ _avail(XrSwapchainImageWaitInfo, XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO) \ _avail(XrSwapchainImageReleaseInfo, XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO) \ _avail(XrSessionBeginInfo, XR_TYPE_SESSION_BEGIN_INFO) \ _avail(XrFrameWaitInfo, XR_TYPE_FRAME_WAIT_INFO) \ _avail(XrFrameState, XR_TYPE_FRAME_STATE) \ _avail(XrFrameBeginInfo, XR_TYPE_FRAME_BEGIN_INFO) \ _avail(XrFrameEndInfo, XR_TYPE_FRAME_END_INFO) \ _avail(XrViewLocateInfo, XR_TYPE_VIEW_LOCATE_INFO) \ _avail(XrViewState, XR_TYPE_VIEW_STATE) \ _avail(XrView, XR_TYPE_VIEW) \ _avail(XrActionSetCreateInfo, XR_TYPE_ACTION_SET_CREATE_INFO) \ _avail(XrActionCreateInfo, XR_TYPE_ACTION_CREATE_INFO) \ _avail(XrInteractionProfileSuggestedBinding, XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING) \ _avail(XrSessionActionSetsAttachInfo, XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO) \ _avail(XrInteractionProfileState, XR_TYPE_INTERACTION_PROFILE_STATE) \ _avail(XrActionStateGetInfo, XR_TYPE_ACTION_STATE_GET_INFO) \ _avail(XrActionStateBoolean, XR_TYPE_ACTION_STATE_BOOLEAN) \ _avail(XrActionStateFloat, XR_TYPE_ACTION_STATE_FLOAT) \ _avail(XrActionStateVector2f, XR_TYPE_ACTION_STATE_VECTOR2F) \ _avail(XrActionStatePose, XR_TYPE_ACTION_STATE_POSE) \ _avail(XrActionsSyncInfo, XR_TYPE_ACTIONS_SYNC_INFO) \ _avail(XrBoundSourcesForActionEnumerateInfo, XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO) \ _avail(XrInputSourceLocalizedNameGetInfo, XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO) \ _avail(XrHapticActionInfo, XR_TYPE_HAPTIC_ACTION_INFO) \ _avail(XrCompositionLayerProjectionView, XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW) \ _avail(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ _avail(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ _avail(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ _avail(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ _avail(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ _avail(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ _avail(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ _avail(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ _avail(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ _avail(XrCompositionLayerDepthInfoKHR, XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR) \ _avail(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ _avail(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ _avail(XrVisibilityMaskKHR, XR_TYPE_VISIBILITY_MASK_KHR) \ _avail(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ _avail(XrCompositionLayerColorScaleBiasKHR, XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR) \ _avail(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ _avail(XrBindingModificationsKHR, XR_TYPE_BINDING_MODIFICATIONS_KHR) \ _avail(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ _avail(XrDebugUtilsObjectNameInfoEXT, XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT) \ _avail(XrDebugUtilsLabelEXT, XR_TYPE_DEBUG_UTILS_LABEL_EXT) \ _avail(XrDebugUtilsMessengerCallbackDataEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT) \ _avail(XrDebugUtilsMessengerCreateInfoEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) \ _avail(XrSystemEyeGazeInteractionPropertiesEXT, XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT) \ _avail(XrEyeGazeSampleTimeEXT, XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT) \ _avail(XrSessionCreateInfoOverlayEXTX, XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX) \ _avail(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ _avail(XrSpatialAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT) \ _avail(XrSpatialAnchorSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT) \ _avail(XrCompositionLayerImageLayoutFB, XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB) \ _avail(XrCompositionLayerAlphaBlendFB, XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB) \ _avail(XrViewConfigurationDepthRangeEXT, XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT) \ _avail(XrSpatialGraphNodeSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT) \ _avail(XrSpatialGraphStaticNodeBindingCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT) \ _avail(XrSpatialGraphNodeBindingPropertiesGetInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT) \ _avail(XrSpatialGraphNodeBindingPropertiesMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT) \ _avail(XrSystemHandTrackingPropertiesEXT, XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT) \ _avail(XrHandTrackerCreateInfoEXT, XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT) \ _avail(XrHandJointsLocateInfoEXT, XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT) \ _avail(XrHandJointLocationsEXT, XR_TYPE_HAND_JOINT_LOCATIONS_EXT) \ _avail(XrHandJointVelocitiesEXT, XR_TYPE_HAND_JOINT_VELOCITIES_EXT) \ _avail(XrSystemHandTrackingMeshPropertiesMSFT, XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT) \ _avail(XrHandMeshSpaceCreateInfoMSFT, XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT) \ _avail(XrHandMeshUpdateInfoMSFT, XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT) \ _avail(XrHandMeshMSFT, XR_TYPE_HAND_MESH_MSFT) \ _avail(XrHandPoseTypeInfoMSFT, XR_TYPE_HAND_POSE_TYPE_INFO_MSFT) \ _avail(XrSecondaryViewConfigurationSessionBeginInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT) \ _avail(XrSecondaryViewConfigurationStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT) \ _avail(XrSecondaryViewConfigurationFrameStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT) \ _avail(XrSecondaryViewConfigurationLayerInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT) \ _avail(XrSecondaryViewConfigurationFrameEndInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT) \ _avail(XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT) \ _avail(XrControllerModelKeyStateMSFT, XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT) \ _avail(XrControllerModelNodePropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT) \ _avail(XrControllerModelPropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT) \ _avail(XrControllerModelNodeStateMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT) \ _avail(XrControllerModelStateMSFT, XR_TYPE_CONTROLLER_MODEL_STATE_MSFT) \ _avail(XrViewConfigurationViewFovEPIC, XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC) \ _avail(XrCompositionLayerReprojectionInfoMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT) \ _avail(XrCompositionLayerReprojectionPlaneOverrideMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT) \ _avail(XrCompositionLayerSecureContentFB, XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB) \ _avail(XrSystemBodyTrackingPropertiesFB, XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_FB) \ _avail(XrBodyTrackerCreateInfoFB, XR_TYPE_BODY_TRACKER_CREATE_INFO_FB) \ _avail(XrBodySkeletonFB, XR_TYPE_BODY_SKELETON_FB) \ _avail(XrBodyJointsLocateInfoFB, XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB) \ _avail(XrBodyJointLocationsFB, XR_TYPE_BODY_JOINT_LOCATIONS_FB) \ _avail(XrInteractionProfileDpadBindingEXT, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT) \ _avail(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ _avail(XrHandJointsMotionRangeInfoEXT, XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT) \ _avail(XrSceneObserverCreateInfoMSFT, XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT) \ _avail(XrSceneCreateInfoMSFT, XR_TYPE_SCENE_CREATE_INFO_MSFT) \ _avail(XrNewSceneComputeInfoMSFT, XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT) \ _avail(XrVisualMeshComputeLodInfoMSFT, XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT) \ _avail(XrSceneComponentsMSFT, XR_TYPE_SCENE_COMPONENTS_MSFT) \ _avail(XrSceneComponentsGetInfoMSFT, XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT) \ _avail(XrSceneComponentLocationsMSFT, XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT) \ _avail(XrSceneComponentsLocateInfoMSFT, XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT) \ _avail(XrSceneObjectsMSFT, XR_TYPE_SCENE_OBJECTS_MSFT) \ _avail(XrSceneComponentParentFilterInfoMSFT, XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT) \ _avail(XrSceneObjectTypesFilterInfoMSFT, XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT) \ _avail(XrScenePlanesMSFT, XR_TYPE_SCENE_PLANES_MSFT) \ _avail(XrScenePlaneAlignmentFilterInfoMSFT, XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT) \ _avail(XrSceneMeshesMSFT, XR_TYPE_SCENE_MESHES_MSFT) \ _avail(XrSceneMeshBuffersGetInfoMSFT, XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT) \ _avail(XrSceneMeshBuffersMSFT, XR_TYPE_SCENE_MESH_BUFFERS_MSFT) \ _avail(XrSceneMeshVertexBufferMSFT, XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT) \ _avail(XrSceneMeshIndicesUint32MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT) \ _avail(XrSceneMeshIndicesUint16MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT) \ _avail(XrSerializedSceneFragmentDataGetInfoMSFT, XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT) \ _avail(XrSceneDeserializeInfoMSFT, XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT) \ _avail(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ _avail(XrViveTrackerPathsHTCX, XR_TYPE_VIVE_TRACKER_PATHS_HTCX) \ _avail(XrEventDataViveTrackerConnectedHTCX, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX) \ _avail(XrSystemFacialTrackingPropertiesHTC, XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC) \ _avail(XrFacialExpressionsHTC, XR_TYPE_FACIAL_EXPRESSIONS_HTC) \ _avail(XrFacialTrackerCreateInfoHTC, XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC) \ _avail(XrSystemColorSpacePropertiesFB, XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB) \ _avail(XrHandTrackingMeshFB, XR_TYPE_HAND_TRACKING_MESH_FB) \ _avail(XrHandTrackingScaleFB, XR_TYPE_HAND_TRACKING_SCALE_FB) \ _avail(XrHandTrackingAimStateFB, XR_TYPE_HAND_TRACKING_AIM_STATE_FB) \ _avail(XrHandTrackingCapsulesStateFB, XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB) \ _avail(XrSystemSpatialEntityPropertiesFB, XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB) \ _avail(XrSpatialAnchorCreateInfoFB, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB) \ _avail(XrSpaceComponentStatusSetInfoFB, XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB) \ _avail(XrSpaceComponentStatusFB, XR_TYPE_SPACE_COMPONENT_STATUS_FB) \ _avail(XrEventDataSpatialAnchorCreateCompleteFB, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB) \ _avail(XrEventDataSpaceSetStatusCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) \ _avail(XrFoveationProfileCreateInfoFB, XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB) \ _avail(XrSwapchainCreateInfoFoveationFB, XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB) \ _avail(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ _avail(XrFoveationLevelProfileCreateInfoFB, XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB) \ _avail(XrSystemKeyboardTrackingPropertiesFB, XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB) \ _avail(XrKeyboardSpaceCreateInfoFB, XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB) \ _avail(XrKeyboardTrackingQueryFB, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB) \ _avail(XrTriangleMeshCreateInfoFB, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB) \ _avail(XrSystemPassthroughPropertiesFB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB) \ _avail(XrSystemPassthroughProperties2FB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB) \ _avail(XrPassthroughCreateInfoFB, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB) \ _avail(XrPassthroughLayerCreateInfoFB, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB) \ _avail(XrCompositionLayerPassthroughFB, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB) \ _avail(XrGeometryInstanceCreateInfoFB, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB) \ _avail(XrGeometryInstanceTransformFB, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB) \ _avail(XrPassthroughStyleFB, XR_TYPE_PASSTHROUGH_STYLE_FB) \ _avail(XrPassthroughColorMapMonoToRgbaFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB) \ _avail(XrPassthroughColorMapMonoToMonoFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB) \ _avail(XrPassthroughBrightnessContrastSaturationFB, XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB) \ _avail(XrEventDataPassthroughStateChangedFB, XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB) \ _avail(XrRenderModelPathInfoFB, XR_TYPE_RENDER_MODEL_PATH_INFO_FB) \ _avail(XrRenderModelPropertiesFB, XR_TYPE_RENDER_MODEL_PROPERTIES_FB) \ _avail(XrRenderModelBufferFB, XR_TYPE_RENDER_MODEL_BUFFER_FB) \ _avail(XrRenderModelLoadInfoFB, XR_TYPE_RENDER_MODEL_LOAD_INFO_FB) \ _avail(XrSystemRenderModelPropertiesFB, XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB) \ _avail(XrRenderModelCapabilitiesRequestFB, XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB) \ _avail(XrViewLocateFoveatedRenderingVARJO, XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO) \ _avail(XrFoveatedViewConfigurationViewVARJO, XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO) \ _avail(XrSystemFoveatedRenderingPropertiesVARJO, XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO) \ _avail(XrCompositionLayerDepthTestVARJO, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO) \ _avail(XrSystemMarkerTrackingPropertiesVARJO, XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO) \ _avail(XrEventDataMarkerTrackingUpdateVARJO, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO) \ _avail(XrMarkerSpaceCreateInfoVARJO, XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO) \ _avail(XrFrameEndInfoML, XR_TYPE_FRAME_END_INFO_ML) \ _avail(XrGlobalDimmerFrameEndInfoML, XR_TYPE_GLOBAL_DIMMER_FRAME_END_INFO_ML) \ _avail(XrSpatialAnchorPersistenceInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT) \ _avail(XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT) \ _avail(XrSpaceQueryInfoFB, XR_TYPE_SPACE_QUERY_INFO_FB) \ _avail(XrSpaceStorageLocationFilterInfoFB, XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB) \ _avail(XrSpaceUuidFilterInfoFB, XR_TYPE_SPACE_UUID_FILTER_INFO_FB) \ _avail(XrSpaceComponentFilterInfoFB, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB) \ _avail(XrSpaceQueryResultsFB, XR_TYPE_SPACE_QUERY_RESULTS_FB) \ _avail(XrEventDataSpaceQueryResultsAvailableFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) \ _avail(XrEventDataSpaceQueryCompleteFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) \ _avail(XrSpaceSaveInfoFB, XR_TYPE_SPACE_SAVE_INFO_FB) \ _avail(XrSpaceEraseInfoFB, XR_TYPE_SPACE_ERASE_INFO_FB) \ _avail(XrEventDataSpaceSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB) \ _avail(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ _avail(XrSpaceShareInfoFB, XR_TYPE_SPACE_SHARE_INFO_FB) \ _avail(XrEventDataSpaceShareCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB) \ _avail(XrCompositionLayerSpaceWarpInfoFB, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB) \ _avail(XrSystemSpaceWarpPropertiesFB, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB) \ _avail(XrHapticAmplitudeEnvelopeVibrationFB, XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB) \ _avail(XrSemanticLabelsFB, XR_TYPE_SEMANTIC_LABELS_FB) \ _avail(XrRoomLayoutFB, XR_TYPE_ROOM_LAYOUT_FB) \ _avail(XrBoundary2DFB, XR_TYPE_BOUNDARY_2D_FB) \ _avail(XrSemanticLabelsSupportInfoFB, XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB) \ _avail(XrDigitalLensControlALMALENCE, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE) \ _avail(XrEventDataSceneCaptureCompleteFB, XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB) \ _avail(XrSceneCaptureRequestInfoFB, XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB) \ _avail(XrSpaceContainerFB, XR_TYPE_SPACE_CONTAINER_FB) \ _avail(XrFoveationEyeTrackedProfileCreateInfoMETA, XR_TYPE_FOVEATION_EYE_TRACKED_PROFILE_CREATE_INFO_META) \ _avail(XrFoveationEyeTrackedStateMETA, XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META) \ _avail(XrSystemFoveationEyeTrackedPropertiesMETA, XR_TYPE_SYSTEM_FOVEATION_EYE_TRACKED_PROPERTIES_META) \ _avail(XrSystemFaceTrackingPropertiesFB, XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_FB) \ _avail(XrFaceTrackerCreateInfoFB, XR_TYPE_FACE_TRACKER_CREATE_INFO_FB) \ _avail(XrFaceExpressionInfoFB, XR_TYPE_FACE_EXPRESSION_INFO_FB) \ _avail(XrFaceExpressionWeightsFB, XR_TYPE_FACE_EXPRESSION_WEIGHTS_FB) \ _avail(XrEyeTrackerCreateInfoFB, XR_TYPE_EYE_TRACKER_CREATE_INFO_FB) \ _avail(XrEyeGazesInfoFB, XR_TYPE_EYE_GAZES_INFO_FB) \ _avail(XrSystemEyeTrackingPropertiesFB, XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB) \ _avail(XrEyeGazesFB, XR_TYPE_EYE_GAZES_FB) \ _avail(XrPassthroughKeyboardHandsIntensityFB, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB) \ _avail(XrCompositionLayerSettingsFB, XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB) \ _avail(XrHapticPcmVibrationFB, XR_TYPE_HAPTIC_PCM_VIBRATION_FB) \ _avail(XrDevicePcmSampleRateStateFB, XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB) \ _avail(XrCompositionLayerDepthTestFB, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_FB) \ _avail(XrLocalDimmingFrameEndInfoMETA, XR_TYPE_LOCAL_DIMMING_FRAME_END_INFO_META) \ _avail(XrSystemVirtualKeyboardPropertiesMETA, XR_TYPE_SYSTEM_VIRTUAL_KEYBOARD_PROPERTIES_META) \ _avail(XrVirtualKeyboardCreateInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_CREATE_INFO_META) \ _avail(XrVirtualKeyboardSpaceCreateInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_SPACE_CREATE_INFO_META) \ _avail(XrVirtualKeyboardLocationInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_LOCATION_INFO_META) \ _avail(XrVirtualKeyboardModelVisibilitySetInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_VISIBILITY_SET_INFO_META) \ _avail(XrVirtualKeyboardAnimationStateMETA, XR_TYPE_VIRTUAL_KEYBOARD_ANIMATION_STATE_META) \ _avail(XrVirtualKeyboardModelAnimationStatesMETA, XR_TYPE_VIRTUAL_KEYBOARD_MODEL_ANIMATION_STATES_META) \ _avail(XrVirtualKeyboardTextureDataMETA, XR_TYPE_VIRTUAL_KEYBOARD_TEXTURE_DATA_META) \ _avail(XrVirtualKeyboardInputInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_INPUT_INFO_META) \ _avail(XrVirtualKeyboardTextContextChangeInfoMETA, XR_TYPE_VIRTUAL_KEYBOARD_TEXT_CONTEXT_CHANGE_INFO_META) \ _avail(XrEventDataVirtualKeyboardCommitTextMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_COMMIT_TEXT_META) \ _avail(XrEventDataVirtualKeyboardBackspaceMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_BACKSPACE_META) \ _avail(XrEventDataVirtualKeyboardEnterMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_ENTER_META) \ _avail(XrEventDataVirtualKeyboardShownMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_SHOWN_META) \ _avail(XrEventDataVirtualKeyboardHiddenMETA, XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_HIDDEN_META) \ _avail(XrExternalCameraOCULUS, XR_TYPE_EXTERNAL_CAMERA_OCULUS) \ _avail(XrPerformanceMetricsStateMETA, XR_TYPE_PERFORMANCE_METRICS_STATE_META) \ _avail(XrPerformanceMetricsCounterMETA, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META) \ _avail(XrSpaceListSaveInfoFB, XR_TYPE_SPACE_LIST_SAVE_INFO_FB) \ _avail(XrEventDataSpaceListSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB) \ _avail(XrSpaceUserCreateInfoFB, XR_TYPE_SPACE_USER_CREATE_INFO_FB) \ _avail(XrSystemHeadsetIdPropertiesMETA, XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META) \ _avail(XrPassthroughColorLutCreateInfoMETA, XR_TYPE_PASSTHROUGH_COLOR_LUT_CREATE_INFO_META) \ _avail(XrPassthroughColorLutUpdateInfoMETA, XR_TYPE_PASSTHROUGH_COLOR_LUT_UPDATE_INFO_META) \ _avail(XrPassthroughColorMapLutMETA, XR_TYPE_PASSTHROUGH_COLOR_MAP_LUT_META) \ _avail(XrPassthroughColorMapInterpolatedLutMETA, XR_TYPE_PASSTHROUGH_COLOR_MAP_INTERPOLATED_LUT_META) \ _avail(XrSystemPassthroughColorLutPropertiesMETA, XR_TYPE_SYSTEM_PASSTHROUGH_COLOR_LUT_PROPERTIES_META) \ _avail(XrPassthroughCreateInfoHTC, XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC) \ _avail(XrPassthroughColorHTC, XR_TYPE_PASSTHROUGH_COLOR_HTC) \ _avail(XrPassthroughMeshTransformInfoHTC, XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC) \ _avail(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ _avail(XrFoveationApplyInfoHTC, XR_TYPE_FOVEATION_APPLY_INFO_HTC) \ _avail(XrFoveationDynamicModeInfoHTC, XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC) \ _avail(XrFoveationCustomModeInfoHTC, XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC) \ _avail(XrActiveActionSetPrioritiesEXT, XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT) \ _avail(XrSystemForceFeedbackCurlPropertiesMNDX, XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX) \ _avail(XrForceFeedbackCurlApplyLocationsMNDX, XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX) \ _avail(XrHandTrackingDataSourceInfoEXT, XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT) \ _avail(XrHandTrackingDataSourceStateEXT, XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT) \ _avail(XrSystemPlaneDetectionPropertiesEXT, XR_TYPE_SYSTEM_PLANE_DETECTION_PROPERTIES_EXT) \ _avail(XrPlaneDetectorCreateInfoEXT, XR_TYPE_PLANE_DETECTOR_CREATE_INFO_EXT) \ _avail(XrPlaneDetectorBeginInfoEXT, XR_TYPE_PLANE_DETECTOR_BEGIN_INFO_EXT) \ _avail(XrPlaneDetectorGetInfoEXT, XR_TYPE_PLANE_DETECTOR_GET_INFO_EXT) \ _avail(XrPlaneDetectorLocationEXT, XR_TYPE_PLANE_DETECTOR_LOCATION_EXT) \ _avail(XrPlaneDetectorLocationsEXT, XR_TYPE_PLANE_DETECTOR_LOCATIONS_EXT) \ _avail(XrPlaneDetectorPolygonBufferEXT, XR_TYPE_PLANE_DETECTOR_POLYGON_BUFFER_EXT) \ #if defined(XR_USE_GRAPHICS_API_D3D11) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _avail(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ _avail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ _avail(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ _unavail(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ _unavail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ _unavail(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_D3D12) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _avail(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ _avail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ _avail(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ _unavail(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ _unavail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ _unavail(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _avail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ _avail(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ _unavail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ _unavail(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WAYLAND) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ _avail(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ _unavail(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WIN32) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ _avail(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ _unavail(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XCB) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ _avail(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ _unavail(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XLIB) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ _avail(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ _unavail(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _avail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ _avail(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ _avail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ _unavail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ _unavail(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ _unavail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) && defined(XR_USE_PLATFORM_ANDROID) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _avail(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _unavail(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ #endif #if defined(XR_USE_GRAPHICS_API_VULKAN) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _avail(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ _avail(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ _avail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ _avail(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ _avail(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ _avail(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ _avail(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ _avail(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ _avail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ _avail(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ _unavail(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ _unavail(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ _unavail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ _unavail(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ _unavail(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ _unavail(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ _unavail(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ _unavail(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ _unavail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ _unavail(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ #endif #if defined(XR_USE_PLATFORM_ANDROID) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _avail(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ _avail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ _avail(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ _avail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ _unavail(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ _unavail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ _unavail(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ _unavail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ #endif #if defined(XR_USE_PLATFORM_EGL) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ _avail(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ _unavail(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ #endif #if defined(XR_USE_PLATFORM_ML) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_avail, _unavail) \ _avail(XrCoordinateSpaceCreateInfoML, XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ML(_avail, _unavail) \ _unavail(XrCoordinateSpaceCreateInfoML, XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML) \ #endif #if defined(XR_USE_PLATFORM_WIN32) #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ _avail(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ #else #define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ _unavail(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ #endif #endif ================================================ FILE: src/buffer.c ================================================ #include "buffer.h" #include "logging.h" #include #include buffer_type *create_buffer(int size) { buffer_type *buffer = calloc(1, sizeof(buffer_type)); if (buffer == NULL) { return NULL; } buffer->size = size; buffer->values = calloc(size, sizeof(float)); if (buffer->values == NULL) { free(buffer); buffer = NULL; return NULL; } buffer->index = 0; buffer->count = 0; return buffer; } void free_buffer(buffer_type *buffer) { if (buffer != NULL) { if (buffer->values != NULL) { free(buffer->values); buffer->values = NULL; } free(buffer); } } bool is_full(buffer_type *buffer) { return buffer->count == buffer->size; } float push(buffer_type *buffer, float next_value) { float popped_value = 0; if (is_full(buffer)) { popped_value = buffer->values[buffer->index]; } else { buffer->count++; } buffer->values[buffer->index++] = next_value; buffer->index %= buffer->size; return popped_value; } imu_buffer_type *create_imu_buffer(int buffer_size) { imu_buffer_type *gyro_buffer = calloc(1, sizeof(imu_buffer_type)); if (gyro_buffer == NULL) { return NULL; } gyro_buffer->stage_1 = calloc(GYRO_BUFFERS_COUNT, sizeof(buffer_type*)); gyro_buffer->stage_2 = calloc(GYRO_BUFFERS_COUNT, sizeof(buffer_type*)); for (int i = 0; i < GYRO_BUFFERS_COUNT; i++) { gyro_buffer->stage_1[i] = create_buffer(buffer_size); gyro_buffer->stage_2[i] = create_buffer(buffer_size); if (gyro_buffer->stage_1[i] == NULL || gyro_buffer->stage_2[i] == NULL) { log_error("Error allocating memory\n"); return NULL; } } return gyro_buffer; } void free_imu_buffer(imu_buffer_type *gyro_buffer) { if (gyro_buffer != NULL) { if (gyro_buffer->stage_1 != NULL) { for (int i = 0; i < GYRO_BUFFERS_COUNT; i++) { free_buffer(gyro_buffer->stage_1[i]); } free(gyro_buffer->stage_1); gyro_buffer->stage_1 = NULL; } if (gyro_buffer->stage_2 != NULL) { for (int i = 0; i < GYRO_BUFFERS_COUNT; i++) { free_buffer(gyro_buffer->stage_2[i]); } free(gyro_buffer->stage_2); gyro_buffer->stage_2 = NULL; } free(gyro_buffer); } } int imu_buffer_size(imu_buffer_type *gyro_buffer) { if (gyro_buffer != NULL && gyro_buffer->stage_1 != NULL && gyro_buffer->stage_1[0] != NULL) { return gyro_buffer->stage_1[0]->size; } return 0; } imu_buffer_response_type *push_to_imu_buffer(imu_buffer_type *gyro_buffer, imu_quat_type quat, float timestamp_ms) { imu_buffer_response_type *response = calloc(1, sizeof(imu_buffer_response_type)); if (response == NULL) { return NULL; } response->ready = false; // the oldest values are zero/unset if the buffer hasn't been filled yet, so we check prior to doing a // push/pop, to know if the values that are returned will be relevant to our calculations bool was_full = is_full(gyro_buffer->stage_1[0]); float stage_1_quat_w = push(gyro_buffer->stage_1[0], quat.w); float stage_1_quat_x = push(gyro_buffer->stage_1[1], quat.x); float stage_1_quat_y = push(gyro_buffer->stage_1[2], quat.y); float stage_1_quat_z = push(gyro_buffer->stage_1[3], quat.z); // TODO - timestamp_ms can only get as large as 2^24 before it starts to lose precision as a float, // which is less than 5 hours of usage. Update this to just send two delta times, t0-t1 and t1-t2. float stage_1_ts = push(gyro_buffer->stage_1[4], (float)timestamp_ms); if (was_full) { was_full = is_full(gyro_buffer->stage_2[0]); float stage_2_quat_w = push(gyro_buffer->stage_2[0], stage_1_quat_w); float stage_2_quat_x = push(gyro_buffer->stage_2[1], stage_1_quat_x); float stage_2_quat_y = push(gyro_buffer->stage_2[2], stage_1_quat_y); float stage_2_quat_z = push(gyro_buffer->stage_2[3], stage_1_quat_z); float stage_2_ts = push(gyro_buffer->stage_2[4], stage_1_ts); if (was_full) { response->ready = true; response->data = calloc(16, sizeof(float)); // write to shared memory for anyone using the same ipc prefix to consume response->data[0] = quat.x; response->data[1] = quat.y; response->data[2] = quat.z; response->data[3] = quat.w; response->data[4] = stage_1_quat_x; response->data[5] = stage_1_quat_y; response->data[6] = stage_1_quat_z; response->data[7] = stage_1_quat_w; response->data[8] = stage_2_quat_x; response->data[9] = stage_2_quat_y; response->data[10] = stage_2_quat_z; response->data[11] = stage_2_quat_w; response->data[12] = (float)timestamp_ms; response->data[13] = stage_1_ts; response->data[14] = stage_2_ts; } } return response; } ================================================ FILE: src/config.c ================================================ #include "config.h" #include "logging.h" #include "memory.h" #include "plugins.h" #include "strings.h" #include #include #include #include const char *joystick_output_mode = "joystick"; const char *mouse_output_mode = "mouse"; const char *external_only_output_mode = "external_only"; driver_config_type *default_config() { driver_config_type *config = calloc(1, sizeof(driver_config_type)); if (config == NULL) { log_error("Error allocating config"); exit(1); } config->disabled = true; config->mouse_mode = false; config->joystick_mode = false; config->external_mode = false; config->use_roll_axis = false; config->vr_lite_invert_x = false; config->vr_lite_invert_y = false; config->mouse_sensitivity = 30; config->output_mode = strdup(mouse_output_mode); config->multi_tap_enabled = false; config->metrics_disabled = false; config->dead_zone_threshold_deg = 0.0f; config->debug_threads = false; config->debug_joystick = false; config->debug_multi_tap = false; config->debug_ipc = false; config->debug_license = false; config->debug_device = false; config->debug_connections = false; return config; } void update_config(driver_config_type *config, driver_config_type *new_config) { free(config->output_mode); *config = *new_config; free(new_config); } void boolean_config(char* key, char *value, bool *config_value) { *config_value = equal(value, "true"); } void float_config(char* key, char *value, float *config_value) { char *endptr; errno = 0; float num = strtof(value, &endptr); if (errno != ERANGE && endptr != value) { *config_value = num; } else { log_error("Error parsing %s value: %s\n", key, value); } } void int_config(char* key, char *value, int *config_value) { char *endptr; errno = 0; long num = strtol(value, &endptr, 10); if (errno != ERANGE && endptr != value) { *config_value = (int) num; } else { log_error("Error parsing %s value: %s\n", key, value); } } void string_config(char* key, char *value, char **config_value) { free_and_clear(config_value); *config_value = strdup(value); } driver_config_type* parse_config_file(FILE *fp) { driver_config_type *config = default_config(); void *plugin_configs = plugins.default_config(); char line[1024]; while (fgets(line, sizeof(line), fp) != NULL) { char *key = strtok(line, "="); char *value = strtok(NULL, "\n"); if (equal(key, "disabled")) { boolean_config(key, value, &config->disabled); } else if (equal(key, "debug")) { char *token = strtok(value, ","); while (token != NULL) { if (equal(token, "joystick")) { config->debug_joystick = true; } if (equal(token, "taps")) { config->debug_multi_tap = true; } if (equal(token, "threads")) { config->debug_threads = true; } if (equal(token, "ipc")) { config->debug_ipc = true; } if (equal(token, "license")) { config->debug_license = true; } if (equal(token, "device")) { config->debug_device = true; } if (equal(token, "connections")) { config->debug_connections = true; } token = strtok(NULL, ","); } } else if (equal(key, "use_roll_axis")) { config->use_roll_axis = true; } else if (equal(key, "vr_lite_invert_x")) { boolean_config(key, value, &config->vr_lite_invert_x); } else if (equal(key, "vr_lite_invert_y")) { boolean_config(key, value, &config->vr_lite_invert_y); } else if (equal(key, "mouse_sensitivity")) { int_config(key, value, &config->mouse_sensitivity); } else if (equal(key, "output_mode")) { string_config(key, value, &config->output_mode); config->joystick_mode = strcmp(config->output_mode, joystick_output_mode) == 0; config->mouse_mode = strcmp(config->output_mode, mouse_output_mode) == 0; config->external_mode = strcmp(config->output_mode, external_only_output_mode) == 0; } else if (equal(key, "multi_tap_enabled")) { boolean_config(key, value, &config->multi_tap_enabled); } else if (equal(key, "metrics_disabled")) { boolean_config(key, value, &config->metrics_disabled); } else if (equal(key, "dead_zone_threshold_deg")) { float_config(key, value, &config->dead_zone_threshold_deg); } plugins.handle_config_line(plugin_configs, key, value); } plugins.set_config(plugin_configs); return config; } ================================================ FILE: src/connection_pool.c ================================================ #include "connection_pool.h" #include "logging.h" #include "runtime_context.h" #include "imu.h" #include #include #include #include static connection_pool_type* pool = NULL; static void ensure_capacity() { if (pool->count >= pool->capacity) { int newcap = pool->capacity == 0 ? 2 : pool->capacity + 1; pool->list = (connection_t**)realloc(pool->list, newcap * sizeof(connection_t*)); pool->capacity = newcap; } } static pose_handler_t pose_handler = NULL; static reference_pose_getter_t reference_pose_getter = NULL; void connection_pool_init(pose_handler_t pose_handler_callback, reference_pose_getter_t reference_pose_getter_callback) { pool = (connection_pool_type*)calloc(1, sizeof(*pool)); pthread_mutex_init(&pool->mutex, NULL); pool->primary_index = -1; pool->supplemental_index = -1; pose_handler = pose_handler_callback; reference_pose_getter = reference_pose_getter_callback; } static int pick_primary_index() { for (int i = 0; i < pool->count; ++i) { if (!pool->list[i]->device->can_be_supplemental) return i; } return pool->count > 0 ? 0 : -1; } static int pick_supplemental_index() { for (int i = 0; i < pool->count; ++i) { if (i != pool->primary_index && pool->list[i]->supplemental) return i; } return -1; } // The pool mutex must already be held when calling these helpers. static connection_t* find_hid_connection_locked(uint16_t id_vendor, int16_t id_product) { for (int i = 0; i < pool->count; ++i) { connection_t* c = pool->list[i]; if (c && c->device && c->device->hid_vendor_id == id_vendor && c->device->hid_product_id == id_product) return c; } return NULL; } static int find_driver_connection_index_locked(const char* driver_id) { for (int i = 0; i < pool->count; ++i) { connection_t* c = pool->list[i]; if (c && c->driver && c->driver->id && driver_id && strcmp(c->driver->id, driver_id) == 0) return i; } return -1; } static connection_t* find_driver_connection_locked(const char* driver_id) { int idx = find_driver_connection_index_locked(driver_id); return idx >= 0 ? pool->list[idx] : NULL; } static connection_t* primary() { if (pool->primary_index < 0 || pool->primary_index >= pool->count) return NULL; return pool->list[pool->primary_index]; } static connection_t* supplemental() { if (pool->supplemental_index < 0 || pool->supplemental_index >= pool->count) return NULL; return pool->list[pool->supplemental_index]; } static void* block_thread_func(void* arg) { connection_t* c = (connection_t*)arg; if (config()->debug_connections) log_debug("block_thread_func %s\n", c->driver->id); c->driver->block_on_device_func(); c->thread_running = false; return NULL; } static void connection_pool_start_connection_thread(connection_t* c) { if (c && !c->thread_running) { c->active = true; c->thread_running = true; pthread_create(&c->thread, NULL, block_thread_func, c); } } bool connection_pool_is_connected() { pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); bool connected = p && p->driver->is_connected_func(); pthread_mutex_unlock(&pool->mutex); return connected; } bool connection_pool_device_is_sbs_mode() { pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); bool enabled = p && p->driver->device_is_sbs_mode_func(); pthread_mutex_unlock(&pool->mutex); return enabled; } bool connection_pool_device_set_sbs_mode(bool enabled) { pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); bool ok = p && p->driver->device_set_sbs_mode_func(enabled); pthread_mutex_unlock(&pool->mutex); return ok; } void connection_pool_disconnect_all(bool soft) { if (config()->debug_connections) log_debug("connection_pool_disconnect_all %s\n", soft ? "soft" : "hard"); pthread_mutex_lock(&pool->mutex); for (int i = 0; i < pool->count; ++i) { connection_t* c = pool->list[i]; if (c) c->driver->disconnect_func(soft); c->active = false; } pthread_mutex_unlock(&pool->mutex); } bool connection_pool_connect_active() { if (config()->debug_connections) log_debug("connection_pool_connect_active\n"); pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); connection_t* s = supplemental(); pthread_mutex_unlock(&pool->mutex); bool pr_ok = false; if (p) pr_ok = p->driver->device_connect_func(); if (pr_ok && s) (void)s->driver->device_connect_func(); return pr_ok; } void connection_pool_block_on_active() { if (config()->debug_connections) log_debug("connection_pool_block_on_active\n"); pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); connection_pool_start_connection_thread(p); connection_t* s = supplemental(); if (s && s->driver->is_connected_func()) connection_pool_start_connection_thread(s); pthread_mutex_unlock(&pool->mutex); // Join the primary thread; when it exits, we stop. Supplemental will be joined afterwards. if (p && p->thread_running) pthread_join(p->thread, NULL); pthread_mutex_lock(&pool->mutex); if (s && s->thread_running) { s->driver->disconnect_func(true); pthread_mutex_unlock(&pool->mutex); pthread_join(s->thread, NULL); pthread_mutex_lock(&pool->mutex); s->thread_running = false; s->active = false; } if (p) { p->thread_running = false; p->active = false; } pthread_mutex_unlock(&pool->mutex); } device_properties_type* connection_pool_primary_device() { pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); device_properties_type* d = p ? p->device : NULL; pthread_mutex_unlock(&pool->mutex); return d; } device_properties_type* connection_pool_supplemental_device() { pthread_mutex_lock(&pool->mutex); connection_t* s = supplemental(); device_properties_type* d = s ? s->device : NULL; pthread_mutex_unlock(&pool->mutex); return d; } const device_driver_type* connection_pool_primary_driver() { pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); const device_driver_type* d = p ? p->driver : NULL; pthread_mutex_unlock(&pool->mutex); return d; } static bool supplemental_position_ready = false; static imu_pose_type last_supplemental_pose = {0}; void connection_pool_handle_device_added(const device_driver_type* driver, device_properties_type* device) { if (config()->debug_connections) log_debug("connection_pool_handle_device_added for driver %s, has_orientation %s, has_position %s\n", driver->id, device->provides_orientation ? "true" : "false", device->provides_position ? "true" : "false"); pthread_mutex_lock(&pool->mutex); if (device && find_hid_connection_locked(device->hid_vendor_id, device->hid_product_id)) { if (config()->debug_connections) { log_debug( "connection_pool_handle_device_added: ignoring duplicate HID device for driver %s (0x%04x:0x%04x)\n", driver ? driver->id : "(null)", (unsigned int)device->hid_vendor_id, (unsigned int)device->hid_product_id); } free(device); pthread_mutex_unlock(&pool->mutex); return; } ensure_capacity(pool); connection_t* c = (connection_t*)calloc(1, sizeof(*c)); c->driver = driver; c->device = device; c->supplemental = device->can_be_supplemental; c->active = false; pool->list[pool->count++] = c; // If no primary selected yet, pick one if (pool->primary_index == -1) { pool->primary_index = pick_primary_index(pool); if (config()->debug_connections) log_debug("connection_pool_handle_device_added picked primary %d\n", pool->primary_index); } // If possible, choose a supplemental distinct from primary if (pool->supplemental_index == -1) { pool->supplemental_index = pick_supplemental_index(pool); if (config()->debug_connections) log_debug("connection_pool_handle_device_added picked supplemental %d\n", pool->supplemental_index); connection_t* p = primary(); connection_t* s = supplemental(); if (p && s) { last_supplemental_pose = (imu_pose_type){0}; bool blocked_on_active = p->active && p->thread_running; if (blocked_on_active) { // supplemental added and primary already connected and blocking. // start supplemental connection thread now. bool connected = s && s->driver->is_connected_func(); if (!connected && s) connected = s->driver->device_connect_func(); if (connected) connection_pool_start_connection_thread(s); } } } pthread_mutex_unlock(&pool->mutex); } void connection_pool_handle_device_removed(const char* driver_id) { if (config()->debug_connections) log_debug("connection_pool_handle_device_removed for driver %s\n", driver_id); pthread_mutex_lock(&pool->mutex); connection_t* p = primary(); bool blocked_on_active = p && p->active && p->thread_running; bool primary_removed = false; bool supplemental_removed = pool->supplemental_index == -1; int remove_index = find_driver_connection_index_locked(driver_id); if (remove_index >= 0) { connection_t* c = pool->list[remove_index]; // Request a hard disconnect; the driver threads will exit on their own. c->driver->disconnect_func(false); primary_removed = remove_index == pool->primary_index; supplemental_removed |= remove_index == pool->supplemental_index; if (primary_removed) { // we'll be reevaluating selections below, so soft disconnect supplemental connection_t* s = supplemental(); if (s) s->driver->disconnect_func(true); } } if (primary_removed || supplemental_removed) { supplemental_position_ready = false; last_supplemental_pose = (imu_pose_type){0}; } if (remove_index >= 0) { connection_t* c = pool->list[remove_index]; free(c); // Remove from array and free the connection wrapper (device is managed externally) for (int j = remove_index + 1; j < pool->count; ++j) pool->list[j - 1] = pool->list[j]; pool->count--; // Re-evaluate selections pool->primary_index = pick_primary_index(pool); if (config()->debug_connections) log_debug("connection_pool_handle_device_removed picked primary %d\n", pool->primary_index); pool->supplemental_index = pick_supplemental_index(pool); bool supplemental_changed = supplemental_removed && pool->supplemental_index != -1; if (blocked_on_active && !primary_removed && supplemental_changed) { connection_t* s = supplemental(); bool connected = s && s->driver->is_connected_func(); if (!connected && s) connected = s->driver->device_connect_func(); if (connected) connection_pool_start_connection_thread(s); } if (config()->debug_connections) log_debug("connection_pool_handle_device_removed picked supplemental %d\n", pool->supplemental_index); } pthread_mutex_unlock(&pool->mutex); } void connection_pool_ingest_pose(const char* driver_id, imu_pose_type pose) { connection_t* s = supplemental(); if (s) { bool pose_from_supplemental = strcmp(s->driver->id, driver_id) == 0; if (pose_from_supplemental) { // don't forward supplemental poses directly, // store the latest one to be forwarded with the next primary pose if (pose.has_position) { static imu_quat_type reference_supplemental_orientation_conj = {0, 0, 0, 1}; // reorient supplemental position into primary reference frame imu_pose_type reference_pose = {0}; bool reference_pose_updated = false; supplemental_position_ready = reference_pose_getter(&reference_pose, &reference_pose_updated); // when we receive a new reference pose, also capture the supplemental orientation // so we can properly adjust the reference frame if (pose.has_orientation && reference_pose_updated) reference_supplemental_orientation_conj = conjugate(pose.orientation); if (supplemental_position_ready) { if (pose.has_orientation) { reference_pose.orientation = multiply_quaternions(reference_supplemental_orientation_conj, reference_pose.orientation); } pose.position = vector_rotate(pose.position, reference_pose.orientation); } } last_supplemental_pose = pose; return; } } // use the data from the supplemental pose to fill in any gaps in the primary pose if (!pose.has_orientation && s && last_supplemental_pose.has_orientation) { pose.orientation = last_supplemental_pose.orientation; pose.has_orientation = true; } if (!pose.has_position && s && last_supplemental_pose.has_position && supplemental_position_ready) { pose.position = last_supplemental_pose.position; pose.has_position = true; } pose_handler(pose); } connection_t* connection_pool_find_hid_connection(uint16_t id_vendor, int16_t id_product) { if (config()->debug_connections) log_debug("connection_pool_find_hid_connection for vendor %d product %d\n", id_vendor, id_product); pthread_mutex_lock(&pool->mutex); connection_t* c = find_hid_connection_locked(id_vendor, id_product); pthread_mutex_unlock(&pool->mutex); return c; } connection_t* connection_pool_find_driver_connection(const char* driver_id) { if (config()->debug_connections) log_debug("connection_pool_find_driver_connection for driver %s\n", driver_id); pthread_mutex_lock(&pool->mutex); connection_t* c = find_driver_connection_locked(driver_id); pthread_mutex_unlock(&pool->mutex); return c; } ================================================ FILE: src/curl.c ================================================ #include #include static pthread_mutex_t curl_lock = PTHREAD_MUTEX_INITIALIZER; static int ref_count = 0; void curl_init() { pthread_mutex_lock(&curl_lock); if(ref_count == 0) { curl_global_init(CURL_GLOBAL_DEFAULT); } ref_count++; pthread_mutex_unlock(&curl_lock); } void curl_cleanup() { pthread_mutex_lock(&curl_lock); ref_count--; if(ref_count == 0) { curl_global_cleanup(); } pthread_mutex_unlock(&curl_lock); } ================================================ FILE: src/devices/rayneo.c ================================================ #include "devices.h" #include "devices/rayneo.h" #include "connection_pool.h" #include "driver.h" #include "imu.h" #include "logging.h" #include "memory.h" #include "outputs.h" #include "runtime_context.h" #include "sdks/rayneo.h" #include "strings.h" #include #include #include #include #include #include #include #include #define TS_TO_MS_FACTOR 1000000 #define EXPECTED_CYCLES_PER_S 500 #define FORCED_CYCLES_PER_S 250 // let's force 250Hz cycle time so we're doing fewer computations #define CYCLE_TIME_CHECK_ERROR_FACTOR 0.95 // cycle times won't be exact, check within a 5% margin #define FORCED_CYCLE_TIME_MS 1000.0 / FORCED_CYCLES_PER_S * CYCLE_TIME_CHECK_ERROR_FACTOR #define BUFFER_SIZE_TARGET_MS 10 // smooth IMU data over this period of time #define RAYNEO_ID_VENDOR 0x1bbb #define RAYNEO_ID_PRODUCT 0xaf50 #define STATE_EVENT_DEVICE_INFO 0x4000 #define RAYNEO_DRIVER_ID "rayneo" // RayNeo SDK is returning rotations relative to an east-up-south coordinate system, // this converts to to north-west-up, and applies a 15-degree offset based on factory device calibration static const imu_quat_type adjustment_quat = { .w = 0.561, .x = -0.430, .y = 0.430, .z = 0.561 }; const device_properties_type rayneo_properties = { .brand = "", .model = "", .hid_vendor_id = RAYNEO_ID_VENDOR, .hid_product_id = RAYNEO_ID_PRODUCT, .calibration_setup = CALIBRATION_SETUP_AUTOMATIC, .resolution_w = RESOLUTION_1080P_W, .resolution_h = RESOLUTION_1080P_H, .fov = 43.0, .lens_distance_ratio = 0.05, .calibration_wait_s = 5, .imu_cycles_per_s = FORCED_CYCLES_PER_S, .imu_buffer_size = ceil(BUFFER_SIZE_TARGET_MS / FORCED_CYCLE_TIME_MS), .look_ahead_constant = 15.0, .look_ahead_frametime_multiplier = 0.45, .look_ahead_scanline_adjust = 12.0, .look_ahead_ms_cap = 40.0, .sbs_mode_supported = true, .firmware_update_recommended = false, .provides_orientation = true, .provides_position = false }; static uint32_t last_utilized_event_ts = 0; // hardware connection - device is physically plugged in static bool hard_connected = false; // software connection - we're actively in communication, holding open a connection static bool soft_connected = false; static bool is_sbs_mode = false; void rayneo_imu_callback(const float acc[3], const float gyro[3], const float mag[3], uint64_t timestamp){ if (!soft_connected || driver_disabled()) return; uint32_t ts = (uint32_t) (timestamp / TS_TO_MS_FACTOR); uint32_t elapsed_from_last_utilized = ts - last_utilized_event_ts; if (elapsed_from_last_utilized > FORCED_CYCLE_TIME_MS) { float rotation[4]; float position[3]; uint64_t time; GetHeadTrackerPose(rotation, position, &time); imu_quat_type imu_quat = { .w = rotation[3], .x = rotation[0], .y = rotation[1], .z = rotation[2] }; imu_quat_type nwu_quat = multiply_quaternions(imu_quat, adjustment_quat); imu_pose_type pose = (imu_pose_type){0}; pose.orientation = nwu_quat; pose.has_orientation = true; pose.timestamp_ms = ts; connection_pool_ingest_pose(RAYNEO_DRIVER_ID, pose); last_utilized_event_ts = ts; } } static pthread_mutex_t device_name_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t device_name_cond = PTHREAD_COND_INITIALIZER; static char* device_brand = NULL; static char* device_model = NULL; static void rayneo_mcu_callback(uint32_t state, uint64_t timestamp, size_t length, const void* data) { uint32_t ts = (uint32_t) (timestamp / TS_TO_MS_FACTOR); if (!soft_connected) return; if (state == STATE_EVENT_DEVICE_INFO) { pthread_mutex_lock(&device_name_mutex); if (device_brand == NULL && device_model == NULL) { char device_type[64]; GetDeviceType(device_type); if (config()->debug_device) log_debug("RayNeo driver, received device type: %s\n", device_type); bool device_found = false; if (strlen(device_type) > 0) { char device_type_copy[64]; strncpy(device_type_copy, device_type, sizeof(device_type_copy) - 1); device_type_copy[sizeof(device_type_copy) - 1] = '\0'; char* brand_part = strtok(device_type_copy, " "); char* model_part = strtok(NULL, " "); if (brand_part && model_part && strlen(brand_part) > 0 && strlen(model_part) > 0) { device_brand = strdup(brand_part); char* version_part = strtok(NULL, " "); if (version_part && strlen(version_part) > 0) { device_model = malloc(strlen(model_part) + strlen(version_part) + 2); if (device_model) { sprintf(device_model, "%s %s", model_part, version_part); device_found = true; } } else { device_model = strdup(model_part); device_found = true; } } } if (device_found) pthread_cond_signal(&device_name_cond); } pthread_mutex_unlock(&device_name_mutex); is_sbs_mode = GetSideBySideStatus() == 1; } } static pthread_mutex_t device_connection_mutex = PTHREAD_MUTEX_INITIALIZER; bool rayneo_device_connect() { pthread_mutex_lock(&device_connection_mutex); if (!soft_connected) { if (!hard_connected) { RegisterIMUEventCallback(rayneo_imu_callback); RegisterStateEventCallback(rayneo_mcu_callback); if (EstablishUsbConnection(RAYNEO_ID_VENDOR, RAYNEO_ID_PRODUCT) == 0) { NotifyDeviceConnected(); hard_connected = true; } } if (hard_connected) { StartXR(); OpenIMU(); soft_connected = true; // this will trigger the STATE_EVENT_DEVICE_INFO event AcquireDeviceInfo(); } else { log_message("RayNeo driver, failed to establish a connection\n"); } } pthread_mutex_unlock(&device_connection_mutex); return soft_connected; }; void rayneo_device_disconnect(bool soft, bool is_device_present) { pthread_mutex_lock(&device_connection_mutex); if (soft_connected) { CloseIMU(); StopXR(); soft_connected = false; } bool retain_hard_connection = soft && is_device_present; if (hard_connected && !retain_hard_connection) { NotifyDeviceDisconnected(); ResetUsbConnection(); UnregisterIMUEventCallback(rayneo_imu_callback); UnregisterStateEventCallback(rayneo_mcu_callback); free_and_clear(&device_brand); free_and_clear(&device_model); hard_connected = false; } pthread_mutex_unlock(&device_connection_mutex); }; device_properties_type* rayneo_supported_device(uint16_t vendor_id, uint16_t product_id, uint8_t usb_bus, uint8_t usb_address) { if (vendor_id == RAYNEO_ID_VENDOR && product_id == RAYNEO_ID_PRODUCT) { device_properties_type* device = calloc(1, sizeof(device_properties_type)); *device = rayneo_properties; // trying to connect to the device too quickly seems to cause irrecoverable connection issues sleep(2); // device_connect is actually out-of-turn here, the driver would normally call connect after we return the device // properties, but we kick this off now so we can acquire the device name, which unfortunately comes from the SDK // only after establishing a connection. if (rayneo_device_connect()) { pthread_mutex_lock(&device_name_mutex); while (device_brand == NULL && device_model == NULL) { pthread_cond_wait(&device_name_cond, &device_name_mutex); } pthread_mutex_unlock(&device_name_mutex); device->brand = device_brand; device->model = device_model; // Leave the connection open if we think it'll be used, but if the driver is disabled, disconnect now if (driver_disabled()) rayneo_device_disconnect(true, true); return device; } } return NULL; }; void rayneo_block_on_device() { device_properties_type* device = device_checkout(); bool imu_started = false; if (soft_connected && device != NULL) imu_started = wait_for_imu_start(); while (soft_connected && device != NULL && imu_started && is_imu_alive()) { sleep(1); } rayneo_device_disconnect(true, device != NULL); device_checkin(device); }; bool rayneo_device_is_sbs_mode() { return is_sbs_mode; }; bool rayneo_device_set_sbs_mode(bool enabled) { // don't explicitly change the is_sbs_mode value here, wait for it to come back around from the MCU deviceinfo response if (enabled) { SwitchTo3D(); } else { SwitchTo2D(); } return true; }; bool rayneo_is_connected() { return soft_connected; }; void rayneo_disconnect(bool soft) { rayneo_device_disconnect(soft, device_present()); }; const device_driver_type rayneo_driver = { .id = RAYNEO_DRIVER_ID, .supported_device_func = rayneo_supported_device, .device_connect_func = rayneo_device_connect, .block_on_device_func = rayneo_block_on_device, .device_is_sbs_mode_func = rayneo_device_is_sbs_mode, .device_set_sbs_mode_func = rayneo_device_set_sbs_mode, .is_connected_func = rayneo_is_connected, .disconnect_func = rayneo_disconnect }; ================================================ FILE: src/devices/rokid.c ================================================ #include "devices.h" #include "driver.h" #include "connection_pool.h" #include "imu.h" #include "logging.h" #include "outputs.h" #include "runtime_context.h" #include "sdks/rokid.h" #include "strings.h" #include #include #include #include #include #include #include #include #define TS_TO_MS_FACTOR 1000000 #define ROKID_ID_PRODUCT_COUNT 7 const int rokid_supported_id_product[ROKID_ID_PRODUCT_COUNT] = { 0x162B, 0x162C, 0x162D, 0x162E, 0x162F, 0x2002, 0x2180 }; #define RESOLUTION_2D_3840_1080_60HZ 0 #define RESOLUTION_3D_3840_1080_60HZ 1 #define RESOLUTION_3D_3840_1200_90HZ 4 #define RESOLUTION_3D_3840_1200_60HZ 5 #define ROKID_DRIVER_ID "rokid" // Rokid SDK is returning rotations relative to an east-up-south coordinate system, // this converts to to north-west-up, and applies a 5-degree offset based on factory device calibration static const imu_quat_type adjustment_quat = { .w = 0.521, .x = -0.478, .y = 0.478, .z = 0.521 }; const device_properties_type rokid_one_properties = { .brand = "", // replaced by the supported_device() function .model = "", // replaced by the supported_device() function .hid_vendor_id = ROKID_GLASS_VID, .hid_product_id = -1, // replaced by the supported_device() function .calibration_setup = CALIBRATION_SETUP_AUTOMATIC, .resolution_w = RESOLUTION_1080P_W, .resolution_h = RESOLUTION_1080P_H, .fov = 45, .lens_distance_ratio = 0.03125, .calibration_wait_s = 1, .imu_cycles_per_s = 90, .imu_buffer_size = 1, .look_ahead_constant = 20.0, .look_ahead_frametime_multiplier = 0.6, .look_ahead_scanline_adjust = 8.0, .look_ahead_ms_cap = 40.0, .sbs_mode_supported = true, .firmware_update_recommended = false, .provides_orientation = true, .provides_position = false }; static void* event_instance = NULL; static void* event_handle = NULL; static void* control_instance = NULL; static bool sbs_mode_enabled = false; // hardware connection - device is physically plugged in static bool hard_connected = false; // software connection - we're actively in communication, holding open a connection static bool soft_connected = false; static void cleanup() { if (event_instance && event_handle) { GlassUnRegisterEvent(event_instance, event_handle); event_handle = NULL; } if (!hard_connected) { if (event_instance) { GlassEventClose(event_instance); event_instance = NULL; } if (control_instance) { GlassControlClose(control_instance); control_instance = NULL; } } } void rokid_disconnect(bool soft) { soft_connected = false; hard_connected = soft; } static void handle_display_mode(device_properties_type* device, int display_mode) { sbs_mode_enabled = display_mode != RESOLUTION_2D_3840_1080_60HZ; if (sbs_mode_enabled) { if (display_mode != RESOLUTION_3D_3840_1080_60HZ) { device->resolution_h = RESOLUTION_1200P_H; } else { device->resolution_h = RESOLUTION_1080P_H; } } } static bool device_connect(device_properties_type* device) { hard_connected = true; if (!event_instance) event_instance = GlassEventInit(); if (!event_instance) { log_error("Failed to initialize event instance\n"); } else { if (!control_instance) control_instance = GlassControlInit(); if (!control_instance) { log_error("Failed to initialize control instance\n"); } else { soft_connected = GlassEventOpen(event_instance, device->hid_vendor_id, device->hid_product_id) && GlassControlOpen(control_instance, device->hid_vendor_id, device->hid_product_id); if (soft_connected) { event_handle = GlassRegisterEventWithSize(event_instance, GAME_ROTATION_EVENT, 50); if (!event_handle) { log_error("Failed to register event handle\n"); soft_connected = false; } else { GlassAddFusionEvent(event_instance, true); handle_display_mode(device, GetDisplayMode(control_instance)); } } } } if (!soft_connected) { cleanup(); } return soft_connected; } // this will already be connected if the driver is enabled bool rokid_device_connect() { device_properties_type* device = device_checkout(); if (device != NULL) device_connect(device); device_checkin(device); return soft_connected; } device_properties_type* rokid_supported_device(uint16_t vendor_id, uint16_t product_id, uint8_t usb_bus, uint8_t usb_address) { if (vendor_id == ROKID_GLASS_VID) { for (int i=0; i < ROKID_ID_PRODUCT_COUNT; i++) { if (product_id == rokid_supported_id_product[i]) { device_properties_type* device = calloc(1, sizeof(device_properties_type)); *device = rokid_one_properties; device->hid_vendor_id = vendor_id; device->hid_product_id = product_id; device->usb_bus = usb_bus; device->usb_address = usb_address; sleep(1); if (device_connect(device)) { // split GetProductName result on the first space to separate brand and model char* product_name = GetProductName(control_instance); char* space = strchr(product_name, ' '); char* version_start = strchr(product_name, '('); if (space) { *space = '\0'; if (version_start) { *version_start = '\0'; } device->model = strdup(space + 1); } device->brand = strdup(product_name); if (driver_disabled()) rokid_disconnect(true); return device; } } } } return NULL; }; static int imu_counter = 0; void rokid_block_on_device() { device_properties_type* device = device_checkout(); if (device != NULL) { struct EventData ed; while (soft_connected) { if (GlassWaitEvent(event_instance, event_handle, &ed, 1000)) { struct SensorData sd = ed.acc; uint32_t timestamp = (uint32_t) (sd.sensor_timestamp_ns / TS_TO_MS_FACTOR); struct RotationData rd = ed.rotation; imu_quat_type imu_quat = { .w = rd.Q[3], .x = rd.Q[0], .y = rd.Q[1], .z = rd.Q[2] }; imu_quat_type nwu_quat = multiply_quaternions(imu_quat, adjustment_quat); if (++imu_counter % device->imu_cycles_per_s == 0) { imu_counter = 0; // do this every second in the same thread as GlassWaitEvent, it seemed like the // USB interactions between the two calls may not be thread safe handle_display_mode(device, GetDisplayMode(control_instance)); } imu_pose_type pose = (imu_pose_type){0}; pose.orientation = nwu_quat; pose.has_orientation = true; pose.timestamp_ms = timestamp; connection_pool_ingest_pose(ROKID_DRIVER_ID, pose); } } cleanup(); } device_checkin(device); }; bool rokid_device_is_sbs_mode() { return sbs_mode_enabled; }; bool rokid_device_set_sbs_mode(bool enabled) { // 3D mode offers 1080p and 1200p options, might as well go with the higher resolution sbs_mode_enabled = GlassSetDisplayMode( control_instance, enabled ? RESOLUTION_3D_3840_1200_60HZ : RESOLUTION_2D_3840_1080_60HZ); return sbs_mode_enabled; }; bool rokid_is_connected() { return soft_connected; }; const device_driver_type rokid_driver = { .id = ROKID_DRIVER_ID, .supported_device_func = rokid_supported_device, .device_connect_func = rokid_device_connect, .block_on_device_func = rokid_block_on_device, .device_is_sbs_mode_func = rokid_device_is_sbs_mode, .device_set_sbs_mode_func = rokid_device_set_sbs_mode, .is_connected_func = rokid_is_connected, .disconnect_func = rokid_disconnect }; ================================================ FILE: src/devices/viture.c ================================================ #include "connection_pool.h" #include "devices.h" #include "devices/viture.h" #include "driver.h" #include "epoch.h" #include "imu.h" #include "logging.h" #include "memory.h" #include "outputs.h" #include "runtime_context.h" #include "sdks/viture_device.h" #include "sdks/viture_device_carina.h" #include "sdks/viture_glasses_provider.h" #include "strings.h" #include #include #include #include #include #include #include #include #define VITURE_ID_PRODUCT_COUNT 14 #define VITURE_ID_VENDOR 0x35ca #define VITURE_DRIVER_ID "viture" #define VITURE_ONE_MODEL_NAME "One" #define VITURE_ONE_LITE_MODEL_NAME "One Lite" #define VITURE_PRO_MODEL_NAME "Pro" #define VITURE_LUMA_MODEL_NAME "Luma" #define VITURE_LUMA_PRO_MODEL_NAME "Luma Pro" #define VITURE_LUMA_ULTRA_MODEL_NAME "Luma Ultra" #define VITURE_LUMA_CYBER_MODEL_NAME "Luma Cyber" #define VITURE_BEAST_MODEL_NAME "Beast" #define VITURE_DISPLAY_MODE_1920_1080_60HZ 0x31 #define VITURE_DISPLAY_MODE_3840_1080_60HZ 0x32 #define VITURE_DISPLAY_MODE_3840_1080_90HZ 0x35 #define VITURE_DISPLAY_MODE_1920_1200_60HZ 0x41 #define VITURE_DISPLAY_MODE_3840_1200_60HZ 0x42 #define VITURE_DISPLAY_MODE_3840_1200_90HZ 0x45 #define VITURE_IMU_MODE_RAW 0 #define VITURE_IMU_MODE_POSE 1 #define VITURE_IMU_FREQ_LOW 0 #define VITURE_IMU_FREQ_MEDIUM_LOW 1 #define VITURE_IMU_FREQ_MEDIUM 2 #define VITURE_IMU_FREQ_MEDIUM_HIGH 3 #define VITURE_IMU_FREQ_HIGH 4 #define VITURE_IMU_FREQ_COUNT 5 #define VITURE_CARINA_CYCLES_PER_S 1000 #define VITURE_CARINA_POLL_INTERVAL_US (1000000 / VITURE_CARINA_CYCLES_PER_S) #define VITURE_FLOAT_EXACT_MS_LIMIT 16777216.0 // 2^24, largest consecutive int in float #define VITURE_FLOAT_RESET_MARGIN_MS 1000.0 // avoid running right at the precision edge #define VITURE_LOG_LEVEL_NONE 0 #define VITURE_LOG_LEVEL_ERROR 1 #define VITURE_LOG_LEVEL_INFO 2 #define VITURE_LOG_LEVEL_DEBUG 3 #define VITURE_STATE_ID_BRIGHTNESS 0 #define VITURE_STATE_ID_VOLUME 1 #define VITURE_STATE_ID_DISPLAY_MODE 2 #define VITURE_STATE_ID_ELECTROCHROMIC_FILM 3 static const float VITURE_ONE_PITCH_ADJUSTMENT = 6.0; static const float VITURE_PRO_PITCH_ADJUSTMENT = 3.0; static const float VITURE_LUMA_PITCH_ADJUSTMENT = -8.5; static const float VITURE_BEAST_PITCH_ADJUSTMENT = -8.5; // Placeholder until specs finalized static const float VITURE_ONE_FOV = 40.0; static const float VITURE_PRO_FOV = 43.0; static const float VITURE_LUMA_FOV = 50.0; static const float VITURE_LUMA_PRO_FOV = 52.0; static const float VITURE_LUMA_ULTRA_FOV = 52.0; static const float VITURE_LUMA_CYBER_FOV = 52.0; static const float VITURE_BEAST_FOV = 58.0; static const int viture_supported_id_product[VITURE_ID_PRODUCT_COUNT] = { 0x1011, // One 0x1013, // One 0x1017, // One 0x1015, // One Lite 0x101b, // One Lite 0x1019, // Pro 0x101d, // Pro 0x1131, // Luma 0x1121, // Luma Pro 0x1141, // Luma Pro 0x1101, // Luma Ultra 0x1104, // Luma Ultra 0x1151, // Luma Cyber 0x1201 // Viture Beast }; static const char* viture_supported_models[VITURE_ID_PRODUCT_COUNT] = { VITURE_ONE_MODEL_NAME, VITURE_ONE_MODEL_NAME, VITURE_ONE_MODEL_NAME, VITURE_ONE_LITE_MODEL_NAME, VITURE_ONE_LITE_MODEL_NAME, VITURE_PRO_MODEL_NAME, VITURE_PRO_MODEL_NAME, VITURE_LUMA_MODEL_NAME, VITURE_LUMA_PRO_MODEL_NAME, VITURE_LUMA_PRO_MODEL_NAME, VITURE_LUMA_ULTRA_MODEL_NAME, VITURE_LUMA_ULTRA_MODEL_NAME, VITURE_LUMA_CYBER_MODEL_NAME, VITURE_BEAST_MODEL_NAME }; static const float* viture_pitch_adjustments[VITURE_ID_PRODUCT_COUNT] = { &VITURE_ONE_PITCH_ADJUSTMENT, // One &VITURE_ONE_PITCH_ADJUSTMENT, // One &VITURE_ONE_PITCH_ADJUSTMENT, // One &VITURE_ONE_PITCH_ADJUSTMENT, // One Lite &VITURE_ONE_PITCH_ADJUSTMENT, // One Lite &VITURE_PRO_PITCH_ADJUSTMENT, // Pro &VITURE_PRO_PITCH_ADJUSTMENT, // Pro &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma Pro &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma Pro &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma Ultra &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma Ultra &VITURE_LUMA_PITCH_ADJUSTMENT, // Luma Cyber &VITURE_BEAST_PITCH_ADJUSTMENT // Beast }; static const float* viture_fovs[VITURE_ID_PRODUCT_COUNT] = { &VITURE_ONE_FOV, // One &VITURE_ONE_FOV, // One &VITURE_ONE_FOV, // One &VITURE_ONE_FOV, // One Lite &VITURE_ONE_FOV, // One Lite &VITURE_PRO_FOV, // Pro &VITURE_PRO_FOV, // Pro &VITURE_LUMA_FOV, // Luma &VITURE_LUMA_PRO_FOV, // Luma Pro &VITURE_LUMA_PRO_FOV, // Luma Pro &VITURE_LUMA_ULTRA_FOV, // Luma Ultra &VITURE_LUMA_ULTRA_FOV, // Luma Ultra &VITURE_LUMA_CYBER_FOV, // Luma Cyber &VITURE_BEAST_FOV // Beast }; static const int viture_resolution_heights[VITURE_ID_PRODUCT_COUNT] = { RESOLUTION_1080P_H, // One RESOLUTION_1080P_H, // One RESOLUTION_1080P_H, // One RESOLUTION_1080P_H, // One Lite RESOLUTION_1080P_H, // One Lite RESOLUTION_1080P_H, // Pro RESOLUTION_1080P_H, // Pro RESOLUTION_1200P_H, // Luma RESOLUTION_1200P_H, // Luma Pro RESOLUTION_1200P_H, // Luma Pro RESOLUTION_1200P_H, // Luma Ultra RESOLUTION_1200P_H, // Luma Ultra RESOLUTION_1200P_H, // Luma Cyber RESOLUTION_1200P_H // Beast }; static const int viture_calibration_wait_s[VITURE_ID_PRODUCT_COUNT] = { 1, // One 1, // One 1, // One 1, // One Lite 1, // One Lite 1, // Pro 1, // Pro 1, // Luma 5, // Luma Pro 5, // Luma Pro 10, // Luma Ultra 10, // Luma Ultra 5, // Luma Cyber (TBD) 1 // Beast (TBD) }; static const int viture_look_ahead_constant[VITURE_ID_PRODUCT_COUNT] = { 20, // One 20, // One 20, // One 20, // One Lite 20, // One Lite 20, // Pro 20, // Pro 20, // Luma 20, // Luma Pro 20, // Luma Pro 10, // Luma Ultra 10, // Luma Ultra 10, // Luma Cyber (TBD) 10 // Beast (TBD) }; static imu_quat_type adjustment_quat; static XRDeviceProviderHandle viture_provider = NULL; static XRDeviceType viture_device_type = XR_DEVICE_TYPE_VITURE_GEN1; static uint16_t viture_last_product_id = 0; static pthread_mutex_t viture_connection_mutex = PTHREAD_MUTEX_INITIALIZER; static bool connected = false; static bool initialized = false; static bool viture_state_callback_registered = false; static bool viture_imu_open = false; static uint8_t viture_requested_frequency = VITURE_IMU_FREQ_MEDIUM_HIGH; static bool sbs_mode_enabled = false; static int viture_saved_display_mode = -1; static int viture_saved_dof = -1; static int viture_callback_logs_remaining = 10; static const int viture_frequency_hz[VITURE_IMU_FREQ_COUNT] = {60, 90, 120, 240, 500}; static const char* viture_open_imu_error_reason(int code) { switch (code) { case -1: return "param error"; case -2: return "USB execution error"; case -3: return "device type not supported"; case -4: return "other error"; default: return "unknown"; } } static const device_properties_type viture_properties = { .brand = "VITURE", .model = NULL, .hid_vendor_id = 0x35ca, .hid_product_id = 0x1011, .calibration_setup = CALIBRATION_SETUP_AUTOMATIC, .resolution_w = RESOLUTION_1080P_W, .resolution_h = RESOLUTION_1080P_H, .fov = VITURE_ONE_FOV, .lens_distance_ratio = 0.05, .calibration_wait_s = 1, .imu_cycles_per_s = 60, .imu_buffer_size = 1, .look_ahead_constant = 20.0, .look_ahead_frametime_multiplier = 0.6, .look_ahead_scanline_adjust = 10.0, .look_ahead_ms_cap = 40.0, .sbs_mode_supported = true, .firmware_update_recommended = false, .provides_orientation = true, .provides_position = false }; static bool viture_display_mode_is_sbs(int mode) { switch (mode) { case VITURE_DISPLAY_MODE_3840_1080_60HZ: case VITURE_DISPLAY_MODE_3840_1080_90HZ: case VITURE_DISPLAY_MODE_3840_1200_60HZ: case VITURE_DISPLAY_MODE_3840_1200_90HZ: return true; default: return false; } } static void viture_refresh_sbs_state_locked() { if (viture_provider == NULL) return; int mode = xr_device_provider_get_display_mode(viture_provider); if (mode >= 0) { sbs_mode_enabled = viture_display_mode_is_sbs(mode); if (config()->debug_device) { log_debug("VITURE: Refreshed SBS state, mode=%d enabled=%d\n", mode, sbs_mode_enabled); } } } // TODO - for eventual Beast integration static void viture_capture_and_override_display_mode_locked() { viture_saved_display_mode = -1; viture_saved_dof = -1; if (viture_provider == NULL) { if (config()->debug_device) { log_debug("VITURE: Cannot override display mode, provider NULL\n"); } return; } int mode = 0; int dof = 0; if (xr_device_provider_get_display_mode_and_native_dof(viture_provider, &mode, &dof) != 0) { if (config()->debug_device) { log_debug("VITURE: Unable to read display mode/dof during override\n"); } return; } viture_saved_display_mode = mode; viture_saved_dof = dof; if (xr_device_provider_set_display_mode_and_native_dof(viture_provider, mode, 0) == 0) { sbs_mode_enabled = viture_display_mode_is_sbs(mode); if (config()->debug_device) { log_debug("VITURE: Forced display mode=%d to 0DoF\n", mode); } } else if (config()->debug_device) { log_debug("VITURE: Failed to force 0DoF (mode=%d, dof=%d)\n", mode, dof); } } // TODO - for eventual Beast integration static void viture_restore_display_mode_locked() { if (viture_provider == NULL) { viture_saved_display_mode = -1; viture_saved_dof = -1; if (config()->debug_device) { log_debug("VITURE: Cannot restore display mode, provider NULL\n"); } return; } if (viture_saved_display_mode < 0 || viture_saved_dof < 0) { if (config()->debug_device) { log_debug("VITURE: No saved display state to restore\n"); } return; } int restore_mode = viture_saved_display_mode; int restore_dof = viture_saved_dof; int result = xr_device_provider_set_display_mode_and_native_dof( viture_provider, restore_mode, restore_dof); if (result == 0) { sbs_mode_enabled = viture_display_mode_is_sbs(restore_mode); if (config()->debug_device) { log_debug("VITURE: Restored display mode=%d dof=%d\n", restore_mode, restore_dof); } } else if (config()->debug_device) { log_debug("VITURE: Failed to restore display mode=%d dof=%d (err=%d)\n", restore_mode, restore_dof, result); } viture_saved_display_mode = -1; viture_saved_dof = -1; } static void viture_publish_pose(imu_quat_type orientation, bool has_position, imu_vec3_type position, uint32_t timestamp_ms) { if (driver_disabled()) return; orientation = multiply_quaternions(orientation, adjustment_quat); imu_pose_type pose = {0}; pose.orientation = orientation; pose.position = has_position ? position : (imu_vec3_type){0}; pose.has_orientation = true; pose.has_position = has_position; pose.timestamp_ms = timestamp_ms; connection_pool_ingest_pose(VITURE_DRIVER_ID, pose); } static void viture_legacy_pose_callback(float* pose, uint64_t ts) { if (!connected || driver_disabled() || pose == NULL) return; // pose received in NWU coordinate system imu_quat_type quat = {.x = pose[4], .y = pose[5], .z = pose[6], .w = pose[3]}; uint32_t timestamp_ms = (uint32_t)(ts / 1000000ULL); viture_publish_pose(quat, false, (imu_vec3_type){0}, timestamp_ms); } static void viture_carina_imu_callback(float* imu, double timestamp) { static double initial_timestamp = -1.0; device_properties_type* device = device_checkout(); if (connected && viture_provider != NULL && device != NULL && imu != NULL) { float pose[9] = {0}; int result = get_gl_pose_carina(viture_provider, pose, 0.0); if (result == 0) { // pose received in EUS (GL) coordinate system, convert to NWU imu_quat_type quat = {.x = -pose[6], .y = -pose[4], .z = pose[5], .w = pose[3]}; float full_distance_cm = LENS_TO_PIVOT_CM / device->lens_distance_ratio; float meters_to_full_distance_ratio = 100.0f / full_distance_cm; imu_vec3_type position = { .x = -pose[2] * meters_to_full_distance_ratio, .y = -pose[0] * meters_to_full_distance_ratio, .z = pose[1] * meters_to_full_distance_ratio }; if (initial_timestamp < 0.0) initial_timestamp = timestamp; double elapsed_ms = (timestamp - initial_timestamp) * 1000.0; if (elapsed_ms >= VITURE_FLOAT_EXACT_MS_LIMIT - VITURE_FLOAT_RESET_MARGIN_MS) { initial_timestamp = timestamp; elapsed_ms = 0.0; } uint32_t timestamp_ms = (uint32_t)elapsed_ms; viture_publish_pose(quat, true, position, timestamp_ms); } else if (config()->debug_device) { log_debug("VITURE: get_gl_pose_carina failed (%d)\n", result); } } device_checkin(device); } // static const char* viture_get_model_name(uint16_t product_id) { // char* model_name = calloc(VITURE_MARKET_NAME_MAX, sizeof(char)); // int requested_len = VITURE_MARKET_NAME_MAX; // int result = xr_device_provider_get_market_name(product_id, model_name, &requested_len); // if (result != 0) { // snprintf(model_name, VITURE_MARKET_NAME_MAX, "VITURE 0x%04X", product_id); // } // return model_name; // } // TODO - the SDK doesn't actually reliably call this yet static void viture_state_callback(int glass_state_id, int glass_value) { if (glass_state_id == VITURE_STATE_ID_DISPLAY_MODE) { sbs_mode_enabled = viture_display_mode_is_sbs(glass_value); if (config()->debug_device) { log_debug("VITURE: Display mode changed via callback, mode=%d sbs_enabled=%d\n", glass_value, sbs_mode_enabled); } } else if (config()->debug_device) { log_debug("VITURE: Glass state callback id=%d value=%d\n", glass_state_id, glass_value); } } static void viture_register_state_callback_locked() { if (viture_provider == NULL || viture_state_callback_registered) return; int result = xr_device_provider_register_state_callback(viture_provider, viture_state_callback); if (result == 0) { viture_state_callback_registered = true; if (config()->debug_device) { log_debug("VITURE: State callback registered\n"); } } else { log_error("VITURE: Failed to register state callback (%d)\n", result); } } static void viture_unregister_state_callback_locked() { if (viture_provider == NULL || !viture_state_callback_registered) return; int result = xr_device_provider_register_state_callback(viture_provider, NULL); if (result != 0 && config()->debug_device) { log_debug("VITURE: Failed to unregister state callback (%d)\n", result); } viture_state_callback_registered = false; } static device_properties_type* viture_supported_device(uint16_t vendor_id, uint16_t product_id, uint8_t usb_bus, uint8_t usb_address) { if (vendor_id == VITURE_ID_VENDOR) { for (int i = 0; i < VITURE_ID_PRODUCT_COUNT; i++) { if (product_id == viture_supported_id_product[i]) { if (!xr_device_provider_is_product_id_valid(product_id)) { log_message("VITURE: Product ID 0x%04x rejected by SDK\n", product_id); continue; } device_properties_type* device = calloc(1, sizeof(device_properties_type)); *device = viture_properties; device->hid_vendor_id = vendor_id; device->hid_product_id = product_id; device->model = (char *)viture_supported_models[i]; device->resolution_h = viture_resolution_heights[i]; device->fov = *viture_fovs[i]; device->calibration_wait_s = viture_calibration_wait_s[i]; device->look_ahead_constant = (float)viture_look_ahead_constant[i]; adjustment_quat = device_pitch_adjustment(*viture_pitch_adjustments[i]); viture_last_product_id = product_id; return device; } } } return NULL; }; static bool viture_initialize_provider_locked(uint16_t product_id) { if (product_id == 0) return false; xr_device_provider_set_log_level(VITURE_LOG_LEVEL_ERROR); viture_provider = xr_device_provider_create(product_id); if (viture_provider == NULL) { log_error("VITURE: Failed to create provider handle for product 0x%04x\n", product_id); return false; } if (config()->debug_device) { log_debug("VITURE: Provider handle created for product 0x%04x\n", product_id); } int sdk_device_type = xr_device_provider_get_device_type(viture_provider); viture_device_type = sdk_device_type >= 0 ? (XRDeviceType)sdk_device_type : XR_DEVICE_TYPE_VITURE_GEN1; if (config()->debug_device) { log_debug("VITURE: SDK device type reported as %d\n", sdk_device_type); } int register_result = -1; if (viture_device_type == XR_DEVICE_TYPE_VITURE_CARINA) { // TODO try removing this entirely since we don't need callbacks register_result = register_callbacks_carina(viture_provider, NULL, NULL, viture_carina_imu_callback, NULL); } else { register_result = register_pose_callback(viture_provider, viture_legacy_pose_callback); } bool viture_callbacks_registered = (register_result == 0); if (!viture_callbacks_registered) { log_error("VITURE: Failed to register SDK callbacks (type=%d)\n", viture_device_type); xr_device_provider_destroy(viture_provider); viture_provider = NULL; return false; } else if (config()->debug_device) { log_debug("VITURE: Callback registration succeeded for type=%d\n", viture_device_type); } if (xr_device_provider_initialize(viture_provider, NULL) != 0) { log_error("VITURE: Failed to initialize SDK provider\n"); xr_device_provider_destroy(viture_provider); viture_provider = NULL; return false; } if (config()->debug_device) log_debug("VITURE: SDK provider initialized\n"); initialized = true; return true; } static bool viture_open_imu_locked() { if (viture_imu_open || viture_device_type == XR_DEVICE_TYPE_VITURE_CARINA) { return true; } int open_result = open_imu(viture_provider, VITURE_IMU_MODE_POSE, viture_requested_frequency); viture_imu_open = open_result == 0; if (viture_imu_open) { return true; } else { log_error("VITURE: open_imu failed (%d: %s)\n", open_result, viture_open_imu_error_reason(open_result)); } return false; } static bool viture_start_stream_locked() { if (!initialized || viture_provider == NULL) return false; sleep(1); if (xr_device_provider_start(viture_provider) != 0) { log_error("VITURE: Failed to start SDK provider\n"); return false; } if (config()->debug_device) { log_debug("VITURE: Provider start succeeded\n"); } // viture_register_state_callback_locked(); if (!viture_open_imu_locked()) { log_error("VITURE: Failed to open IMU stream\n"); return false; } // viture_capture_and_override_display_mode_locked(); connected = true; // viture_refresh_sbs_state_locked(); return true; } static void viture_stop_stream_locked() { if (viture_provider == NULL) return; // viture_unregister_state_callback_locked(); // viture_restore_display_mode_locked(); if (viture_imu_open) { close_imu(viture_provider, VITURE_IMU_MODE_POSE); viture_imu_open = false; if (config()->debug_device) { log_debug("VITURE: Closed IMU stream\n"); } } if (connected) { int stop_result = xr_device_provider_stop(viture_provider); if (stop_result != 0 && config()->debug_device) { log_debug("VITURE: xr_device_provider_stop returned %d\n", stop_result); } else if (config()->debug_device && stop_result == 0) { log_debug("VITURE: Provider stop succeeded\n"); } connected = false; } } static void viture_shutdown_provider_locked() { if (!initialized || viture_provider == NULL) return; if (xr_device_provider_shutdown(viture_provider) != 0 && config()->debug_device) { log_debug("VITURE: xr_device_provider_shutdown reported an error\n"); } xr_device_provider_destroy(viture_provider); viture_provider = NULL; initialized = false; viture_device_type = XR_DEVICE_TYPE_VITURE_GEN1; viture_state_callback_registered = false; viture_saved_display_mode = -1; viture_saved_dof = -1; if (config()->debug_device) { log_debug("VITURE: Provider shutdown complete\n"); } } static void viture_update_device_properties(device_properties_type* device) { if (device == NULL) return; int cycles_per_s; bool provides_position = false; if (viture_device_type == XR_DEVICE_TYPE_VITURE_CARINA) { cycles_per_s = VITURE_CARINA_CYCLES_PER_S; provides_position = true; } else { cycles_per_s = viture_frequency_hz[viture_requested_frequency]; } device->imu_cycles_per_s = cycles_per_s; device->imu_buffer_size = cycles_per_s / 60; if (device->imu_buffer_size < 1) device->imu_buffer_size = 1; device->provides_position = provides_position; device->sbs_mode_supported = true; device->firmware_update_recommended = false; } static void disconnect(bool soft) { if (config()->debug_device) { log_debug("VITURE: Disconnect requested (soft=%d)\n", soft); } pthread_mutex_lock(&viture_connection_mutex); viture_stop_stream_locked(); if (!soft) viture_shutdown_provider_locked(); pthread_mutex_unlock(&viture_connection_mutex); } static bool viture_device_connect() { if (connected) return true; device_properties_type* device = device_checkout(); uint16_t product_id = device ? device->hid_product_id : viture_last_product_id; bool success = true; pthread_mutex_lock(&viture_connection_mutex); if (!initialized) { success = viture_initialize_provider_locked(product_id); } if (success) { success = viture_start_stream_locked(); } pthread_mutex_unlock(&viture_connection_mutex); if (!success) { if (config()->debug_device) { log_debug("VITURE: Connection attempt failed, cleaning up\n"); } if (device != NULL) device_checkin(device); // do a hard disconnect even though the device is still physically connected disconnect(false); return false; } if (device != NULL) { viture_update_device_properties(device); device_checkin(device); } if (config()->debug_device) { log_debug("VITURE: viture_device_connect completed (connected=%d)\n", connected); } return connected; } static void viture_block_on_device() { if (connected) { wait_for_imu_start(); while (connected) { if (!is_imu_alive()) break; sleep(1); } } disconnect(true); }; static bool viture_device_is_sbs_mode() { if (viture_provider == NULL || !connected) return false; pthread_mutex_lock(&viture_connection_mutex); int mode = xr_device_provider_get_display_mode(viture_provider); if (mode >= 0) sbs_mode_enabled = viture_display_mode_is_sbs(mode); pthread_mutex_unlock(&viture_connection_mutex); return sbs_mode_enabled; }; static bool viture_device_set_sbs_mode(bool enabled) { pthread_mutex_lock(&viture_connection_mutex); bool success = false; if (viture_provider != NULL && connected) { success = xr_device_provider_switch_dimension(viture_provider, enabled) == 0; if (success) { sbs_mode_enabled = enabled; if (config()->debug_device) { log_debug("VITURE: SBS mode set to %d\n", enabled); } } else if (config()->debug_device) { log_debug("VITURE: Failed to set SBS mode to %d\n", enabled); } } pthread_mutex_unlock(&viture_connection_mutex); return success; }; static bool viture_is_connected() { return connected; }; static void viture_disconnect(bool soft) { disconnect(soft); }; const device_driver_type viture_driver = { .id = VITURE_DRIVER_ID, .supported_device_func = viture_supported_device, .device_connect_func = viture_device_connect, .block_on_device_func = viture_block_on_device, .device_is_sbs_mode_func = viture_device_is_sbs_mode, .device_set_sbs_mode_func = viture_device_set_sbs_mode, .is_connected_func = viture_is_connected, .disconnect_func = viture_disconnect }; ================================================ FILE: src/devices/xreal.c ================================================ #include "devices.h" #include "connection_pool.h" #include "device_imu.h" #include "device_mcu.h" #include "driver.h" #include "imu.h" #include "logging.h" #include "outputs.h" #include "runtime_context.h" #include "strings.h" #include #include #include #include #include #include #include #include #define TS_TO_MS_FACTOR 1000000 #define EXPECTED_CYCLES_PER_S 1000 #define FORCED_CYCLES_PER_S 250 // glasses may operate at a reduced frequency, let's force a reduced cycle time #define CYCLE_TIME_CHECK_ERROR_FACTOR 0.95 // cycle times won't be exact, check within a 5% margin #define FORCED_CYCLE_TIME_MS 1000.0 / FORCED_CYCLES_PER_S * CYCLE_TIME_CHECK_ERROR_FACTOR #define BUFFER_SIZE_TARGET_MS 10 // smooth IMU data over this period of time #define MAPPED_DISPLAY_MODE_COUNT 5 #define XREAL_DRIVER_ID "xreal" // These two arrays are not only used as sets to determine what type a display mode is, but they're also used to // map back and forth to one another (the index of a display mode in one array is used to find the corresponding // display mode in the other array). That's way they're ordered the way they are, and some modes are duplicated. const int sbs_display_modes[MAPPED_DISPLAY_MODE_COUNT] = { DEVICE_MCU_DISPLAY_MODE_3840x1080_60_SBS, DEVICE_MCU_DISPLAY_MODE_3840x1080_72_SBS, DEVICE_MCU_DISPLAY_MODE_3840x1080_90_SBS, DEVICE_MCU_DISPLAY_MODE_3840x1080_90_SBS, // no 120Hz SBS mode, map from 120Hz to 90Hz DEVICE_MCU_DISPLAY_MODE_1920x1080_60_SBS // put this last so no non-SBS mode will map to it }; const int non_sbs_display_modes[MAPPED_DISPLAY_MODE_COUNT] = { DEVICE_MCU_DISPLAY_MODE_1920x1080_60, DEVICE_MCU_DISPLAY_MODE_1920x1080_72, DEVICE_MCU_DISPLAY_MODE_1920x1080_90, DEVICE_MCU_DISPLAY_MODE_1920x1080_120, // no SBS mode will be able to map to this DEVICE_MCU_DISPLAY_MODE_1920x1080_60 // this duplicates index 0, so the sbs mode mapping here will get remapped }; #define XREAL_ID_PRODUCT_COUNT 10 #define XREAL_ID_VENDOR 0x3318 const uint16_t xreal_supported_id_product[XREAL_ID_PRODUCT_COUNT] = { 0x0424, // XREAL Air 0x0428, // XREAL Air 2 0x0432, // XREAL Air 2 Pro 0x0426, // XREAL Air 2 Ultra 0x0435, // XREAL One Pro 0x0436, // XREAL One Pro 0x0437, // XREAL One 0x0438, // XREAL One 0x043e, // XREAL One S 0x043d // XREAL One S }; const float xreal_fovs[XREAL_ID_PRODUCT_COUNT] = { 45.0, // XREAL Air 45.0, // XREAL Air 2 45.0, // XREAL Air 2 Pro 52.0, // XREAL Air 2 Ultra 57.0, // XREAL One Pro 57.0, // XREAL One Pro 50.0, // XREAL One 50.0, // XREAL One 52.0, // XREAL One S 52.0 // XREAL One S }; const float xreal_look_ahead_constants[XREAL_ID_PRODUCT_COUNT] = { 10.0, // XREAL Air 10.0, // XREAL Air 2 10.0, // XREAL Air 2 Pro 10.0, // XREAL Air 2 Ultra 25.0, // XREAL One Pro 25.0, // XREAL One Pro 25.0, // XREAL One 25.0, // XREAL One 25.0, // XREAL One S 25.0 // XREAL One S }; const int xreal_calibration_wait_s[XREAL_ID_PRODUCT_COUNT] = { 15, // XREAL Air 15, // XREAL Air 2 15, // XREAL Air 2 Pro 15, // XREAL Air 2 Ultra 5, // XREAL One Pro 5, // XREAL One Pro 5, // XREAL One 5, // XREAL One 5, // XREAL One S 5 // XREAL One S }; const char* xreal_supported_models[XREAL_ID_PRODUCT_COUNT] = { "Air", "Air 2", "Air 2 Pro", "Air 2 Ultra", "One Pro", "One Pro", "One", "One", "1S", "1S" }; const imu_quat_type nwu_conversion_quat = {.x = 1, .y = 0, .z = 0, .w = 0}; const float xreal_pitch_adjustments[XREAL_ID_PRODUCT_COUNT] = { 0.0, // XREAL Air 0.0, // XREAL Air 2 0.0, // XREAL Air 2 Pro 0.0, // XREAL Air 2 Ultra 35.0, // XREAL One Pro 35.0, // XREAL One Pro 0.0, // XREAL One 0.0, // XREAL One 0.0, // XREAL One S 0.0 // XREAL One S }; const device_properties_type xreal_air_properties = { .brand = "XREAL", .model = NULL, .hid_vendor_id = 0, .hid_product_id = 0, .calibration_setup = CALIBRATION_SETUP_AUTOMATIC, .resolution_w = RESOLUTION_1080P_W, .resolution_h = RESOLUTION_1080P_H, .fov = 45.0, .lens_distance_ratio = 0.03125, .calibration_wait_s = 15, .imu_cycles_per_s = FORCED_CYCLES_PER_S, .imu_buffer_size = ceil(BUFFER_SIZE_TARGET_MS / FORCED_CYCLE_TIME_MS), .look_ahead_constant = 10.0, .look_ahead_frametime_multiplier = 0.3, .look_ahead_scanline_adjust = 8.0, .look_ahead_ms_cap = 40.0, .sbs_mode_supported = true, .firmware_update_recommended = false, .provides_orientation = true, .provides_position = false }; static pthread_mutex_t device_driver_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t device_driver_mcu_exited_cond = PTHREAD_COND_INITIALIZER; static bool device_driver_mcu_exited = false; static imu_quat_type device_conversion_quat = nwu_conversion_quat; static uint32_t last_utilized_event_ts = 0; static bool connected = false; static bool mcu_enabled = false; void handle_xreal_event(uint64_t timestamp, device_imu_event_type event, const device_imu_ahrs_type* ahrs) { if (!connected || driver_disabled()) return; uint32_t ts = (uint32_t) (timestamp / TS_TO_MS_FACTOR); uint32_t elapsed_from_last_utilized = ts - last_utilized_event_ts; if (event == DEVICE_IMU_EVENT_UPDATE && elapsed_from_last_utilized > FORCED_CYCLE_TIME_MS) { device_imu_quat_type quat = device_imu_get_orientation(ahrs); imu_quat_type imu_quat = { .w = quat.w, .x = quat.x, .y = quat.y, .z = quat.z }; imu_quat_type nwu_quat = multiply_quaternions(imu_quat, device_conversion_quat); imu_pose_type pose = {0}; pose.orientation = nwu_quat; pose.has_orientation = true; pose.timestamp_ms = ts; connection_pool_ingest_pose(XREAL_DRIVER_ID, pose); last_utilized_event_ts = ts; } } void handle_xreal_controller_event( uint64_t timestamp, device_mcu_event_type event, uint8_t brightness, const char* msg ) { // do nothing } device_imu_type* glasses_imu; device_mcu_type* glasses_controller; bool xreal_device_connect() { sleep(1); glasses_imu = calloc(1, sizeof(device_imu_type)); connected = device_imu_open(glasses_imu, handle_xreal_event) == DEVICE_IMU_ERROR_NO_ERROR; if (connected) { device_imu_clear(glasses_imu); device_imu_calibrate(glasses_imu, 1000, true, true, false); glasses_controller = calloc(1, sizeof(device_mcu_type)); mcu_enabled = device_mcu_open(glasses_controller, handle_xreal_controller_event) == DEVICE_MCU_ERROR_NO_ERROR; device_mcu_clear(glasses_controller); } if (!connected && glasses_imu) { device_imu_close(glasses_imu); free(glasses_imu); glasses_imu = NULL; } if (!mcu_enabled) { if (glasses_controller) { device_mcu_close(glasses_controller); free(glasses_controller); glasses_controller = NULL; } device_properties_type* device = device_checkout(); device->sbs_mode_supported = false; device_checkin(device); } return connected; }; device_properties_type* xreal_supported_device(uint16_t vendor_id, uint16_t product_id, uint8_t usb_bus, uint8_t usb_address) { if (vendor_id == XREAL_ID_VENDOR) { for (int i=0; i < XREAL_ID_PRODUCT_COUNT; i++) { if (product_id == xreal_supported_id_product[i]) { device_properties_type* device = calloc(1, sizeof(device_properties_type)); *device = xreal_air_properties; device->hid_vendor_id = vendor_id; device->hid_product_id = product_id; device->model = (char *)xreal_supported_models[i]; device->fov = xreal_fovs[i]; device->look_ahead_constant = xreal_look_ahead_constants[i]; device->calibration_wait_s = xreal_calibration_wait_s[i]; device_conversion_quat = multiply_quaternions(nwu_conversion_quat, device_pitch_adjustment(xreal_pitch_adjustments[i])); return device; } } } return NULL; }; void *poll_imu_func(void *arg) { if (config()->debug_threads) log_debug("poll_imu_func, starting\n"); while (connected && (!mcu_enabled || glasses_controller) && device_imu_read(glasses_imu, 1) == DEVICE_IMU_ERROR_NO_ERROR); if (config()->debug_threads) log_debug("poll_imu_func, disconnect detected %d %d %d\n", connected, mcu_enabled, glasses_controller != NULL); pthread_mutex_lock(&device_driver_mutex); while (!device_driver_mcu_exited) pthread_cond_wait(&device_driver_mcu_exited_cond, &device_driver_mutex); device_imu_close(glasses_imu); pthread_mutex_unlock(&device_driver_mutex); if (glasses_imu) free(glasses_imu); glasses_imu = NULL; if (config()->debug_threads) log_debug("poll_imu_func, exiting\n"); }; bool sbs_mode_change_requested = false; void *poll_controller_func(void *arg) { if (config()->debug_threads) log_debug("poll_controller_func, starting\n"); device_driver_mcu_exited = false; while (connected && glasses_imu && mcu_enabled && device_mcu_read(glasses_controller, 100) == DEVICE_MCU_ERROR_NO_ERROR) { if (sbs_mode_change_requested) { device_mcu_error_type error = device_mcu_update_display_mode(glasses_controller); if (error == DEVICE_MCU_ERROR_NO_ERROR) { sbs_mode_change_requested = false; } } else { device_mcu_poll_display_mode(glasses_controller); } sleep(1); } if (config()->debug_threads) log_debug("poll_controller_func, disconnect detected %d %d %d\n", connected, mcu_enabled, glasses_controller != NULL); pthread_mutex_lock(&device_driver_mutex); device_mcu_close(glasses_controller); device_driver_mcu_exited = true; pthread_cond_signal(&device_driver_mcu_exited_cond); pthread_mutex_unlock(&device_driver_mutex); if (glasses_controller) free(glasses_controller); glasses_controller = NULL; if (config()->debug_threads) log_debug("poll_controller_func, exiting\n"); }; void xreal_block_on_device() { if (config()->debug_threads) log_debug("xreal_block_on_device, starting\n"); // we'll hold onto our device refcount until we're done blocking and cleaning up device_properties_type* device = device_checkout(); if (device != NULL) { pthread_t imu_thread; pthread_create(&imu_thread, NULL, poll_imu_func, NULL); pthread_t controller_thread; pthread_create(&controller_thread, NULL, poll_controller_func, NULL); connected &= wait_for_imu_start(); bool imu_alive = true; while (connected) { sleep(1); imu_alive = is_imu_alive(); connected &= glasses_imu && (!mcu_enabled || glasses_controller) && imu_alive; } if (config()->debug_threads) log_debug("xreal_block_on_device, disconnect detected %d %d %d %d\n", glasses_imu != NULL, mcu_enabled, glasses_controller != NULL, imu_alive); pthread_join(imu_thread, NULL); pthread_join(controller_thread, NULL); } device_checkin(device); if (config()->debug_threads) log_debug("xreal_block_on_device, exiting\n"); }; int get_display_mode_index(int display_mode, const int* display_modes) { for (int i = 0; i < MAPPED_DISPLAY_MODE_COUNT; i++) { if (display_mode == display_modes[i]) { return i; } } return -1; } bool xreal_device_is_sbs_mode() { if (connected && mcu_enabled && glasses_controller) { if (get_display_mode_index(glasses_controller->disp_mode, sbs_display_modes) != -1) { return true; } } return false; }; bool xreal_device_set_sbs_mode(bool enable) { if (!connected || !mcu_enabled || !glasses_controller) return false; // check what the current mode is int sbs_mode_index = get_display_mode_index(glasses_controller->disp_mode, sbs_display_modes); bool is_sbs_mode = sbs_mode_index != -1; // if the current mode matches the requested mode, do nothing, return success if (enable == is_sbs_mode) return true; if (enable) { // requesting SBS mode, currently non-SBS, find the corresponding SBS mode and set it int non_sbs_mode_index = get_display_mode_index(glasses_controller->disp_mode, non_sbs_display_modes); if (non_sbs_mode_index == -1) return false; glasses_controller->disp_mode = sbs_display_modes[non_sbs_mode_index]; } else { // requesting non-SBS mode, currently SBS, find the corresponding non-SBS mode and set it glasses_controller->disp_mode = non_sbs_display_modes[sbs_mode_index]; } sbs_mode_change_requested = true; return true; }; bool xreal_is_connected() { return connected; }; void xreal_disconnect(bool soft) { connected = false; }; const device_driver_type xreal_driver = { .id = XREAL_DRIVER_ID, .supported_device_func = xreal_supported_device, .device_connect_func = xreal_device_connect, .block_on_device_func = xreal_block_on_device, .device_is_sbs_mode_func = xreal_device_is_sbs_mode, .device_set_sbs_mode_func = xreal_device_set_sbs_mode, .is_connected_func = xreal_is_connected, .disconnect_func = xreal_disconnect }; ================================================ FILE: src/devices.c ================================================ #include "connection_pool.h" #include "devices.h" #include "devices/rayneo.h" #include "devices/rokid.h" #include "devices/viture.h" #include "devices/xreal.h" #include "logging.h" #include "runtime_context.h" #include #include #include #include #if defined(__aarch64__) #define DEVICE_DRIVER_COUNT 2 const device_driver_type* device_drivers[DEVICE_DRIVER_COUNT] = { &xreal_driver, &viture_driver }; #elif defined(__x86_64__) #define DEVICE_DRIVER_COUNT 4 const device_driver_type* device_drivers[DEVICE_DRIVER_COUNT] = { &rayneo_driver, &rokid_driver, &xreal_driver, &viture_driver }; #else #error "Unsupported architecture" #endif static connected_device_type* _find_connected_device(libusb_device *usb_device, struct libusb_device_descriptor descriptor) { for (int j = 0; j < DEVICE_DRIVER_COUNT; j++) { const device_driver_type* driver = device_drivers[j]; device_properties_type* device = driver->supported_device_func( descriptor.idVendor, descriptor.idProduct, libusb_get_bus_number(usb_device), libusb_get_device_address(usb_device) ); if (device != NULL) { log_message("Found device with vendor ID 0x%04x and product ID 0x%04x\n", descriptor.idVendor, descriptor.idProduct); connected_device_type* connected_device = calloc(1, sizeof(connected_device_type)); connected_device->driver = driver; connected_device->device = device; return connected_device; } } return NULL; } int hotplug_callback(libusb_context *ctx, libusb_device *usb_device, libusb_hotplug_event event, void *user_data) { struct libusb_device_descriptor descriptor; int r = libusb_get_device_descriptor(usb_device, &descriptor); if (r < 0) { log_error("Failed to get device descriptor\n"); return 1; } if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) { connection_t* conn = connection_pool_find_hid_connection(descriptor.idVendor, descriptor.idProduct); if (conn) { connected_device_type* connected_device = calloc(1, sizeof(connected_device_type)); connected_device->driver = conn->driver; connected_device->device = conn->device; handle_device_connection_changed(false, connected_device); } } else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) { connected_device_type* connected_device = _find_connected_device(usb_device, descriptor); if (connected_device != NULL) { handle_device_connection_changed(true, connected_device); } } return 0; } libusb_context *ctx = NULL; libusb_hotplug_callback_handle callback_handle; void init_devices() { int r = libusb_init(&ctx); if (r < 0) { log_error("Failed to initialize libusb\n"); return; } r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, LIBUSB_HOTPLUG_ENUMERATE, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, &callback_handle); if (r < 0) { log_error("Failed to register hotplug callback\n"); } } void handle_device_connection_events() { struct timeval tv = {5, 0}; libusb_handle_events_timeout_completed(ctx, &tv, NULL); } void deinit_devices() { if (callback_handle != 0) libusb_hotplug_deregister_callback(ctx, callback_handle); libusb_exit(ctx); } connected_device_type* find_connected_device() { libusb_device **usb_device_list; ssize_t usb_device_count = libusb_get_device_list(ctx, &usb_device_list); if (usb_device_count < 0) { log_error("Failed to get device list\n"); libusb_exit(ctx); return NULL; } connected_device_type* connected_device = NULL; libusb_device *usb_device; int i = 0; for (i = 0; i < usb_device_count; i++) { usb_device = usb_device_list[i]; struct libusb_device_descriptor descriptor; int r = libusb_get_device_descriptor(usb_device, &descriptor); if (r < 0) { log_error("Failed to get device descriptor\n"); continue; } connected_device = _find_connected_device(usb_device, descriptor); if (connected_device != NULL) break; } libusb_free_device_list(usb_device_list, 1); return connected_device; } bool device_equal(device_properties_type* device, device_properties_type* device2) { return device != NULL && device2 != NULL && device->hid_product_id == device2->hid_product_id && device->hid_vendor_id == device2->hid_vendor_id; } ================================================ FILE: src/driver.c ================================================ #include "buffer.h" #include "driver.h" #include "config.h" #include "devices.h" #include "devices/viture.h" #include "devices/xreal.h" #include "connection_pool.h" #include "files.h" #include "imu.h" #include "ipc.h" #include "logging.h" #include "memory.h" #include "multitap.h" #include "ipc.h" #include "outputs.h" #include "plugins.h" #include "plugins/gamescope_reshade_wayland.h" #include "runtime_context.h" #include "state.h" #include "strings.h" #include "system.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event) + NAME_MAX + 1) #define INOTIFY_EVENT_BUFFER_SIZE (1024 * INOTIFY_EVENT_SIZE) #define MT_RECENTER_SCREEN 2 #define MT_RESET_CALIBRATION 3 ipc_values_type *ipc_values; bool glasses_calibrated=false; long int glasses_calibration_started_sec=0; bool force_quit=false; control_flags_type *control_flags; bool captured_reference_pose=false; imu_pose_type reference_pose; imu_quat_type reference_orientation_conj; static bool is_driver_connected() { return connection_pool_is_connected(); } void reset_calibration(bool reset_device) { glasses_calibration_started_sec=0; glasses_calibrated=false; captured_reference_pose=false; control_flags->recalibrate=false; state()->calibration_state = CALIBRATING; if (reset_device && is_driver_connected()) { if (config()->debug_device) log_debug("reset_calibration, connection_pool_disconnect_all(true)\n"); connection_pool_disconnect_all(true); } else log_message("Waiting on device calibration\n"); } static bool reference_pose_updated = false; bool driver_reference_pose(imu_pose_type* out_pose, bool* pose_updated) { if (captured_reference_pose) { *out_pose = reference_pose; *pose_updated = reference_pose_updated; reference_pose_updated = false; return true; } return false; } void driver_handle_pose(imu_pose_type pose) { // counter that resets every second, for triggering things that we don't want to do every cycle static int imu_counter = 0; static int multi_tap = 0; device_properties_type* device = device_checkout(); if (is_driver_connected() && device != NULL) { if (config()->debug_device && imu_counter == 0 && pose.has_orientation) log_debug("driver_handle_pose_event - quat: %f %f %f %f; pos: %f %f %f\n", pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w, pose.position.x, pose.position.y, pose.position.z); if (glasses_calibrated) { if (!captured_reference_pose || multi_tap == MT_RECENTER_SCREEN || control_flags->recenter_screen) { if (multi_tap == MT_RECENTER_SCREEN) log_message("Double-tap detected.\n"); log_message("Centering screen\n"); imu_pose_type old_reference_pose = reference_pose; if (pose.has_orientation) { reference_pose.orientation = pose.orientation; reference_pose.has_orientation = true; reference_orientation_conj = conjugate(reference_pose.orientation); } else { imu_quat_type tmp_screen_center = { .w = 1.0, .x = 0.0, .y = 0.0, .z = 0.0 }; reference_pose.orientation = tmp_screen_center; reference_orientation_conj = tmp_screen_center; reference_pose.has_orientation = false; } if (pose.has_position) { reference_pose.position = pose.position; reference_pose.has_position = true; } else { reference_pose.position = (imu_vec3_type){0.0f, 0.0f, 0.0f}; reference_pose.has_position = false; } captured_reference_pose = true; reference_pose_updated = true; control_flags->recenter_screen = false; plugins.handle_reference_pose_updated(old_reference_pose, reference_pose); } else { imu_pose_type current_pose = pose; if (current_pose.has_orientation) current_pose.euler = quaternion_to_euler_zyx(current_pose.orientation); reference_pose_updated |= plugins.modify_reference_pose(current_pose, &reference_pose); if (reference_pose_updated) reference_orientation_conj = conjugate(reference_pose.orientation); } } else { struct timeval tv; gettimeofday(&tv, NULL); if (glasses_calibration_started_sec == 0) { // defaults used for mouse/joystick while waiting on calibration imu_quat_type tmp_screen_center = { .w = 1.0, .x = 0.0, .y = 0.0, .z = 0.0 }; reference_pose.orientation = tmp_screen_center; reference_orientation_conj = tmp_screen_center; reference_pose.position = (imu_vec3_type){0.0f, 0.0f, 0.0f}; reference_pose.has_orientation = pose.has_orientation; reference_pose.has_position = pose.has_position; glasses_calibration_started_sec=tv.tv_sec; if (ipc_values) reset_pose_data(ipc_values); } else { glasses_calibrated = (tv.tv_sec - glasses_calibration_started_sec) > device->calibration_wait_s; if (glasses_calibrated) { state()->calibration_state = CALIBRATED; log_message("Device calibration complete\n"); } } } // be resilient to bad values that may come from device drivers if (!isnan(pose.orientation.w)) { static imu_euler_type prev_unmodified_euler = {0.0f, 0.0f, 0.0f}; if (pose.has_orientation) { pose.orientation = multiply_quaternions(reference_orientation_conj, pose.orientation); pose.euler = quaternion_to_euler_zyx(pose.orientation); } // interpret all positions relative to the reference orientation if (pose.has_position) { imu_vec3_type rel = { .x = pose.position.x - reference_pose.position.x, .y = pose.position.y - reference_pose.position.y, .z = pose.position.z - reference_pose.position.z }; pose.position = vector_rotate(rel, reference_orientation_conj); } else { pose.position = (imu_vec3_type){0.0f, 0.0f, 0.0f}; } imu_euler_type euler_velocities; bool velocities_set = false; if (config()->multi_tap_enabled) { euler_velocities = get_euler_velocities(&prev_unmodified_euler, pose.euler, device->imu_cycles_per_s); multi_tap = detect_multi_tap(euler_velocities, pose.timestamp_ms, config()->debug_multi_tap); velocities_set = true; } if (multi_tap == MT_RESET_CALIBRATION || control_flags->recalibrate) { if (multi_tap == MT_RESET_CALIBRATION) log_message("Triple-tap detected. "); log_message("Kicking off calibration\n"); reset_calibration(true); } if (glasses_calibrated) { static imu_euler_type prev_modified_euler = {0.0f, 0.0f, 0.0f}; plugins.modify_pose(&pose); // recompute velocities after pose modification, since outputs that use them // will want to be relative to the modified pose euler_velocities = get_euler_velocities(&prev_modified_euler, pose.euler, device->imu_cycles_per_s); velocities_set = true; } if (!velocities_set) { euler_velocities = get_euler_velocities(&prev_unmodified_euler, pose.euler, device->imu_cycles_per_s); } handle_imu_update(pose, euler_velocities, glasses_calibrated, ipc_values); } else if (config()->debug_device) log_debug("driver_handle_pose_event, received invalid quat\n"); // reset the counter every second if ((++imu_counter % device->imu_cycles_per_s) == 0) { imu_counter = 0; } } device_checkin(device); } bool driver_disabled() { return config()->disabled; } void setup_ipc() { if (!ipc_values) { if (config()->debug_ipc) log_debug("setup_ipc, enabling IPC\n"); ipc_values = calloc(1, sizeof(*ipc_values)); if (!setup_ipc_values(ipc_values, config()->debug_ipc) || !plugins.setup_ipc()) { log_error("Error setting up IPC values\n"); exit(1); } } else if (config()->debug_ipc) log_debug("setup_ipc, already enabled, doing nothing\n"); device_properties_type* device = device_checkout(); if (device != NULL) { plugins.reset_pose_data(); // set IPC values that won't change after a device is set ipc_values->display_res[0] = (float) device->resolution_w; ipc_values->display_res[1] = (float) device->resolution_h; // deprecated - can be removed once this version is widely distributed *ipc_values->display_fov = device->fov; *ipc_values->lens_distance_ratio = device->lens_distance_ratio; // always start out disabled, let it be explicitly enabled later *ipc_values->disabled = true; // set defaults for everything else ipc_values->date[0] = 0.0; ipc_values->date[1] = 0.0; ipc_values->date[2] = 0.0; ipc_values->date[3] = 0.0; set_gamescope_reshade_effect_uniform_variable("display_resolution", ipc_values->display_res, 2, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("keepalive_date", ipc_values->date, 4, sizeof(float), false); } device_checkin(device); } pthread_mutex_t block_on_device_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t block_on_device_cond = PTHREAD_COND_INITIALIZER; static bool block_on_device_ready = false; // reevaluates the conditions that determine whether the block_on_device_thread function can be unblocked, // we should call this whenever a condition changes that may effect the evaluation of block_on_device_ready void evaluate_block_on_device_ready() { if (config()->debug_device) log_debug("evaluate_block_on_device_ready, %s, %s, %s\n", force_quit ? "force_quit" : "no force_quit", driver_disabled() ? "driver_disabled" : "driver_enabled", device_present() ? "device_present" : "no device_present"); pthread_mutex_lock(&block_on_device_mutex); block_on_device_ready = force_quit || !driver_disabled() && device_present(); if (block_on_device_ready) pthread_cond_signal(&block_on_device_cond); pthread_mutex_unlock(&block_on_device_mutex); } // pthread function to wait for a supported device, create outputs, and block on the device while it's connected void *block_on_device_thread_func(void *arg) { while (!force_quit) { if (config()->debug_device) log_debug("block_on_device_thread, loop start\n"); bool first_device_wait = true; pthread_mutex_lock(&block_on_device_mutex); while (!block_on_device_ready) { // if the only thing blocking this thread is the device not being ready, print a message if (!force_quit && !driver_disabled() && first_device_wait) { log_message("Waiting for glasses\n"); first_device_wait = false; } else if (config()->debug_device) log_debug("block_on_device_thread, waiting on ready\n"); pthread_cond_wait(&block_on_device_cond, &block_on_device_mutex); } pthread_mutex_unlock(&block_on_device_mutex); if (!force_quit) { if (config()->debug_device) log_debug("block_on_device_thread, connection_pool_connect_active()\n"); if (connection_pool_connect_active()) { log_message("Device connected, redirecting input to %s...\n", config()->output_mode); setup_ipc(); reset_calibration(false); *ipc_values->disabled = false; plugins.handle_device_connect(); init_outputs(); if (config()->debug_device) log_debug("block_on_device_thread, connection_pool_block_on_active()\n"); connection_pool_block_on_active(); plugins.handle_device_disconnect(); deinit_outputs(); } else if (block_on_device_ready) { log_message("Device driver connection attempt failed\n"); } if (block_on_device_ready) { // device is still physically connected and will retry, pause for a moment log_message("Retrying driver connection in 1 second\n"); sleep(1); } } if (ipc_values) *ipc_values->disabled = true; } if (config()->debug_threads) log_debug("Exiting block_on_device thread; force_quit %d\n", force_quit); } void update_config_from_file(FILE *fp) { driver_config_type* new_config = parse_config_file(fp); bool driver_newly_disabled = !driver_disabled() && new_config->disabled; if (driver_newly_disabled) log_message("Driver has been disabled\n"); bool driver_reenabled = driver_disabled() && !new_config->disabled; if (driver_reenabled) log_message("Driver has been re-enabled\n"); if (config()->vr_lite_invert_x != new_config->vr_lite_invert_x) log_message("VR-Lite invert X-axis has been %s\n", new_config->vr_lite_invert_x ? "enabled" : "disabled"); if (config()->vr_lite_invert_y != new_config->vr_lite_invert_y) log_message("VR-Lite invert Y-axis has been %s\n", new_config->vr_lite_invert_y ? "enabled" : "disabled"); if (!config()->use_roll_axis && new_config->use_roll_axis) log_message("VR-Lite roll axis has been enabled\n"); if (config()->use_roll_axis && !new_config->use_roll_axis) log_message("VR-Lite roll axis has been disabled\n"); if (config()->mouse_sensitivity != new_config->mouse_sensitivity) log_message("Mouse sensitivity has changed to %d\n", new_config->mouse_sensitivity); bool output_mode_changed = strcmp(config()->output_mode, new_config->output_mode) != 0; if (output_mode_changed) log_message("Output mode has been changed to '%s'\n", new_config->output_mode); if (config()->metrics_disabled != new_config->metrics_disabled) log_message("Metrics have been %s\n", new_config->metrics_disabled ? "disabled" : "enabled"); if (!config()->debug_joystick && new_config->debug_joystick) log_message("Joystick debugging has been enabled, to see it, use 'watch -n 0.1 cat $XDG_RUNTIME_DIR/xr_driver/joystick_debug' in bash\n"); if (config()->debug_joystick && !new_config->debug_joystick) log_message("Joystick debugging has been disabled\n"); if (config()->debug_threads != new_config->debug_threads) log_message("Threads debugging has been %s\n", new_config->debug_threads ? "enabled" : "disabled"); if (config()->debug_multi_tap != new_config->debug_multi_tap) log_message("Multi-tap debugging has been %s\n", new_config->debug_multi_tap ? "enabled" : "disabled"); if (config()->debug_ipc != new_config->debug_ipc) log_message("IPC debugging has been %s\n", new_config->debug_ipc ? "enabled" : "disabled"); if (config()->debug_license != new_config->debug_license) log_message("License debugging has been %s\n", new_config->debug_license ? "enabled" : "disabled"); if (config()->debug_device != new_config->debug_device) log_message("Device debugging has been %s\n", new_config->debug_device ? "enabled" : "disabled"); if (config()->dead_zone_threshold_deg != new_config->dead_zone_threshold_deg) log_message("IMU dead zone threshold has been changed to %.2f degrees\n", new_config->dead_zone_threshold_deg); if (config()->debug_connections != new_config->debug_connections) log_message("Connection pool debugging has been %s\n", new_config->debug_connections ? "enabled" : "disabled"); update_config(config(), new_config); if (config()->disabled && is_driver_connected()) { if (config()->debug_device) log_debug("update_config_from_file, connection_pool_disconnect_all(true)\n"); connection_pool_disconnect_all(true); } if (driver_reenabled) plugins.start(); if (output_mode_changed && is_driver_connected()) reinit_outputs(); if (ipc_values) *ipc_values->disabled = driver_disabled(); evaluate_block_on_device_ready(); } // pthread function to monitor the config file for changes char *config_filename = NULL; FILE *config_fp; void *monitor_config_file_thread_func(void *arg) { config_fp = freopen(config_filename, "r", config_fp); update_config_from_file(config_fp); int fd = inotify_init(); if (fd < 0) { perror("Error initializing inotify"); return NULL; } int wd = inotify_add_watch(fd, config_filename, IN_CLOSE_WRITE | IN_DELETE_SELF | IN_ATTRIB); if (wd < 0) { perror("Error adding watch"); return NULL; } char inotify_event_buffer[INOTIFY_EVENT_BUFFER_SIZE]; while (!force_quit) { fd_set readfds; FD_ZERO(&readfds); FD_SET(fd, &readfds); struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; // wait for data to be available for reading, do this with select() so we can specify a timeout and make // sure we shouldn't exit due to force_quit int retval = select(fd + 1, &readfds, NULL, NULL, &tv); if (retval == -1) { perror("select()"); exit(EXIT_FAILURE); } else if (retval) { int length = read(fd, inotify_event_buffer, INOTIFY_EVENT_BUFFER_SIZE); if (length < 0) { perror("Error reading inotify events"); return NULL; } bool updated = false; int i = 0; while (i < length) { struct inotify_event *event = (struct inotify_event *) &inotify_event_buffer[i]; if (event->mask & IN_DELETE_SELF) { // The file has been deleted, so we need to re-add the watch wd = inotify_add_watch(fd, config_filename, IN_CLOSE_WRITE | IN_DELETE_SELF | IN_ATTRIB); if (wd < 0) { perror("Error re-adding watch"); exit(EXIT_FAILURE); } } else { updated = true; } i += INOTIFY_EVENT_SIZE + event->len; } if (ferror(config_fp) != 0 || feof(config_fp) != 0) { config_fp = freopen(config_filename, "r", config_fp); if (config_fp == NULL) { perror("Error reopening config file"); exit(EXIT_FAILURE); } if (!updated) update_config_from_file(config_fp); } if (updated) update_config_from_file(config_fp); } } inotify_rm_watch(fd, wd); close(fd); if (config()->debug_threads) log_debug("Exiting monitor_config_file thread; force_quit: %d\n", force_quit); } // pthread function to update the state and read control flags void *manage_state_thread_func(void *arg) { while (!force_quit) { device_properties_type* device = device_checkout(); device_properties_type* supplemental_device = connection_pool_supplemental_device(); const device_driver_type* primary_drv_in_loop = connection_pool_primary_driver(); update_state_from_device(state(), device, supplemental_device, (device_driver_type*)primary_drv_in_loop); device_checkin(device); write_state(state()); plugins.handle_state(); sleep(1); } // in case any state changed during the last sleep() write_state(state()); if (config()->debug_threads) log_debug("Exiting write_state thread; force_quit: %d\n", force_quit); } void handle_control_flags_update() { device_properties_type* device = device_checkout(); if (is_driver_connected()) { if (device != NULL && device->sbs_mode_supported && control_flags->sbs_mode != SBS_CONTROL_UNSET) { // glasses can be sensitive to rapid mode changes, so only request a change if necessary bool requesting_enabled = control_flags->sbs_mode == SBS_CONTROL_ENABLE; bool is_already_enabled = connection_pool_device_is_sbs_mode(); bool change_requested = is_already_enabled != requesting_enabled; if (change_requested && config()->debug_device) log_debug("handle_control_flags_update, connection_pool_device_set_sbs_mode(%s)\n", requesting_enabled ? "true" : "false"); if (change_requested && !connection_pool_device_set_sbs_mode(requesting_enabled)) { log_error("Error setting requested SBS mode\n"); } control_flags->sbs_mode = SBS_CONTROL_UNSET; } if (control_flags->force_quit) { log_message("Force quit requested, exiting\n"); force_quit = true; if (config()->debug_device) log_debug("handle_control_flags_update, connection_pool_disconnect_all(true)\n"); connection_pool_disconnect_all(true); evaluate_block_on_device_ready(); control_flags->force_quit = false; } } device_checkin(device); } // pthread function for watching control flags file void *monitor_control_flags_file_thread_func(void *arg) { char *control_file_path = NULL; FILE* fp = get_driver_state_file(control_flags_filename, "r", &control_file_path); if (fp) { read_control_flags(fp, control_flags); write_state(state()); handle_control_flags_update(); fclose(fp); remove(control_file_path); } int fd = inotify_init(); if (fd < 0) { perror("inotify_init"); return NULL; } int wd = inotify_add_watch(fd, state_files_directory, IN_CLOSE_WRITE); if (wd < 0) { perror("inotify_add_watch"); close(fd); return NULL; } char inotify_event_buffer[INOTIFY_EVENT_BUFFER_SIZE]; while (!force_quit) { int length = read(fd, inotify_event_buffer, INOTIFY_EVENT_BUFFER_SIZE); if (length < 0) { perror("read"); break; } int i = 0; while (i < length) { struct inotify_event *event = (struct inotify_event *) &inotify_event_buffer[i]; if ((event->mask & IN_CLOSE_WRITE) && strcmp(event->name, control_flags_filename) == 0) { fp = fopen(control_file_path, "r"); if (fp) { read_control_flags(fp, control_flags); write_state(state()); handle_control_flags_update(); fclose(fp); remove(control_file_path); } } i += INOTIFY_EVENT_SIZE + event->len; } } close(fd); free_and_clear(&control_file_path); if (config()->debug_threads) log_debug("Exiting monitor_control_flags_file_thread_func thread; force_quit: %d\n", force_quit); } void handle_device_connection_changed(bool is_added, connected_device_type* device_info) { // as long as we want a device to remain connected, we need to hold at least one checked out reference to it, // otherwise it will get freed prematurely. since this function manages device dis/connect events, // it has the responsibility of always holding open at least one reference as long as a device remains connected. static device_properties_type* primary_device_ref = NULL; if (is_added) { if (config()->debug_device) log_debug("device added for driver %s\n", device_info->driver->id); connection_pool_handle_device_added(device_info->driver, device_info->device); captured_reference_pose = false; } else { if (config()->debug_device) log_debug("device removed for driver %s\n", device_info->driver->id); connection_pool_handle_device_removed(device_info->driver->id); } free(device_info); // Reflect the pool's current primary in the runtime context device_properties_type* new_primary = connection_pool_primary_device(); if (new_primary != primary_device_ref) { if (primary_device_ref) { // Release previous primary device_checkin(primary_device_ref); primary_device_ref = NULL; pthread_mutex_lock(&block_on_device_mutex); block_on_device_ready = false; pthread_mutex_unlock(&block_on_device_mutex); } if (new_primary) { state()->calibration_state = NOT_CALIBRATED; set_device_and_checkout(new_primary); init_multi_tap(new_primary->imu_cycles_per_s); primary_device_ref = new_primary; } } const device_driver_type* primary_drv = connection_pool_primary_driver(); device_properties_type* supplemental_device = connection_pool_supplemental_device(); update_state_from_device(state(), new_primary, supplemental_device, (device_driver_type*)primary_drv); } void *monitor_usb_devices_thread_func(void *arg) { init_devices(); while (!force_quit) { handle_device_connection_events(); sleep(1); } if (config()->debug_threads) log_debug("Exiting monitor_usb_devices_thread_func thread; force_quit: %d\n", force_quit); } void segfault_handler(int sig) { (void)sig; log_error("Segmentation fault occurred\n"); void *buffer[10]; int nptrs = backtrace(buffer, 10); backtrace_symbols_fd(buffer, nptrs, 2); exit(EXIT_FAILURE); } int main(int argc, const char** argv) { signal(SIGSEGV, segfault_handler); log_init(); // set a lock so only one instance of the driver can be running at a time char *lock_file_path = NULL; FILE *lock_file = get_or_create_runtime_file("lock.pid", "r", &lock_file_path, NULL); int rc = flock(fileno(lock_file), LOCK_EX | LOCK_NB); if(rc) { if(EWOULDBLOCK == errno) log_error("Another instance of this program is already running.\n"); exit(1); } free_and_clear(&lock_file_path); set_config(default_config()); set_state(calloc(1, sizeof(driver_state_type))); connection_pool_init(driver_handle_pose, driver_reference_pose); config_fp = get_or_create_config_file("config.ini", "r", &config_filename, NULL); update_config_from_file(config_fp); if (driver_disabled()) log_message("Driver is disabled\n"); control_flags = calloc(1, sizeof(control_flags_type)); control_flags->recenter_screen = false; control_flags->recalibrate = false; control_flags->force_quit = false; control_flags->sbs_mode = SBS_CONTROL_UNSET; control_flags->request_features = NULL; plugins.start(); write_state(state()); set_on_device_change_callback(evaluate_block_on_device_ready); log_message("Starting up XR driver\n"); pthread_t monitor_control_flags_file_thread; pthread_t monitor_config_file_thread; pthread_t manage_state_thread; pthread_t monitor_usb_devices_thread; pthread_t device_thread; pthread_create(&monitor_control_flags_file_thread, NULL, monitor_control_flags_file_thread_func, NULL); pthread_create(&monitor_config_file_thread, NULL, monitor_config_file_thread_func, NULL); pthread_create(&manage_state_thread, NULL, manage_state_thread_func, NULL); pthread_create(&monitor_usb_devices_thread, NULL, monitor_usb_devices_thread_func, NULL); pthread_create(&device_thread, NULL, block_on_device_thread_func, NULL); pthread_join(monitor_control_flags_file_thread, NULL); pthread_join(monitor_config_file_thread, NULL); pthread_join(manage_state_thread, NULL); pthread_join(monitor_usb_devices_thread, NULL); pthread_join(device_thread, NULL); return 0; } ================================================ FILE: src/epoch.c ================================================ #include "epoch.h" #include struct timespec ts; uint64_t get_epoch_time_ms() { timespec_get(&ts, TIME_UTC); long int sec_ms = ts.tv_sec * 1000; long int nsec_ms = ts.tv_nsec / 1000000; return (uint64_t)(sec_ms + nsec_ms); } ================================================ FILE: src/features/breezy_desktop.c ================================================ #include "runtime_context.h" #include "strings.h" #include const char* productivity_basic_feature_name = "productivity"; const char* productivity_pro_feature_name = "productivity_pro"; static atomic_int productivity_basic_granted_cached = ATOMIC_VAR_INIT(-1); static atomic_int productivity_pro_granted_cached = ATOMIC_VAR_INIT(-1); static atomic_int productivity_granted_cached = ATOMIC_VAR_INIT(-1); void reset_productivity_features() { atomic_store_explicit(&productivity_basic_granted_cached, -1, memory_order_release); atomic_store_explicit(&productivity_pro_granted_cached, -1, memory_order_release); atomic_store_explicit(&productivity_granted_cached, -1, memory_order_release); } bool is_productivity_basic_granted() { int cached = atomic_load_explicit(&productivity_basic_granted_cached, memory_order_acquire); if (cached != -1) return cached; driver_state_type* s = state(); bool granted = s && s->granted_features && s->granted_features_count && in_array(productivity_basic_feature_name, (const char**)s->granted_features, s->granted_features_count); atomic_store_explicit(&productivity_basic_granted_cached, granted ? 1 : 0, memory_order_release); return granted; } bool is_productivity_pro_granted() { int cached = atomic_load_explicit(&productivity_pro_granted_cached, memory_order_acquire); if (cached != -1) return cached; driver_state_type* s = state(); bool granted = s && s->granted_features && s->granted_features_count && in_array(productivity_pro_feature_name, (const char**)s->granted_features, s->granted_features_count); atomic_store_explicit(&productivity_pro_granted_cached, granted ? 1 : 0, memory_order_release); return granted; } bool is_productivity_granted() { int cached = atomic_load_explicit(&productivity_granted_cached, memory_order_acquire); if (cached != -1) return cached; bool granted = is_productivity_basic_granted() || is_productivity_pro_granted(); atomic_store_explicit(&productivity_granted_cached, granted ? 1 : 0, memory_order_release); return granted; } ================================================ FILE: src/features/sbs.c ================================================ #include "runtime_context.h" #include "strings.h" #include const char* sbs_feature_name = "sbs"; static atomic_int sbs_granted_cached = ATOMIC_VAR_INIT(-1); void reset_sbs_features() { atomic_store_explicit(&sbs_granted_cached, -1, memory_order_release); } bool is_sbs_granted() { int cached = atomic_load_explicit(&sbs_granted_cached, memory_order_acquire); if (cached != -1) return cached; driver_state_type* s = state(); bool granted = s && s->granted_features && s->granted_features_count && in_array(sbs_feature_name, (const char**)s->granted_features, s->granted_features_count); atomic_store_explicit(&sbs_granted_cached, granted ? 1 : 0, memory_order_release); return granted; } ================================================ FILE: src/features/smooth_follow.c ================================================ #include "runtime_context.h" #include "strings.h" #include const char* smooth_follow_feature_name = "smooth_follow"; static atomic_int smooth_follow_granted_cached = ATOMIC_VAR_INIT(-1); void reset_smooth_follow_features() { atomic_store_explicit(&smooth_follow_granted_cached, -1, memory_order_release); } bool is_smooth_follow_granted() { int cached = atomic_load_explicit(&smooth_follow_granted_cached, memory_order_acquire); if (cached != -1) return cached; driver_state_type* s = state(); bool granted = s && s->granted_features && s->granted_features_count && in_array(smooth_follow_feature_name, (const char**)s->granted_features, s->granted_features_count); atomic_store_explicit(&smooth_follow_granted_cached, granted ? 1 : 0, memory_order_release); return granted; } ================================================ FILE: src/files.c ================================================ #include #include #include #include #include #include #include #include #include const char* XR_DRIVER_DIR = "xr_driver"; const char* XDG_STATE_ENV_VAR = "XDG_STATE_HOME"; const char* XDG_RUNTIME_ENV_VAR = "XDG_RUNTIME_DIR"; const char* XDG_CONFIG_ENV_VAR = "XDG_CONFIG_HOME"; const char* XDG_DATA_ENV_VAR = "XDG_DATA_HOME"; const char* XDG_STATE_FALLBACK_DIR = "/.local/state"; const char* XDG_CONFIG_FALLBACK_DIR = "/.config"; const char* XDG_RUNTIME_FALLBACK_DIR = "/tmp"; const char* XDG_DATA_FALLBACK_DIR = "/.local/share"; // TODO - this uses the parent directories to determine the ownership of the new directory, which can be removed // when the driver is no longer running as root FILE* get_or_create_file(const char *full_path, mode_t directory_mode, const char *file_mode, bool *file_created) { FILE *fp = fopen(full_path, file_mode ? file_mode : "r"); if (fp == NULL) { char *copypath = strdup(full_path); char *pp = copypath; char *sp; int status = 0; struct stat st; while (status == 0 && (sp = strchr(pp, '/')) != 0) { if (sp != pp) { *sp = '\0'; if (stat(copypath, &st) != 0) { if (mkdir(copypath, directory_mode) != 0) { if (errno != EEXIST) { status = -1; break; } } else { char *parent = strdup(copypath); char *last_slash = strrchr(parent, '/'); if (last_slash) { *last_slash = '\0'; if (stat(parent, &st) == 0) { if (chown(copypath, st.st_uid, st.st_gid) == -1) { perror("Error setting directory ownership"); } } } free(parent); } } *sp = '/'; } pp = sp + 1; } if (status == 0) { char *parent = strdup(full_path); char *last_slash = strrchr(parent, '/'); if (last_slash) { *last_slash = '\0'; if (stat(parent, &st) == 0) { fp = fopen(full_path, "w"); if (file_created != NULL) *file_created = true; if (chmod(full_path, directory_mode) == -1) { perror("Error setting file permissions"); } if (chown(full_path, st.st_uid, st.st_gid) == -1) { perror("Error setting directory ownership"); } } } free(parent); } free(copypath); } else if (file_created != NULL) { *file_created = false; } return fp; } char* get_xdg_file_path_for_app(const char *app_name, const char *filename, const char *xdg_env_var, const char *xdg_fallback_dir) { struct stat st = {0}; char* base_directory = getenv(xdg_env_var); if (base_directory == NULL) { char* home = getenv("HOME"); base_directory = (char*)concat(home, xdg_fallback_dir); } int path_length = strlen(base_directory) + strlen(app_name) + strlen(filename) + 3; char *full_path = (char*)malloc(path_length * sizeof(char)); snprintf(full_path, path_length, "%s/%s/%s", base_directory, app_name, filename); return full_path; } char* get_xdg_file_path(const char *filename, const char *xdg_env_var, const char *xdg_fallback_dir) { return get_xdg_file_path_for_app(XR_DRIVER_DIR, filename, xdg_env_var, xdg_fallback_dir); } char* get_state_file_path(const char *filename) { return get_xdg_file_path(filename, XDG_STATE_ENV_VAR, XDG_STATE_FALLBACK_DIR); } char* get_runtime_file_path(const char *filename) { return get_xdg_file_path(filename, XDG_RUNTIME_ENV_VAR, XDG_RUNTIME_FALLBACK_DIR); } char* get_config_file_path(const char *filename) { return get_xdg_file_path(filename, XDG_CONFIG_ENV_VAR, XDG_CONFIG_FALLBACK_DIR); } FILE* get_or_create_state_file(const char *filename, const char *mode, char **full_path, bool *created) { *full_path = get_state_file_path(filename); return get_or_create_file(*full_path, 0777, mode, created); } FILE* get_or_create_runtime_file(const char *filename, const char *mode, char **full_path, bool *created) { *full_path = get_runtime_file_path(filename); return get_or_create_file(*full_path, 0700, mode, created); } FILE* get_or_create_config_file(const char *filename, const char *mode, char **full_path, bool *created) { *full_path = get_config_file_path(filename); return get_or_create_file(*full_path, 0777, mode, created); } ================================================ FILE: src/imu.c ================================================ #include "imu.h" #include #include const float pose_orientation_reset_data[16] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }; const float pose_position_reset_data[3] = { 0.0, 0.0, 0.0 }; float degree_to_radian(float deg) { return deg * M_PI / 180.0f; } float radian_to_degree(float rad) { return rad * 180.0f / M_PI; } imu_quat_type normalize_quaternion(imu_quat_type q) { float magnitude = sqrtf(q.w*q.w + q.x*q.x + q.y*q.y + q.z*q.z); if (!isfinite(magnitude) || magnitude <= 0.0f) { imu_quat_type identity = { .w = 1.0f, .x = 0.0f, .y = 0.0f, .z = 0.0f }; return identity; } q.w /= magnitude; q.x /= magnitude; q.y /= magnitude; q.z /= magnitude; return q; } imu_quat_type conjugate(imu_quat_type q) { imu_quat_type q_conj = { .w = q.w, .x = -q.x, .y = -q.y, .z = -q.z }; return q_conj; } imu_quat_type multiply_quaternions(imu_quat_type q1, imu_quat_type q2) { imu_quat_type q = { .w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z, .x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y, .y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x, .z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w }; return normalize_quaternion(q); } imu_quat_type euler_to_quaternion_xyz(imu_euler_type euler) { // Convert degrees to radians float roll = degree_to_radian(euler.roll); float pitch = degree_to_radian(euler.pitch); float yaw = degree_to_radian(euler.yaw); // Compute the half angles float cx = cos(roll * 0.5f); float cy = cos(pitch * 0.5f); float cz = cos(yaw * 0.5f); float sx = sin(roll * 0.5f); float sy = sin(pitch * 0.5f); float sz = sin(yaw * 0.5f); // Compute the quaternion components imu_quat_type q = { .x = sx * cy * cz + cx * sy * sz, .y = cx * sy * cz - sx * cy * sz, .z = cx * cy * sz + sx * sy * cz, .w = cx * cy * cz - sx * sy * sz }; return normalize_quaternion(q); } imu_quat_type euler_to_quaternion_zyx(imu_euler_type euler) { // Convert degrees to radians float roll = degree_to_radian(euler.roll); float pitch = degree_to_radian(euler.pitch); float yaw = degree_to_radian(euler.yaw); // Compute the half angles float cx = cos(roll * 0.5f); float cy = cos(pitch * 0.5f); float cz = cos(yaw * 0.5f); float sx = sin(roll * 0.5f); float sy = sin(pitch * 0.5f); float sz = sin(yaw * 0.5f); // Compute the quaternion components imu_quat_type q = { .x = sx * cy * cz - cx * sy * sz, .y = cx * sy * cz + sx * cy * sz, .z = cx * cy * sz - sx * sy * cz, .w = cx * cy * cz + sx * sy * sz }; return normalize_quaternion(q); } imu_quat_type euler_to_quaternion_zxy(imu_euler_type euler) { // Convert degrees to radians float roll = degree_to_radian(euler.roll); float pitch = degree_to_radian(euler.pitch); float yaw = degree_to_radian(euler.yaw); // Compute the half angles float cx = cos(roll * 0.5f); float cy = cos(pitch * 0.5f); float cz = cos(yaw * 0.5f); float sx = sin(roll * 0.5f); float sy = sin(pitch * 0.5f); float sz = sin(yaw * 0.5f); // Compute the quaternion components imu_quat_type q = { .x = sx * cy * cz - cx * sy * sz, .y = cx * sy * cz + sx * cy * sz, .z = cx * cy * sz + sx * sy * cz, .w = cx * cy * cz - sx * sy * sz }; return normalize_quaternion(q); } imu_euler_type quaternion_to_euler_xyz(imu_quat_type q) { imu_euler_type euler; // Calculate roll (x-axis rotation) float sinr_cosp = 2.0f * (q.w * q.x + q.y * q.z); float cosr_cosp = 1.0f - 2.0f * (q.x * q.x + q.y * q.y); euler.roll = radian_to_degree(atan2f(sinr_cosp, cosr_cosp)); // Calculate pitch (y-axis rotation) float sinp = 2.0f * (q.w * q.y - q.z * q.x); if (fabsf(sinp) >= 1.0f) { // Use 90 degrees if out of range euler.pitch = radian_to_degree(copysignf(M_PI / 2.0f, sinp)); } else { euler.pitch = radian_to_degree(asinf(sinp)); } // Calculate yaw (z-axis rotation) float siny_cosp = 2.0f * (q.w * q.z + q.x * q.y); float cosy_cosp = 1.0f - 2.0f * (q.y * q.y + q.z * q.z); euler.yaw = radian_to_degree(atan2f(siny_cosp, cosy_cosp)); return euler; } imu_euler_type quaternion_to_euler_zyx(imu_quat_type q) { imu_euler_type euler; // Calculate pitch (y-axis rotation) float sinp = 2.0f * (q.w * q.y - q.z * q.x); if (fabsf(sinp) >= 1.0f) { // Use 90 degrees if out of range euler.pitch = radian_to_degree(copysignf(M_PI / 2.0f, sinp)); // Gimbal lock case // In the gimbal lock case with pitch at +/-90 degrees, // yaw and roll rotate around the same axis // We can choose any convention; here we set roll to 0 // and calculate yaw euler.roll = 0.0f; float siny = 2.0f * (q.w * q.z + q.x * q.y); float cosy = 2.0f * (q.w * q.x - q.y * q.z); euler.yaw = radian_to_degree(atan2f(siny, cosy)); } else { // Normal case euler.pitch = radian_to_degree(asinf(sinp)); // Calculate yaw (z-axis rotation) float siny_cosp = 2.0f * (q.w * q.z + q.x * q.y); float cosy_cosp = 1.0f - 2.0f * (q.y * q.y + q.z * q.z); euler.yaw = radian_to_degree(atan2f(siny_cosp, cosy_cosp)); // Calculate roll (x-axis rotation) float sinr_cosp = 2.0f * (q.w * q.x + q.y * q.z); float cosr_cosp = 1.0f - 2.0f * (q.x * q.x + q.y * q.y); euler.roll = radian_to_degree(atan2f(sinr_cosp, cosr_cosp)); } return euler; } imu_euler_type quaternion_to_euler_zxy(imu_quat_type q) { imu_euler_type euler; // Calculate roll (x-axis rotation) float sinr = 2.0f * (q.w * q.x + q.y * q.z); float cosr = 1.0f - 2.0f * (q.x * q.x + q.z * q.z); euler.roll = radian_to_degree(atan2f(sinr, cosr)); // Calculate pitch (y-axis rotation) float sinp = 2.0f * (q.w * q.y - q.x * q.z); if (fabsf(sinp) >= 1.0f) { // Use 90 degrees if out of range euler.pitch = radian_to_degree(copysignf(M_PI / 2.0f, sinp)); } else { euler.pitch = radian_to_degree(asinf(sinp)); } // Calculate yaw (z-axis rotation) float siny = 2.0f * (q.w * q.z + q.x * q.y); float cosy = 1.0f - 2.0f * (q.y * q.y + q.z * q.z); euler.yaw = radian_to_degree(atan2f(siny, cosy)); return euler; } imu_quat_type device_pitch_adjustment(float adjustment_degrees) { float half = degree_to_radian(adjustment_degrees) * 0.5f; imu_quat_type q = { .w = cosf(half), .x = 0.0f, .y = sinf(half), .z = 0.0f }; return q; } bool quat_equal(imu_quat_type q1, imu_quat_type q2) { return q1.w == q2.w && q1.x == q2.x && q1.y == q2.y && q1.z == q2.z; } imu_vec3_type vector_rotate(imu_vec3_type v, imu_quat_type q) { q = normalize_quaternion(q); float w = q.w; float qx = q.x, qy = q.y, qz = q.z; float tx = 2.0f * (qy * v.z - qz * v.y); float ty = 2.0f * (qz * v.x - qx * v.z); float tz = 2.0f * (qx * v.y - qy * v.x); imu_vec3_type out; out.x = v.x + w * tx + (qy * tz - qz * ty); out.y = v.y + w * ty + (qz * tx - qx * tz); out.z = v.z + w * tz + (qx * ty - qy * tx); return out; } float quat_small_angle_rad(imu_quat_type q1, imu_quat_type q2) { imu_quat_type q_rel = multiply_quaternions(conjugate(q1), q2); float v_norm = sqrtf(q_rel.x * q_rel.x + q_rel.y * q_rel.y + q_rel.z * q_rel.z); float w_abs = fabsf(q_rel.w); return 2.0f * atan2f(v_norm, w_abs); } ================================================ FILE: src/ipc.c ================================================ #include "ipc.h" #include "logging.h" #include #include #include #include #include #include #include #include #include #include #include #include #include const char *sombrero_ipc_file_prefix = "/tmp/shader_runtime_"; const char *display_res_ipc_name = "display_resolution"; const char *disabled_ipc_name = "disabled"; const char *date_ipc_name = "keepalive_date"; const char *pose_orientation_ipc_name = "pose_orientation"; const char *pose_orientation_mutex_ipc_name = "pose_orientation_mutex"; const char *pose_position_ipc_name = "pose_position"; // deprecated - can be removed once this version is widely distributed const char *display_fov_ipc_name = "display_fov"; const char *lens_distance_ratio_ipc_name = "lens_distance_ratio"; bool setup_ipc_values(ipc_values_type *ipc_values, bool debug) { setup_ipc_value(display_res_ipc_name, (void**) &ipc_values->display_res, sizeof(float) * 2, debug); setup_ipc_value(disabled_ipc_name, (void**) &ipc_values->disabled, sizeof(bool), debug); setup_ipc_value(date_ipc_name, (void**) &ipc_values->date, sizeof(float) * 4, debug); setup_ipc_value(pose_orientation_ipc_name, (void**) &ipc_values->pose_orientation, sizeof(float) * 16, debug); setup_ipc_value(pose_position_ipc_name, (void**) &ipc_values->pose_position, sizeof(float) * 3, debug); setup_ipc_value(display_fov_ipc_name, (void**) &ipc_values->display_fov, sizeof(float), debug); setup_ipc_value(lens_distance_ratio_ipc_name, (void**) &ipc_values->lens_distance_ratio, sizeof(float), debug); // attempt to destroy the mutex if it already existed from a previous run setup_ipc_value(pose_orientation_mutex_ipc_name, (void**) &ipc_values->pose_orientation_mutex, sizeof(pthread_mutex_t), debug); int ret = pthread_mutex_destroy(ipc_values->pose_orientation_mutex); if (ret != 0) { perror("pthread_mutex_destroy"); if (ret != EINVAL) return false; } pthread_mutexattr_t attr; if (pthread_mutexattr_init(&attr) != 0) { perror("pthread_mutexattr_init"); return false; } if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) { perror("pthread_mutexattr_setpshared"); return false; } if (pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST) != 0) { perror("pthread_mutexattr_setrobust"); return false; } if (pthread_mutex_init(ipc_values->pose_orientation_mutex, &attr) != 0) { perror("pthread_mutex_init"); return false; } return true; } void setup_ipc_value(const char *name, void **shmemValue, size_t size, bool debug) { char *path = malloc(strlen(sombrero_ipc_file_prefix) + strlen(name) + 1); strcpy(path, sombrero_ipc_file_prefix); strcat(path, name); mode_t old_umask = umask(0); int fd = open(path, O_CREAT, 0666); if (fd == -1) { log_error("Could not create IPC shared file\n"); exit(1); } close(fd); umask(old_umask); key_t key = ftok(path, 0); if (debug) log_debug("ipc_key, got key %d for path %s\n", key, path); free(path); int shmid = shmget(key, size, 0666|IPC_CREAT); if (shmid == -1) { // it may have been allocated using a different size, attempt to find and delete it shmid = shmget(key, 0, 0); if (shmid != -1) { if (debug) log_debug("ipc_key, deleting shared memory segment with key %d\n", key); shmctl(shmid, IPC_RMID, NULL); } else { if (debug) log_debug("ipc_key, couldn't delete, no shmid for key %d\n", key); } } if (shmid != -1) { *shmemValue = shmat(shmid,(void*)0,0); if (*shmemValue == (void *) -1) { log_error("Error calling shmat\n"); exit(1); } } else { log_error("Error calling shmget\n"); exit(1); } } void cleanup_ipc(char* file_prefix, bool debug) { if (debug) log_debug("cleanup_ipc, disabling IPC\n"); char pattern[256]; snprintf(pattern, sizeof(pattern), "%s*", file_prefix); glob_t glob_result; glob(pattern, GLOB_TILDE, NULL, &glob_result); for(unsigned int i=0; i #include #include #include #include void log_init() { // ensure the log file exists, reroute stdout and stderr there char *log_file_path = NULL; FILE *log_file = get_or_create_state_file("driver.log", NULL, &log_file_path, NULL); fclose(log_file); freopen(log_file_path, "a", stdout); freopen(log_file_path, "a", stderr); free_and_clear(&log_file_path); // when redirecting stdout/stderr to a file, it becomes fully buffered, requiring lots of manual flushing of the // stream, this makes them unbuffered, which is fine since we log so little setbuf(stdout, NULL); setbuf(stderr, NULL); log_message("Project version: %s\n", PROJECT_VERSION); } static void do_log(const char* prefix, const char* format, va_list args) { struct timeval tv; gettimeofday(&tv, NULL); struct tm *tm = localtime(&tv.tv_sec); printf("%04d-%02d-%02d %02d:%02d:%02d.%03d %s", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 1000), prefix); vprintf(format, args); } void log_message(const char* format, ...) { va_list args; va_start(args, format); do_log("", format, args); va_end(args); } void log_error(const char* format, ...) { va_list args; va_start(args, format); do_log("[ERROR] ", format, args); va_end(args); } void log_debug(const char* format, ...) { va_list args; va_start(args, format); do_log("[DEBUG] ", format, args); va_end(args); } ================================================ FILE: src/multitap.c ================================================ #include "imu.h" #include "buffer.h" #include "logging.h" #include #include #include #include #include #define MT_BUFFER_MS 25 #define MT_STATE_IDLE 0 #define MT_STATE_RISE 1 #define MT_STATE_FALL 2 #define MT_STATE_PAUSE 3 int mt_buffer_size; int imu_cycles_per_s; buffer_type *mt_buffer = NULL; int mt_state = MT_STATE_IDLE; const float mt_detect_threshold = 2000.0; const float mt_pause_threshold = 100.0; uint64_t tap_start_time = 0; uint64_t pause_start_time = 0; uint64_t last_logged_peak_time = 0; const int max_tap_period_ms = 750; // longest time-frame to allow between tap starts/rises const int max_tap_duration_ms = 70; // a single tap should be very quick, ignore long accelerations const int min_pause_ms = 10; // must detect a pause (~0 acceleration) between taps float peak_max = 0.0; int tap_count = 0; float accel_adjust_constant; void init_multi_tap(int init_imu_cycles_per_s) { imu_cycles_per_s = init_imu_cycles_per_s; float desired_buffer_size = (float)MT_BUFFER_MS / 1000.0 * imu_cycles_per_s; mt_buffer_size = floor(desired_buffer_size); // this is the ratio based on how much we had to round accel_adjust_constant = (float)mt_buffer_size/desired_buffer_size; if (mt_buffer) { free(mt_buffer); mt_buffer = NULL; } mt_buffer = create_buffer(mt_buffer_size); } // returns the number of taps observed int detect_multi_tap(imu_euler_type velocities, uint32_t timestamp, bool debug) { if (mt_buffer) { // the oldest value is zero/unset if the buffer hasn't been filled yet, so we check prior to doing a // push/pop, to know if the value returned will be relevant to our calculations bool was_full = is_full(mt_buffer); float next_value = sqrt(velocities.roll * velocities.roll + velocities.pitch * velocities.pitch + velocities.yaw * velocities.yaw); float oldest_value = push(mt_buffer, next_value); if (was_full) { // extrapolate out to seconds, so the threshold can stay the same regardless of buffer size float acceleration = (next_value - oldest_value) * (float)imu_cycles_per_s / mt_buffer_size * accel_adjust_constant; int tap_elapsed_ms = timestamp - tap_start_time; if ((tap_count > 0 || mt_state != MT_STATE_IDLE) && tap_elapsed_ms > max_tap_period_ms) { peak_max = 0.0; mt_state = MT_STATE_IDLE; int final_tap_count = tap_count; tap_count = 0; if (final_tap_count > 0 && debug) log_debug("detected multi-tap of %d\n", final_tap_count); return final_tap_count; } else { switch(mt_state) { case MT_STATE_IDLE: { if (acceleration > mt_detect_threshold) { tap_start_time = timestamp; peak_max = 0.0; mt_state = MT_STATE_RISE; if (debug) log_debug("tap-rise detected %f\n", acceleration); } else { if (debug) { if (acceleration > peak_max) peak_max = acceleration; if ((timestamp - last_logged_peak_time) > 1000) { log_debug("no-tap detected, peak was %f\n", peak_max); peak_max = 0.0; last_logged_peak_time = timestamp; } } } break; } case MT_STATE_RISE: { if (acceleration < 0) // accelerating in the opposite direction mt_state = MT_STATE_FALL; break; } case MT_STATE_FALL: { if (acceleration > 0) { // acceleration switches back, stopping the fall if (tap_elapsed_ms > max_tap_duration_ms) { if (debug) log_debug("rise and fall took %d, too long for a tap\n", tap_elapsed_ms); peak_max = 0.0; mt_state = MT_STATE_IDLE; tap_count == 0; } else { if (debug) log_debug("rise and fall took %d\n", tap_elapsed_ms); tap_count++; pause_start_time = timestamp; mt_state = MT_STATE_PAUSE; } } break; } case MT_STATE_PAUSE: { if (fabs(acceleration) < mt_pause_threshold) { int pause_elapsed_ms = timestamp - pause_start_time; if (pause_elapsed_ms > min_pause_ms) // paused long enough, wrap back around to idle where we can detect the next rise mt_state = MT_STATE_IDLE; } else { // not idle, reset pause state timer pause_start_time = timestamp; } } } } } } return 0; } ================================================ FILE: src/outputs.c ================================================ #include "buffer.h" #include "config.h" #include "devices.h" #include "imu.h" #include "files.h" #include "ipc.h" #include "logging.h" #include "memory.h" #include "outputs.h" #include "plugins.h" #include "plugins/gamescope_reshade_wayland.h" #include "runtime_context.h" #include "strings.h" #include "epoch.h" #include #include #include #include #include #include #include #include #include #include #define MS_PER_SEC 1000 #define IMU_CHECKPOINT_MS MS_PER_SEC / 4 imu_buffer_type *imu_buffer; static int last_imu_checkpoint_ms = 0; static imu_quat_type last_imu_checkpoint_quat = {.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f}; static uint64_t last_healthy_imu_timestamp_ms = 0; // Cached perceptual threshold for when tiny orientation changes become effectively invisible. // Reset on output deinit/reinit. static float dead_zone_cached_device_visible_angle_rad = -1.0f; static float dead_zone_cached_threshold_visible_angle_rad = -1.0f; static pthread_mutex_t outputs_mutex = PTHREAD_MUTEX_INITIALIZER; struct libevdev* evdev; struct libevdev_uinput* uinput; int joystick_debug_imu_cycles; int prev_joystick_x = 0; int prev_joystick_y = 0; const int max_input = 1 << 16; const int mid_input = 0; const int min_input = -max_input; float joystick_max_degrees_per_s; static float clampf(float v, float lo, float hi) { if (v < lo) return lo; if (v > hi) return hi; return v; } static imu_quat_type quat_slerp(imu_quat_type a, imu_quat_type b, float t) { t = clampf(t, 0.0f, 1.0f); float dot = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; if (dot < 0.0f) { dot = -dot; b.x = -b.x; b.y = -b.y; b.z = -b.z; b.w = -b.w; } // When the quaternions are very close, fall back to lerp to avoid numeric issues. if (dot > 0.9995f) { imu_quat_type out = { .x = a.x + (b.x - a.x) * t, .y = a.y + (b.y - a.y) * t, .z = a.z + (b.z - a.z) * t, .w = a.w + (b.w - a.w) * t, }; float len = sqrtf(out.x * out.x + out.y * out.y + out.z * out.z + out.w * out.w); if (len > 0.0f) { out.x /= len; out.y /= len; out.z /= len; out.w /= len; } return out; } dot = clampf(dot, -1.0f, 1.0f); float theta_0 = acosf(dot); float sin_theta_0 = sinf(theta_0); if (sin_theta_0 <= 0.0f) { return b; } float theta = theta_0 * t; float sin_theta = sinf(theta); float s0 = cosf(theta) - dot * sin_theta / sin_theta_0; float s1 = sin_theta / sin_theta_0; imu_quat_type out = { .x = (s0 * a.x) + (s1 * b.x), .y = (s0 * a.y) + (s1 * b.y), .z = (s0 * a.z) + (s1 * b.z), .w = (s0 * a.w) + (s1 * b.w), }; float len = sqrtf(out.x * out.x + out.y * out.y + out.z * out.z + out.w * out.w); if (len > 0.0f) { out.x /= len; out.y /= len; out.z /= len; out.w /= len; } return out; } static float dead_zone_exponential_curve(float ratio01) { // Exponential curve with very low values near 0 and a smooth rise towards 1. // ratio01 is expected in [0, 1]. const float k = 8.0f; ratio01 = clampf(ratio01, 0.0f, 1.0f); float e0 = expf(-k); float e = expf(k * (ratio01 - 1.0f)); return (e - e0) / (1.0f - e0); } static float dead_zone_slerp_alpha(float angle_rad, float threshold_rad, int imu_cycles_per_s) { float ratio = clampf(angle_rad / threshold_rad, 0.0f, 1.0f); float curve = dead_zone_exponential_curve(ratio); // Floor the alpha so extremely small deltas still converge over a few seconds. // Using a time constant keeps behavior stable across different IMU rates. const float tau_slow_s = 5.0f; float dt_s = 1.0f / (float)imu_cycles_per_s; float alpha_min = 1.0f - expf(-dt_s / tau_slow_s); float alpha = alpha_min + curve * (1.0f - alpha_min); return clampf(alpha, 0.0f, 1.0f); } static float dead_zone_min_visible_angle_rad(const device_properties_type* device) { if (!device) return -1.0f; // Convert the device's diagonal FOV into horizontal/vertical FOV using the display aspect ratio. float aspect = (float)device->resolution_w / (float)device->resolution_h; float diag_to_vert_ratio = sqrtf((aspect * aspect) + 1.0f); float fov_v_rad = degree_to_radian(device->fov / diag_to_vert_ratio); float fov_h_rad = fov_v_rad * aspect; // Conservative: use the smaller angular size-per-pixel so that being sub-pixel in either axis is treated as invisible. float rad_per_px_h = fov_h_rad / (float)device->resolution_w; float rad_per_px_v = fov_v_rad / (float)device->resolution_h; float rad_per_px = fminf(rad_per_px_h, rad_per_px_v); if (!isfinite(rad_per_px) || rad_per_px <= 0.0f) return 0.0f; return rad_per_px; } // Given a desired angle change, find what initial angle would produce it static float inverse_angle_for_change(float desired_change_rad, float threshold_rad, int imu_cycles_per_s) { if (desired_change_rad <= 0.0f) { return 0.0f; } // Use bisection search float angle_low = 0.0f; float angle_high = fmaxf(threshold_rad * 2.0f, desired_change_rad * 2.0f); const int max_iterations = 20; const float tolerance = 1e-6f; for (int i = 0; i < max_iterations; i++) { float angle_mid = (angle_low + angle_high) * 0.5f; // Compute what change this angle would produce float alpha = dead_zone_slerp_alpha(angle_mid, threshold_rad, imu_cycles_per_s); float cos_theta = cosf(angle_mid); float theta_new = acosf(cos_theta + alpha * (1.0f - cos_theta)); float actual_change = angle_mid - theta_new; if (fabsf(actual_change - desired_change_rad) < tolerance) { return angle_mid; } if (actual_change < desired_change_rad) { angle_low = angle_mid; } else { angle_high = angle_mid; } } return (angle_low + angle_high) * 0.5f; } static int evdev_check(char * function, int i) { if (i < 0) { log_message("libevdev.%s: %s\n", function, strerror(-i)); exit(1); } return i; } // returns an integer between -max_input and max_input, the magnitude of which is just the ratio of // input_velocity to max_input_velocity (where velocity is degrees/sec) int joystick_value(float input_velocity, float max_input_velocity) { int value = round(input_velocity * max_input / max_input_velocity); if (value < min_input) { return min_input; } else if (value > max_input) { return max_input; } return value; } #define JOYSTICK_DEBUG_LINES 17 #define JOYSTICK_DEBUG_LINES_MIDDLE 8 // zero-indexed from 17 total lines // converts a value in the joystick min/max range to a value in the file row/col range int joystick_debug_val_to_line(int value) { int joystick_middle = (max_input + min_input) / 2; int value_from_middle = value - joystick_middle; float value_percent_of_total = (float)value_from_middle / (max_input - min_input); int line_value_from_middle = value_percent_of_total < 0 ? ceil(value_percent_of_total * JOYSTICK_DEBUG_LINES) : floor(value_percent_of_total * JOYSTICK_DEBUG_LINES); return JOYSTICK_DEBUG_LINES_MIDDLE + line_value_from_middle; } // write a character to a coordinate -- as a grid of characters -- in a file void write_character_to_joystick_debug_file(FILE *fp, int col, int row, char new_char) { if (row < 0 || row >= JOYSTICK_DEBUG_LINES || col < 0 || col >= JOYSTICK_DEBUG_LINES) { log_error("joystick_debug: invalid row or column index: %d %d\n", row, col); } else { for (int i = 0; i < row; i++) { for (int j = 0; j < JOYSTICK_DEBUG_LINES; j++) { fgetc(fp); } char c = fgetc(fp); if (c != '\n') { return; } } for (int j = 0; j <= col; j++) { fgetc(fp); } fseek(fp, -1, SEEK_CUR); fputc(new_char, fp); } } // debug visual joystick from bash: watch -n 0.1 cat $XDG_RUNTIME_DIR/xr_driver/joystick_debug void joystick_debug(int old_joystick_x, int old_joystick_y, int new_joystick_x, int new_joystick_y) { int old_x = joystick_debug_val_to_line(old_joystick_x); int old_y = joystick_debug_val_to_line(old_joystick_y); int new_x = joystick_debug_val_to_line(new_joystick_x); int new_y = joystick_debug_val_to_line(new_joystick_y); if (old_x != new_x || old_y != new_y) { char *full_path = NULL; bool file_created = false; FILE *fp = get_or_create_runtime_file("joystick_debug", "r+", &full_path, &file_created); if (file_created) { for (int i = 0; i < JOYSTICK_DEBUG_LINES; i++) { for (int j = 0; j < JOYSTICK_DEBUG_LINES; j++) { char grid_char = ' '; if (i == JOYSTICK_DEBUG_LINES_MIDDLE && j == JOYSTICK_DEBUG_LINES_MIDDLE) grid_char = 'X'; fputc(grid_char, fp); } fputc('\n', fp); } fclose(fp); fp = fopen(full_path, "r+"); } free_and_clear(&full_path); if (fp == NULL) { return; } char reset_char = ' '; if (old_x == JOYSTICK_DEBUG_LINES_MIDDLE && old_y == JOYSTICK_DEBUG_LINES_MIDDLE) reset_char = 'X'; write_character_to_joystick_debug_file(fp, old_x, old_y, reset_char); rewind(fp); write_character_to_joystick_debug_file(fp, new_x, new_y, 'O'); fclose(fp); } } // Starting from degree 0, 180 and -180 are the same. If the previous value was 179 and the new value is -179, // the diff is 2 (-179 is equivalent to 181). This function takes the diff and then adjusts it if it detects // that we've crossed the +/-180 threshold. float degree_delta(float prev, float next) { float delta = fmod(next - prev, 360); if (delta > 180) { return delta - 360; } else if (delta < -180) { return delta + 360; } return delta; } imu_euler_type get_euler_velocities(imu_euler_type* previous, imu_euler_type current, int imu_cycles_per_sec) { imu_euler_type velocities = { .roll=degree_delta(previous->roll, current.roll) * imu_cycles_per_sec, .pitch=degree_delta(previous->pitch, current.pitch) * imu_cycles_per_sec, .yaw=degree_delta(previous->yaw, current.yaw) * imu_cycles_per_sec }; *previous = current; return velocities; } static void _init_outputs() { device_properties_type* device = device_checkout(); joystick_debug_imu_cycles = device == NULL ? 6 : ceil(100.0 * device->imu_cycles_per_s / 1000.0); // update joystick debug file roughly every 100 ms joystick_max_degrees_per_s = 360.0 / 4; float joystick_max_radians_per_s = joystick_max_degrees_per_s * M_PI / 180.0; dead_zone_cached_device_visible_angle_rad = device ? dead_zone_min_visible_angle_rad(device) : -1.0f; if (dead_zone_cached_device_visible_angle_rad > 0.0f && isfinite(dead_zone_cached_device_visible_angle_rad)) { if (config()->debug_device) log_debug("dead_zone device visible angle: %.9f rad\n", dead_zone_cached_device_visible_angle_rad); } dead_zone_cached_threshold_visible_angle_rad = -1.0f; device_checkin(device); evdev = libevdev_new(); if (config()->joystick_mode) { struct input_absinfo absinfo; absinfo.minimum = min_input; absinfo.maximum = max_input; absinfo.resolution = max_input / joystick_max_radians_per_s; absinfo.value = mid_input; absinfo.flat = 2; absinfo.fuzz = 0; evdev_check("libevdev_enable_property", libevdev_enable_property(evdev, INPUT_PROP_BUTTONPAD)); libevdev_set_name(evdev, "XR virtual joystick"); evdev_check("libevdev_enable_event_type", libevdev_enable_event_type(evdev, EV_ABS)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_X, &absinfo)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_Y, &absinfo)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_Z, &absinfo)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_RX, &absinfo)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_RY, &absinfo)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_ABS, ABS_RZ, &absinfo)); /* do not remove next 3 lines or udev scripts won't assign 0664 permissions -sh */ evdev_check("libevdev_enable_event_type", libevdev_enable_event_type(evdev, EV_KEY)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_JOYSTICK, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_TRIGGER, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_A, NULL)); } else if (config()->mouse_mode) { libevdev_set_name(evdev, "XR virtual mouse"); evdev_check("libevdev_enable_event_type", libevdev_enable_event_type(evdev, EV_REL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_REL, REL_X, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_REL, REL_Y, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_REL, REL_WHEEL, NULL)); evdev_check("libevdev_enable_event_type", libevdev_enable_event_type(evdev, EV_KEY)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_LEFT, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_MIDDLE, NULL)); evdev_check("libevdev_enable_event_code", libevdev_enable_event_code(evdev, EV_KEY, BTN_RIGHT, NULL)); } if (config()->mouse_mode || config()->joystick_mode) evdev_check("libevdev_uinput_create_from_device", libevdev_uinput_create_from_device(evdev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uinput)); } static void _deinit_outputs() { last_imu_checkpoint_ms = 0; dead_zone_cached_device_visible_angle_rad = -1.0f; dead_zone_cached_threshold_visible_angle_rad = -1.0f; if (uinput) { libevdev_uinput_destroy(uinput); uinput = NULL; } if (evdev) { libevdev_free(evdev); evdev = NULL; } } void init_outputs() { pthread_mutex_lock(&outputs_mutex); _init_outputs(); pthread_mutex_unlock(&outputs_mutex); } void deinit_outputs() { pthread_mutex_lock(&outputs_mutex); _deinit_outputs(); pthread_mutex_unlock(&outputs_mutex); } void reinit_outputs() { pthread_mutex_lock(&outputs_mutex); _deinit_outputs(); _init_outputs(); pthread_mutex_unlock(&outputs_mutex); } #define WAIT_FOR_IMU_ATTEMPTS 5 bool wait_for_imu_start() { int attempts = 0; while (!is_imu_alive()) { if (attempts++ == WAIT_FOR_IMU_ATTEMPTS) return false; sleep(1); } return true; } void handle_imu_update(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values) { // counter that resets every second, for triggering things that we don't want to do every cycle static int imu_counter = 0; // periodically run checks to keep an eye on the health of the IMU if (pose.timestamp_ms - last_imu_checkpoint_ms > IMU_CHECKPOINT_MS) { last_imu_checkpoint_ms = pose.timestamp_ms; // in practice, no two quats will be exactly equal even if the glasses are stationary if (!quat_equal(pose.orientation, last_imu_checkpoint_quat)) { last_healthy_imu_timestamp_ms = get_epoch_time_ms(); last_imu_checkpoint_quat = pose.orientation; } else if (config()->debug_device) { log_debug("handle_imu_update, device failed health check\n"); } } device_properties_type* device = device_checkout(); if (device != NULL) { pthread_mutex_lock(&outputs_mutex); if (ipc_values) { // send keepalive every counter period if (imu_counter == 0) { time_t now = time(NULL); struct tm *t = localtime(&now); // match the float4 date uniform type definition ipc_values->date[0] = (float)(t->tm_year + 1900); ipc_values->date[1] = (float)(t->tm_mon + 1); ipc_values->date[2] = (float)t->tm_mday; ipc_values->date[3] = (float)(t->tm_hour * 3600 + t->tm_min * 60 + t->tm_sec); set_skippable_gamescope_reshade_effect_uniform_variable("keepalive_date", ipc_values->date, 4, sizeof(float), true); } if (imu_calibrated) { if (imu_buffer != NULL && imu_buffer_size(imu_buffer) != device->imu_buffer_size) { free_imu_buffer(imu_buffer); imu_buffer = NULL; } if (imu_buffer == NULL) { imu_buffer = create_imu_buffer(device->imu_buffer_size); if (imu_buffer == NULL) { log_error("Error allocating memory\n"); exit(1); } } imu_buffer_response_type *response = push_to_imu_buffer(imu_buffer, pose.orientation, (float)pose.timestamp_ms); if (response && response->ready) { // Deadzone smoothing: below the configured threshold, slerp towards the new quat. // The closer the angle is to the threshold, the more aggressively we slerp (exponential curve). // Past the threshold, we effectively "snap" (copy) to preserve responsiveness. static bool dead_zone_initialized = false; static imu_quat_type dead_zone_quat = {0}; static float dead_zone_threshold_deg = 0.0f; static float dead_zone_threshold_rad = 0.0f; if (config()->dead_zone_threshold_deg != dead_zone_threshold_deg) { dead_zone_threshold_deg = config()->dead_zone_threshold_deg; dead_zone_threshold_rad = degree_to_radian(dead_zone_threshold_deg); dead_zone_initialized = false; dead_zone_cached_threshold_visible_angle_rad = -1.0f; } if (dead_zone_threshold_deg > 0.0f) { if (dead_zone_cached_threshold_visible_angle_rad < 0.0f && dead_zone_cached_device_visible_angle_rad > 0.0f) { // this is the minimum angle needed to produce a visible change when factoring in the lerp logic, // anything smaller than this should just be ignored dead_zone_cached_threshold_visible_angle_rad = inverse_angle_for_change( dead_zone_cached_device_visible_angle_rad, dead_zone_threshold_rad, device->imu_cycles_per_s ); if (dead_zone_cached_threshold_visible_angle_rad > 0.0f && isfinite(dead_zone_cached_threshold_visible_angle_rad)) { if (config()->debug_device) log_debug("dead_zone threshold visible angle: %.9f rad\n", dead_zone_cached_threshold_visible_angle_rad); } } imu_quat_type current_quat = { .x = response->data[0], .y = response->data[1], .z = response->data[2], .w = response->data[3], }; if (!dead_zone_initialized) { dead_zone_initialized = true; dead_zone_quat = current_quat; } else { float angle_rad = quat_small_angle_rad(dead_zone_quat, current_quat); if (angle_rad >= dead_zone_threshold_rad) { dead_zone_quat = current_quat; } else { if (dead_zone_cached_threshold_visible_angle_rad < 0.0f || angle_rad >= dead_zone_cached_threshold_visible_angle_rad) { float alpha = dead_zone_slerp_alpha(angle_rad, dead_zone_threshold_rad, device->imu_cycles_per_s); if (!isfinite(alpha) || alpha <= 0.0f) { dead_zone_quat = current_quat; } else { dead_zone_quat = quat_slerp(dead_zone_quat, current_quat, alpha); } } } } // Overwrite quaternions with smoothed orientation (timestamps left unchanged). response->data[0] = dead_zone_quat.x; response->data[1] = dead_zone_quat.y; response->data[2] = dead_zone_quat.z; response->data[3] = dead_zone_quat.w; response->data[4] = dead_zone_quat.x; response->data[5] = dead_zone_quat.y; response->data[6] = dead_zone_quat.z; response->data[7] = dead_zone_quat.w; response->data[8] = dead_zone_quat.x; response->data[9] = dead_zone_quat.y; response->data[10] = dead_zone_quat.z; response->data[11] = dead_zone_quat.w; } pthread_mutex_lock(ipc_values->pose_orientation_mutex); memcpy(ipc_values->pose_orientation, response->data, sizeof(float) * 16); memcpy(ipc_values->pose_position, &pose.position, sizeof(float) * 3); // trigger flush on just the last write set_skippable_gamescope_reshade_effect_uniform_variable("pose_orientation", ipc_values->pose_orientation, 16, sizeof(float), false); set_skippable_gamescope_reshade_effect_uniform_variable("pose_position", ipc_values->pose_position, 3, sizeof(float), true); pthread_mutex_unlock(ipc_values->pose_orientation_mutex); } free(response); } } int x_velocity; int y_velocity; int next_joystick_x; int next_joystick_y; bool do_joystick_debug = config()->debug_joystick && (imu_counter % joystick_debug_imu_cycles) == 0; if (uinput || do_joystick_debug) { // tracking head movements in euler (roll, pitch, yaw) against 2d joystick/mouse (x,y) coordinates means that yaw // maps to horizontal movements (x) and pitch maps to vertical (y) movements. Because the euler values use a NWU // coordinate system, positive yaw/pitch values move left/down, respectively, and the mouse/joystick coordinate // systems are right-down, so a positive yaw should result in a negative x, and a positive pitch should result in a // positive y. x_velocity = config()->vr_lite_invert_x ? velocities.yaw : -velocities.yaw; y_velocity = config()->vr_lite_invert_y ? -velocities.pitch : velocities.pitch; next_joystick_x = joystick_value(x_velocity, joystick_max_degrees_per_s); next_joystick_y = joystick_value(y_velocity, joystick_max_degrees_per_s); } if (uinput) { if (config()->joystick_mode) { int next_joystick_z = joystick_value(-velocities.roll, joystick_max_degrees_per_s); libevdev_uinput_write_event(uinput, EV_ABS, ABS_RX, next_joystick_x); libevdev_uinput_write_event(uinput, EV_ABS, ABS_RY, next_joystick_y); if (config()->use_roll_axis) libevdev_uinput_write_event(uinput, EV_ABS, ABS_RZ, next_joystick_z); } else if (config()->mouse_mode) { // keep track of the remainder (the amount that was lost with round()) for smoothing out mouse movements static float mouse_x_remainder = 0.0; static float mouse_y_remainder = 0.0; static float mouse_z_remainder = 0.0; // smooth out the mouse values using the remainders left over from previous writes float mouse_sensitivity_seconds = (float) config()->mouse_sensitivity / device->imu_cycles_per_s; float next_x = x_velocity * mouse_sensitivity_seconds + mouse_x_remainder; int next_x_int = round(next_x); mouse_x_remainder = next_x - next_x_int; float next_y = y_velocity * mouse_sensitivity_seconds + mouse_y_remainder; int next_y_int = round(next_y); mouse_y_remainder = next_y - next_y_int; float next_z = -velocities.roll * mouse_sensitivity_seconds + mouse_z_remainder; int next_z_int = round(next_z); mouse_z_remainder = next_z - next_z_int; libevdev_uinput_write_event(uinput, EV_REL, REL_X, next_x_int); libevdev_uinput_write_event(uinput, EV_REL, REL_Y, next_y_int); if (config()->use_roll_axis) libevdev_uinput_write_event(uinput, EV_REL, REL_Z, next_z_int); } else if (!config()->external_mode) { log_error("Unsupported output mode: %s\n", config()->output_mode); } if (config()->mouse_mode || config()->joystick_mode) libevdev_uinput_write_event(uinput, EV_SYN, SYN_REPORT, 0); } // always use joystick debugging as it adds a helpful visual if (do_joystick_debug) joystick_debug(prev_joystick_x, prev_joystick_y, next_joystick_x, next_joystick_y); prev_joystick_x = next_joystick_x; prev_joystick_y = next_joystick_y; plugins.handle_pose_data(pose, velocities, imu_calibrated, ipc_values); // reset the counter every second if ((++imu_counter % device->imu_cycles_per_s) == 0) { imu_counter = 0; } pthread_mutex_unlock(&outputs_mutex); } device_checkin(device); } void reset_pose_data(ipc_values_type *ipc_values) { if (ipc_values) { pthread_mutex_lock(ipc_values->pose_orientation_mutex); memcpy(ipc_values->pose_orientation, pose_orientation_reset_data, sizeof(float) * 16); memcpy(ipc_values->pose_position, pose_position_reset_data, sizeof(float) * 3); pthread_mutex_unlock(ipc_values->pose_orientation_mutex); } plugins.reset_pose_data(); } bool is_imu_alive() { return get_epoch_time_ms() - last_healthy_imu_timestamp_ms < MS_PER_SEC; } ================================================ FILE: src/plugins/breezy_desktop.c ================================================ #include "devices.h" #include "features/breezy_desktop.h" #include "logging.h" #include "plugins.h" #include "plugins/breezy_desktop.h" #include "plugins/custom_banner.h" #include "runtime_context.h" #include "state.h" #include "system.h" #include "epoch.h" #include #include #include #include #include #include #include #include #include #include #include #define BREEZY_DESKTOP_FD_RESET -2 const char* shared_mem_directory = "/dev/shm"; const char* shared_mem_filename = "breezy_desktop_imu"; const int breezy_desktop_feature_count = 1; static bool has_started = false; static pthread_mutex_t file_mutex = PTHREAD_MUTEX_INITIALIZER; static int fd = BREEZY_DESKTOP_FD_RESET; static pthread_once_t shared_mem_path_once = PTHREAD_ONCE_INIT; #define NUM_ORIENTATION_VALUES 16 float ORIENTATION_RESET[NUM_ORIENTATION_VALUES] = { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 }; #define NUM_POSITION_VALUES 3 float POSITION_RESET[NUM_POSITION_VALUES] = { 0.0, 0.0, 0.0 }; breezy_desktop_config *bd_config; void breezy_desktop_reset_config(breezy_desktop_config *config) { config->enabled = false; config->look_ahead_override = 0.0; config->display_distance = 1.0; config->display_size = 1.0; config->sbs_content = false; config->sbs_mode_stretched = false; }; void *breezy_desktop_default_config_func() { breezy_desktop_config *config = calloc(1, sizeof(breezy_desktop_config)); breezy_desktop_reset_config(config); return config; }; void breezy_desktop_handle_config_line_func(void* config, char* key, char* value) { breezy_desktop_config* temp_config = (breezy_desktop_config*) config; if (equal(key, "external_mode")) { temp_config->enabled = list_string_contains("breezy_desktop", value) && is_productivity_granted(); } else if (equal(key, "display_distance")) { float_config(key, value, &temp_config->display_distance); } else if (equal(key, "display_size")) { float_config(key, value, &temp_config->display_size); } else if (equal(key, "sbs_content")) { boolean_config(key, value, &temp_config->sbs_content); } else if (equal(key, "sbs_mode_stretched")) { boolean_config(key, value, &temp_config->sbs_mode_stretched); } }; const uint8_t DATA_LAYOUT_VERSION = 5; #define BOOL_TRUE 1 #define BOOL_FALSE 0 // IMU data is written more frequently, so we need to know the offset in the file const int CONFIG_DATA_END_OFFSET = sizeof(uint8_t) + // version sizeof(uint8_t) + // enabled sizeof(float) * 4 + // look_ahead_cfg sizeof(uint32_t) * 2 + // display_res sizeof(float) + // fov sizeof(float) + // lens_distance_ratio sizeof(uint8_t) + // sbs_enabled sizeof(uint8_t); // custom_banner_enabled const int IMU_RECORD_SIZE = sizeof(uint8_t) + // smooth_follow_enabled sizeof(float) * NUM_ORIENTATION_VALUES + // smooth_follow_origin (4 quaternion rows, 4 values each) sizeof(float) * NUM_POSITION_VALUES + // pose_position sizeof(uint64_t) + // imu_date_ms sizeof(float) * NUM_ORIENTATION_VALUES + // pose_orientation (4 quaternion rows, 4 values each) sizeof(uint8_t); // imu_parity_byte uint64_t last_config_write_ts = 0; // https://stackoverflow.com/a/12340725 static int fd_is_valid(int fd) { return fd >= 0 && (fcntl(fd, F_GETFD) != -1 || errno != EBADF); } static char* shared_mem_file_path = NULL; static void init_shared_mem_file_path() { char buf[1024]; snprintf(buf, sizeof(buf), "%s/%s", shared_mem_directory, shared_mem_filename); shared_mem_file_path = strdup(buf); } static char* get_shared_mem_file_path_once() { pthread_once(&shared_mem_path_once, init_shared_mem_file_path); return shared_mem_file_path; } static int full_write(int wfd, const void* buf, size_t len) { const uint8_t *p = (const uint8_t*)buf; while (len) { ssize_t n = write(wfd, p, len); if (n < 0) { if (errno == EINTR) continue; return -1; } if (n == 0) { errno = EIO; return -1; } p += (size_t)n; len -= (size_t)n; } return 0; } char* get_shared_mem_file_path() { return get_shared_mem_file_path_once(); } static off_t expected_file_size() { return (off_t)(CONFIG_DATA_END_OFFSET + IMU_RECORD_SIZE); } static int create_or_open_shared_mem_file() { #ifndef O_CLOEXEC #define O_CLOEXEC 0 #endif #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif char* path = get_shared_mem_file_path(); char shm_name[256]; snprintf(shm_name, sizeof(shm_name), "/%s", shared_mem_filename); int new_fd = shm_open(shm_name, O_RDWR | O_CREAT | O_CLOEXEC, 0644); if (new_fd == -1) { new_fd = open(path, O_RDWR | O_CLOEXEC | O_CREAT | O_NOFOLLOW, 0644); if (new_fd == -1) { log_error("breezy_desktop: open failed %s: %s\n", path, strerror(errno)); return -1; } } struct stat st; if (fstat(new_fd, &st) == -1) { log_error("breezy_desktop: fstat failed: %s\n", strerror(errno)); close(new_fd); return -1; } off_t want = expected_file_size(); if (st.st_size != want) { if (ftruncate(new_fd, want) == -1) { log_error("breezy_desktop: ftruncate(%lld) failed: %s\n", (long long)want, strerror(errno)); close(new_fd); return -1; } if (lseek(new_fd, 0, SEEK_SET) != -1) { size_t sz = (size_t)want; uint8_t *zero = calloc(1, sz); if (zero) { if (full_write(new_fd, zero, sz) == -1) log_error("breezy_desktop: zero init write failed: %s\n", strerror(errno)); free(zero);} else log_error("breezy_desktop: calloc zero init failed\n"); } } return new_fd; } static int get_shared_mem_fd() { if (!fd_is_valid(fd)) fd = BREEZY_DESKTOP_FD_RESET; if (fd == BREEZY_DESKTOP_FD_RESET) { int new_fd = create_or_open_shared_mem_file(); if (new_fd != -1) fd = new_fd; } return fd; } void do_write_config_data(int target_fd) { if (!bd_config) bd_config = breezy_desktop_default_config_func(); if (lseek(target_fd, 0, SEEK_SET) == -1) { int first_err = errno; if (first_err == EBADF) { // Attempt single reopen and retry fd = BREEZY_DESKTOP_FD_RESET; int new_fd = get_shared_mem_fd(); if (new_fd != -1) { target_fd = new_fd; if (lseek(target_fd, 0, SEEK_SET) == -1) { log_error("lseek config retry failed: %s\n", strerror(errno)); goto error; } } else { log_error("reopen after EBADF failed: %s\n", strerror(first_err)); goto error; } } else { log_error("lseek config: %s\n", strerror(first_err)); goto error; } } uint8_t enabled = BOOL_FALSE; if (full_write(target_fd, &DATA_LAYOUT_VERSION, sizeof(uint8_t)) == -1) goto error; device_properties_type* device = device_checkout(); if (device) { enabled = (!config()->disabled && bd_config->enabled) ? BOOL_TRUE : BOOL_FALSE; float look_ahead_cfg[4] = { device->look_ahead_constant, device->look_ahead_frametime_multiplier, device->look_ahead_scanline_adjust, device->look_ahead_ms_cap }; int display_res[2] = { device->resolution_w, device->resolution_h }; uint8_t sbs_enabled = state()->sbs_mode_enabled ? BOOL_TRUE : BOOL_FALSE; uint8_t custom_banner_enabled = (custom_banner_ipc_values && custom_banner_ipc_values->enabled && *custom_banner_ipc_values->enabled) ? BOOL_TRUE : BOOL_FALSE; if (full_write(target_fd, &enabled, sizeof(uint8_t)) == -1) goto error; if (full_write(target_fd, look_ahead_cfg, sizeof(float) * 4) == -1) goto error; if (full_write(target_fd, display_res, sizeof(uint32_t) * 2) == -1) goto error; if (full_write(target_fd, &device->fov, sizeof(float)) == -1) goto error; if (full_write(target_fd, &device->lens_distance_ratio, sizeof(float)) == -1) goto error; if (full_write(target_fd, &sbs_enabled, sizeof(uint8_t)) == -1) goto error; if (full_write(target_fd, &custom_banner_enabled, sizeof(uint8_t)) == -1) goto error; } else { if (full_write(target_fd, &enabled, sizeof(uint8_t)) == -1) goto error; const int remaining = CONFIG_DATA_END_OFFSET - (int)(sizeof(uint8_t) * 2); uint8_t *zero_data = calloc(1, remaining); if (!zero_data) { log_error("breezy_desktop: calloc zero config failed\n"); goto error; } if (full_write(target_fd, zero_data, remaining) == -1) { free(zero_data); goto error; } free(zero_data); } device_checkin(device); last_config_write_ts = get_epoch_time_ms(); return; error: log_error("breezy_desktop: config write failed: %s\n", strerror(errno)); fd = BREEZY_DESKTOP_FD_RESET; } void write_config_data() { if (fd_is_valid(fd) || bd_config && bd_config->enabled) { pthread_mutex_lock(&file_mutex); if (!fd_is_valid(fd)) (void)get_shared_mem_fd(); if (fd_is_valid(fd)) do_write_config_data(fd); pthread_mutex_unlock(&file_mutex); } } void breezy_desktop_write_pose_data(float *orientation, float *position) { pthread_mutex_lock(&file_mutex); int wfd = get_shared_mem_fd(); if (wfd != -1) { uint64_t epoch_ms = get_epoch_time_ms(); if (last_config_write_ts == 0 || epoch_ms - last_config_write_ts > 250) { do_write_config_data(wfd); if (fd == BREEZY_DESKTOP_FD_RESET) { pthread_mutex_unlock(&file_mutex); return; } } if (lseek(wfd, CONFIG_DATA_END_OFFSET, SEEK_SET) == -1) { log_error("breezy_desktop: lseek imu: %s\n", strerror(errno)); goto imu_error; } uint8_t smooth_follow_enabled = state()->breezy_desktop_smooth_follow_enabled ? BOOL_TRUE : BOOL_FALSE; if (full_write(wfd, &smooth_follow_enabled, sizeof(uint8_t)) == -1) goto imu_error; if (state()->smooth_follow_origin_ready && state()->smooth_follow_origin) { if (full_write(wfd, state()->smooth_follow_origin, sizeof(float) * NUM_ORIENTATION_VALUES) == -1) goto imu_error; } else if (full_write(wfd, orientation, sizeof(float) * NUM_ORIENTATION_VALUES) == -1) goto imu_error; if (full_write(wfd, position, sizeof(float) * NUM_POSITION_VALUES) == -1) goto imu_error; if (full_write(wfd, &epoch_ms, sizeof(uint64_t)) == -1) goto imu_error; if (full_write(wfd, orientation, sizeof(float) * NUM_ORIENTATION_VALUES) == -1) goto imu_error; uint8_t parity = 0; uint8_t* d = (uint8_t*)&epoch_ms; for (size_t i=0;ienabled) { breezy_desktop_write_pose_data(&ORIENTATION_RESET[0], &POSITION_RESET[0]); } } void breezy_desktop_set_config_func(void* new_config) { if (!new_config) return; breezy_desktop_config* temp_config = (breezy_desktop_config*) new_config; if (bd_config) { if (bd_config->enabled != temp_config->enabled) log_message("Breezy desktop has been %s\n", temp_config->enabled ? "enabled" : "disabled"); free(bd_config); } bd_config = temp_config; if (has_started) { write_config_data(); if (state()->calibration_state == CALIBRATING) breezy_desktop_reset_pose_data_func(); } }; void breezy_desktop_handle_pose_data_func(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values) { if (bd_config && bd_config->enabled) { if (imu_calibrated && ipc_values) { breezy_desktop_write_pose_data(ipc_values->pose_orientation, is_productivity_pro_granted() ? ipc_values->pose_position : &POSITION_RESET[0]); } else { breezy_desktop_reset_pose_data_func(); } } } void breezy_desktop_start_func() { pthread_mutex_init(&file_mutex, NULL); } void breezy_desktop_device_connect_func() { pthread_mutex_lock(&file_mutex); if (fd_is_valid(fd)) close(fd); fd = BREEZY_DESKTOP_FD_RESET; pthread_mutex_unlock(&file_mutex); has_started = true; write_config_data(); breezy_desktop_reset_pose_data_func(); } const plugin_type breezy_desktop_plugin = { .id = "breezy_desktop", .start = breezy_desktop_start_func, .default_config = breezy_desktop_default_config_func, .handle_config_line = breezy_desktop_handle_config_line_func, .set_config = breezy_desktop_set_config_func, .handle_pose_data = breezy_desktop_handle_pose_data_func, .reset_pose_data = breezy_desktop_reset_pose_data_func, .handle_device_disconnect = write_config_data, .handle_device_connect = breezy_desktop_device_connect_func }; ================================================ FILE: src/plugins/custom_banner.c ================================================ #include "custom_banner_config.h" #include "plugins/custom_banner.h" #include "plugins/gamescope_reshade_wayland.h" #include "ipc.h" #include "runtime_context.h" #include #include const uint32_t banner_start_date = CUSTOM_BANNER_START_DATE; const uint32_t banner_end_date = CUSTOM_BANNER_END_DATE; const int target_device_vendor_id = CUSTOM_BANNER_TARGET_DEVICE_VENDOR_ID; const int target_device_product_id = CUSTOM_BANNER_TARGET_DEVICE_PRODUCT_ID; custom_banner_ipc_values_type *custom_banner_ipc_values; void evaluate_banner_conditions() { device_properties_type* device = device_checkout(); if (device != NULL) { if (custom_banner_ipc_values) { bool any_conditions_set = false; bool banner_device_conditions_met = true; if (target_device_vendor_id != 0) { any_conditions_set = true; banner_device_conditions_met = device->hid_vendor_id == target_device_vendor_id; if (target_device_product_id != 0) { banner_device_conditions_met &= device->hid_product_id == target_device_product_id; } } bool banner_time_conditions_met = true; time_t now = time(NULL); if (banner_start_date != 0) { any_conditions_set = true; banner_time_conditions_met = now > banner_start_date; } if (banner_end_date != 0) { any_conditions_set = true; banner_time_conditions_met &= now < banner_end_date; } *custom_banner_ipc_values->enabled = any_conditions_set && banner_device_conditions_met && banner_time_conditions_met; } } set_gamescope_reshade_effect_uniform_variable("custom_banner_enabled", custom_banner_ipc_values->enabled, 1, sizeof(bool), false); device_checkin(device); } const char *custom_banner_enabled_name = "custom_banner_enabled"; bool custom_banner_setup_ipc_func() { bool debug = config()->debug_ipc; if (!custom_banner_ipc_values) custom_banner_ipc_values = calloc(1, sizeof(custom_banner_ipc_values_type)); setup_ipc_value(custom_banner_enabled_name, (void**) &custom_banner_ipc_values->enabled, sizeof(bool), debug); evaluate_banner_conditions(); return true; } void custom_banner_handle_device_connect_func() { evaluate_banner_conditions(); }; void custom_banner_reset_pose_data_func() { evaluate_banner_conditions(); }; const plugin_type custom_banner_plugin = { .id = "custom_banner", .setup_ipc = custom_banner_setup_ipc_func, .reset_pose_data = custom_banner_reset_pose_data_func, .handle_device_connect = custom_banner_handle_device_connect_func }; ================================================ FILE: src/plugins/device_license.c ================================================ #include "curl.h" #include "features/breezy_desktop.h" #include "features/sbs.h" #include "features/smooth_follow.h" #include "files.h" #include "logging.h" #include "memory.h" #include "plugins/device_license.h" #include "runtime_context.h" #include "strings.h" #include "system.h" #include #include #include #include #include #include #include #include #include #include #include #include #define SECONDS_PER_DAY 86400 const char* DEVICE_LICENSE_FILE_NAME = "%.8s_license.json"; const char* DEVICE_LICENSE_TEMP_FILE_NAME = "license.tmp.json"; // Declare mutexes early so they can be used in helper functions pthread_mutex_t refresh_license_lock = PTHREAD_MUTEX_INITIALIZER; // Helper function to check if all requested features are present in the license bool all_features_in_license(char** requested_features, int requested_count) { if (requested_count == 0) return true; pthread_mutex_lock(&refresh_license_lock); bool result = true; if (!state()->license_features || state()->license_features_count == 0) { result = false; } else { for (int i = 0; i < requested_count; i++) { if (!in_array(requested_features[i], (const char**)state()->license_features, state()->license_features_count)) { result = false; break; } } } pthread_mutex_unlock(&refresh_license_lock); return result; } #ifdef DEVICE_LICENSE_PUBLIC_KEY char* postbody(char* hardwareId, char** features, int features_count) { json_object *root = json_object_new_object(); json_object_object_add(root, "hardwareId", json_object_new_string(hardwareId)); json_object *featuresArray = json_object_new_array(); if (features && features_count > 0) { for (int i = 0; i < features_count; i++) { if (features[i]) { json_object_array_add(featuresArray, json_object_new_string(features[i])); } } } json_object_object_add(root, "features", featuresArray); const char* json_str = json_object_to_json_string(root); char* result = strdup(json_str); json_object_put(root); return result; } bool is_valid_license_signature(const char* license, const char* signature) { if (!license || !signature) { log_error("License or signature is NULL.\n"); return false; } BIO *bio = BIO_new_mem_buf((void*)DEVICE_LICENSE_PUBLIC_KEY, -1); if (!bio) { log_error("Error creating BIO for public key.\n"); ERR_print_errors_fp(stderr); return false; } EVP_PKEY *publicKey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); BIO_free(bio); if (!publicKey) { log_error("Error reading the public key.\n"); ERR_print_errors_fp(stderr); return false; } EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); if (!mdctx) { log_error("Failed to create the EVP_MD_CTX structure.\n"); ERR_print_errors_fp(stderr); return false; } if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, publicKey)) { log_error("Failed to initialize the digest context for verification.\n"); ERR_print_errors_fp(stderr); return false; } if (1 != EVP_DigestVerifyUpdate(mdctx, license, strlen((char*)license))) { log_error("Failed to update the digest context.\n"); ERR_print_errors_fp(stderr); return false; } // Convert the signature from hex string to binary int sig_len = strlen(signature) / 2; unsigned char* binary_sig = calloc(1, sig_len); for (int i = 0; i < sig_len; i++) { unsigned int temp; sscanf(signature + 2*i, "%02x", &temp); binary_sig[i] = temp; } int result = EVP_DigestVerifyFinal(mdctx, binary_sig, sig_len); free(binary_sig); binary_sig = NULL; if (result == 0) { log_error("Signature is not valid.\n"); } else if (result != 1) { log_error("Error occurred while checking the signature.\n"); ERR_print_errors_fp(stderr); } EVP_MD_CTX_free(mdctx); EVP_PKEY_free(publicKey); return result == 1; } bool get_license_features(FILE* file, char*** granted_features, int* granted_features_count, char*** all_features, int* all_features_count) { fseek(file, 0, SEEK_END); long length = ftell(file); fseek(file, 0, SEEK_SET); char* buffer = calloc(1, length); if (buffer) { fread(buffer, 1, length, file); } json_object *root = json_tokener_parse(buffer); free(buffer); buffer = NULL; // check for the "message" property, indicating an error from the server json_object *message; json_object_object_get_ex(root, "message", &message); if (message) { log_error("Error from server: %s\n", json_object_get_string(message)); json_object_put(root); return false; } json_object *license; json_object_object_get_ex(root, "license", &license); json_object *signature; json_object_object_get_ex(root, "signature", &signature); int transient_granted_count = 0; int transient_all_features_count = 0; bool valid_license = false; if (is_valid_license_signature(json_object_get_string(license), json_object_get_string(signature))) { json_object *license_root = json_tokener_parse(json_object_get_string(license)); json_object *hardwareId; json_object_object_get_ex(license_root, "hardwareId", &hardwareId); if (strcmp(json_object_get_string(hardwareId), get_hardware_id()) == 0) { valid_license = true; free_and_clear(&state()->device_license); state()->device_license = strdup(json_object_get_string(license)); json_object *features_root; json_object_object_get_ex(license_root, "features", &features_root); if (features_root) { json_object_object_foreach(features_root, featureName, val) { json_object *featureObject; json_object_object_get_ex(features_root, featureName, &featureObject); json_object *featureStatusObject; json_object_object_get_ex(featureObject, "status", &featureStatusObject); const char* featureStatus = json_object_get_string(featureStatusObject); json_object *featureEndDate; json_object_object_get_ex(featureObject, "endDate", &featureEndDate); // Add all features to the license features list char** temp = realloc(*all_features, (transient_all_features_count + 1) * sizeof(char*)); if (!temp) { log_error("Failed to allocate memory for license features\n"); continue; } *all_features = temp; char* feature_copy = strdup(featureName); if (!feature_copy) { log_error("Failed to allocate memory for feature name\n"); continue; } (*all_features)[transient_all_features_count++] = feature_copy; // if status is "on" or "trial" and the current system time is not past the endDate, add to the granted features array bool enabled = false; if (strcmp(featureStatus, "on") == 0 || strcmp(featureStatus, "trial") == 0) { struct timeval tv; gettimeofday(&tv, NULL); if (!featureEndDate || json_object_get_int(featureEndDate) > tv.tv_sec) { char** granted_temp = realloc(*granted_features, (transient_granted_count + 1) * sizeof(char*)); if (!granted_temp) { log_error("Failed to allocate memory for granted features\n"); } else { *granted_features = granted_temp; char* granted_copy = strdup(featureName); if (!granted_copy) { log_error("Failed to allocate memory for granted feature name\n"); } else { (*granted_features)[transient_granted_count++] = granted_copy; enabled = true; } } } } log_message("Feature %s %s.\n", featureName, enabled ? "granted" : "denied"); } } } else { if (config() && config()->debug_license) { log_debug("License hardwareId mismatch;\n\t\treceived: %s\n\t\texpected: %s\n", json_object_get_string(hardwareId), get_hardware_id()); } } json_object_put(license_root); } json_object_put(root); *granted_features_count = transient_granted_count; *all_features_count = transient_all_features_count; return valid_license; } #endif void refresh_license(bool force, char** requested_features, int requested_features_count) { int granted_count = 0; char** granted_features = NULL; int all_features_count = 0; char** all_features = NULL; #ifdef DEVICE_LICENSE_PUBLIC_KEY char* hw_id = get_hardware_id(); if (hw_id) { pthread_mutex_lock(&refresh_license_lock); // prefix the license file name with the hardware id we can still have this one saved in // the case where it changes in the future, which can happen due to network interface ordering or // startup sequence timing char* file_name = malloc(strlen(hw_id) + strlen(DEVICE_LICENSE_FILE_NAME)); sprintf(file_name, DEVICE_LICENSE_FILE_NAME, hw_id); const char* device_license_path = get_state_file_path(file_name); free(file_name); const char* device_license_path_tmp = get_state_file_path(DEVICE_LICENSE_TEMP_FILE_NAME); int attempt = 0; bool valid_license = false; bool debug_license = config() && config()->debug_license; while (!valid_license && attempt < 2) { if (debug_license) log_debug("Attempt %d to refresh license\n", attempt); char* file_path = strdup(device_license_path); FILE *file = force ? NULL : fopen(file_path, "r"); if (file) { if (debug_license) log_debug("License file already exists\n"); // remove the file if it hasn't been touched in over a day struct stat attr; stat(device_license_path, &attr); struct timeval tv; gettimeofday(&tv, NULL); if (tv.tv_sec - attr.st_mtime > SECONDS_PER_DAY) { // do this to force a refresh fclose(file); file = NULL; if (debug_license) log_debug("License file is 1 day old, attempting to refresh it\n"); } } if (file == NULL) { free(file_path); file_path = strdup(device_license_path_tmp); CURL *curl; CURLcode res; struct curl_slist *headers = NULL; curl_init(); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L); file = get_or_create_file(file_path, 0777, "w", NULL); if (file == NULL) { log_error("Error opening file (%s): %d\n", file_path, errno); break; } curl_easy_setopt(curl, CURLOPT_URL, "https://eu.driver-backend.xronlinux.com/licenses/v1"); char* postbody_string = postbody(get_hardware_id(), requested_features, requested_features_count); if (debug_license) log_debug("License curl with postbody %s\n", postbody_string); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postbody_string); headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); long http_code = 0; CURLcode res = curl_easy_perform(curl); bool failed = false; if(res != CURLE_OK) { failed = true; log_error("curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } else { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); if(http_code != 200) { failed = true; log_error("Unexpected HTTP response: %ld\n", http_code); res = CURLE_HTTP_RETURNED_ERROR; } } fclose(file); if(failed) { remove(file_path); free(file_path); file_path = strdup(device_license_path); } free(postbody_string); curl_easy_cleanup(curl); } // Reopen the file file = fopen(file_path, "r"); if (file == NULL) { free(file_path); log_error("Error opening file (%s): %d\n", file_path, errno); break; } } valid_license = get_license_features(file, &granted_features, &granted_count, &all_features, &all_features_count); fclose(file); if (valid_license) { if (strcmp(file_path, device_license_path_tmp) == 0) { rename(file_path, device_license_path); } } else { remove(file_path); } free(file_path); attempt++; } pthread_mutex_unlock(&refresh_license_lock); free((void*)device_license_path); free((void*)device_license_path_tmp); } else { log_error("No hardwareId found, not retrieving license\n"); } #endif pthread_mutex_lock(&refresh_license_lock); free_string_array(state()->granted_features, state()->granted_features_count); state()->granted_features = granted_features; state()->granted_features_count = granted_count; // granted_features has changed; clear cached feature checks reset_productivity_features(); reset_sbs_features(); reset_smooth_follow_features(); free_string_array(state()->license_features, state()->license_features_count); state()->license_features = all_features; state()->license_features_count = all_features_count; pthread_mutex_unlock(&refresh_license_lock); } void device_license_start_func() { refresh_license(false, NULL, 0); } void device_license_handle_control_flag_line_func(char* key, char* value) { if (strcmp(key, "refresh_device_license") == 0) { if (strcmp(value, "true") == 0) refresh_license(true, NULL, 0); } else if (strcmp(key, "request_features") == 0) { // Parse the comma-separated features string char** requested_features = NULL; int requested_count = parse_comma_separated_string(value, &requested_features); // Check if all requested features are present in the license if (requested_count > 0 && !all_features_in_license(requested_features, requested_count)) { refresh_license(true, requested_features, requested_count); } free_string_array(requested_features, requested_count); } } void device_license_handle_device_connect_func() { refresh_license(false, NULL, 0); } const plugin_type device_license_plugin = { .id = "device_license", .start = device_license_start_func, .handle_control_flag_line = device_license_handle_control_flag_line_func, .handle_device_connect = device_license_handle_device_connect_func }; ================================================ FILE: src/plugins/gamescope_reshade_wayland.c ================================================ #include "epoch.h" #include "files.h" #include "imu.h" #include "logging.h" #include "plugins/gamescope_reshade_wayland.h" #include "runtime_context.h" #include "strings.h" #include "wl_client/gamescope_reshade.h" #include #include #include #include #include #include /** * The wayland-client library may not be present, so we create a weak reference to wl_proxy_create just * for the sake of checking if the library is linked. All function calls should be preceeded by a check * for the presence of wl_proxy_create or the presence of the reshade_object (which implies the presence * of the former has already succeeded previously). */ #include __attribute__((weak)) struct wl_proxy *wl_proxy_create(struct wl_proxy *factory, const struct wl_interface *interface); #define GAMESCOPE_RESHADE_INTERFACE_NAME "gamescope_reshade" #define GAMESCOPE_RESHADE_EFFECT_FILE "Sombrero.frag" #define GAMESCOPE_RESHADE_EFFECT_PATH "reshade/Shaders/" GAMESCOPE_RESHADE_EFFECT_FILE #define GAMESCOPE_RESHADE_WAIT_TIME_MS 500 static gamescope_reshade_wayland_config *gamescope_config; static struct wl_display *display = NULL; static struct wl_registry *registry = NULL; static struct gamescope_reshade *reshade_object = NULL; static gamescope_reshade_effect_ready_callback effect_ready_callback = NULL; static uint64_t gamescope_reshade_effect_request_time = 0; static bool gamescope_reshade_ipc_connected = false; static pthread_mutex_t wayland_mutex = PTHREAD_MUTEX_INITIALIZER; void *gamescope_reshade_wayland_default_config_func() { gamescope_reshade_wayland_config *config = calloc(1, sizeof(gamescope_reshade_wayland_config)); config->disabled = false; return config; }; void gamescope_reshade_wayland_handle_config_line_func(void* config, char* key, char* value) { gamescope_reshade_wayland_config* temp_config = (gamescope_reshade_wayland_config*) config; if (equal(key, "gamescope_reshade_wayland_disabled")) { boolean_config(key, value, &temp_config->disabled); } }; void gamescope_reshade_wayland_set_config_func(void* config) { if (!config) return; gamescope_reshade_wayland_config* temp_config = (gamescope_reshade_wayland_config*) config; if (gamescope_config) { if (gamescope_config->disabled != temp_config->disabled) log_message("Gamescope ReShade integration has been %s\n", temp_config->disabled ? "disabled" : "enabled"); free(gamescope_config); } gamescope_config = temp_config; }; static char* sombrero_shader_file_path() { static char* shader_file_path = NULL; if (!shader_file_path) shader_file_path = get_xdg_file_path_for_app("gamescope", GAMESCOPE_RESHADE_EFFECT_PATH, XDG_DATA_ENV_VAR, XDG_DATA_FALLBACK_DIR); return shader_file_path; } static bool sombrero_file_exists() { return access(sombrero_shader_file_path(), F_OK) != -1; } static void gamescope_reshade_wl_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_handle_global %s\n", interface); if (strcmp(interface, GAMESCOPE_RESHADE_INTERFACE_NAME) == 0) { reshade_object = wl_registry_bind(registry, name, &gamescope_reshade_interface, version); } } bool is_gamescope_reshade_ipc_connected() { return gamescope_reshade_ipc_connected; } static void do_wl_server_disconnect() { gamescope_reshade_ipc_connected = false; if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_disconnect\n"); if (effect_ready_callback) effect_ready_callback = NULL; if (reshade_object) { gamescope_reshade_destroy(reshade_object); reshade_object = NULL; } if (registry) { wl_registry_destroy(registry); registry = NULL; } if (display) { wl_display_flush(display); wl_display_disconnect(display); display = NULL; } } static bool do_wl_server_connect() { if (gamescope_config->disabled || gamescope_reshade_ipc_connected) return false; if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect\n"); if (wl_proxy_create == NULL) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect wayland-client library not present\n"); return false; } if (!display) display = wl_display_connect("gamescope-0"); if (!display) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect no display\n"); return false; } if (!registry) registry = wl_display_get_registry(display); if (!registry) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect no registry\n"); wl_display_disconnect(display); display = NULL; return false; } if (!reshade_object) { static const struct wl_registry_listener registry_listener = { .global = gamescope_reshade_wl_handle_global }; wl_registry_add_listener(registry, ®istry_listener, NULL); wl_display_roundtrip(display); } if (reshade_object) { wl_display_dispatch_pending(display); wl_display_flush(display); int wl_display_error = wl_display_get_error(display); if (wl_display_error != 0) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect wl_display_error: %d\n", wl_display_error); do_wl_server_disconnect(); return false; } gamescope_reshade_set_effect(reshade_object, GAMESCOPE_RESHADE_EFFECT_FILE); int wl_result = wl_display_flush(display); if (wl_result < 0) { log_error("gamescope_reshade_wl_server_connect error %d on wl_display_flush: %s\n", wl_result, strerror(errno)); do_wl_server_disconnect(); return false; } gamescope_reshade_effect_request_time = get_epoch_time_ms(); gamescope_reshade_ipc_connected = true; return true; } else { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_server_connect no reshade_object\n"); do_wl_server_disconnect(); return false; } } static bool gamescope_reshade_wl_setup_ipc() { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_setup_ipc\n"); pthread_mutex_lock(&wayland_mutex); do_wl_server_connect(); pthread_mutex_unlock(&wayland_mutex); return true; } static bool do_wl_enable_gamescope_effect() { if (!reshade_object) return false; if (config()->debug_ipc) log_debug("enable_gamescope_effect\n"); gamescope_reshade_enable_effect(reshade_object); wl_display_flush(display); return true; } static bool do_wl_disable_gamescope_effect() { if (!reshade_object) return false; if (config()->debug_ipc) log_debug("disable_gamescope_effect\n"); gamescope_reshade_disable_effect(reshade_object); wl_display_flush(display); return true; } static bool plugins_ipc_change_call_in_progress = false; // must only be called from within the wayland mutex static void do_trigger_plugins_ipc_change() { // prevent recursive calls to this function if (plugins_ipc_change_call_in_progress) return; plugins_ipc_change_call_in_progress = true; // we're sending control to outside plugins which may trigger other calls to set unifrom variables, // so we have to unlock the mutex to be safe and prevent deadlocks pthread_mutex_unlock(&wayland_mutex); plugins.handle_ipc_change(); pthread_mutex_lock(&wayland_mutex); plugins_ipc_change_call_in_progress = false; } static void do_wl_cleanup() { do_wl_disable_gamescope_effect(); // set this early so other plugins can check if it's connected and change runtime variables // before the actual connection is closed gamescope_reshade_ipc_connected = false; state()->is_gamescope_reshade_ipc_connected = false; do_trigger_plugins_ipc_change(); do_wl_server_disconnect(); gamescope_reshade_effect_request_time = 0; } static void wayland_cleanup() { if (config()->debug_ipc) log_debug("wayland_cleanup\n"); pthread_mutex_lock(&wayland_mutex); do_wl_cleanup(); pthread_mutex_unlock(&wayland_mutex); } static bool do_wl_set_uniform_variable(const char *variable_name, const void *data, int entries, size_t element_size, bool flush) { if (!reshade_object) return false; struct wl_array array; wl_array_init(&array); size_t total_size = entries * element_size; void *array_data = wl_array_add(&array, total_size); if (!array_data) { wl_array_release(&array); return false; } memcpy(array.data, data, total_size); gamescope_reshade_set_uniform_variable(reshade_object, variable_name, &array); wl_array_release(&array); if (flush) { int wl_result; if (effect_ready_callback) { // this is a blocking call, so only use it if we're waiting on an event callback wl_result = wl_display_roundtrip(display); } else { wl_result = wl_display_flush(display); } if (wl_result < 0) { log_error("Error %d on gamescope wl_display_flush: %s\n", wl_result, strerror(errno)); return false; } } return true; } static void _effect_ready_callback(void *data, struct gamescope_reshade *gamescope_reshade, const char *effect_path) { if (config()->debug_ipc) log_debug("_effect_ready_callback: %s\n", effect_path); if (effect_ready_callback && equal(effect_path, GAMESCOPE_RESHADE_EFFECT_FILE)) { effect_ready_callback(); effect_ready_callback = NULL; } } static bool do_wl_add_gamescope_effect_ready_listener(gamescope_reshade_effect_ready_callback callback) { if (!reshade_object) return false; effect_ready_callback = callback; static const struct gamescope_reshade_listener listener = { .effect_ready = _effect_ready_callback }; gamescope_reshade_add_listener(reshade_object, &listener, NULL); return true; } static void _gamescope_reshade_effect_ready() { gamescope_reshade_effect_request_time = 0; } void set_gamescope_reshade_effect_uniform_variable(const char *variable_name, const void *data, int entries, size_t element_size, bool flush) { if (!reshade_object) return; pthread_mutex_lock(&wayland_mutex); bool success = do_wl_set_uniform_variable(variable_name, data, entries, element_size, flush); if (!success && flush) { do_wl_cleanup(); } pthread_mutex_unlock(&wayland_mutex); } void set_skippable_gamescope_reshade_effect_uniform_variable(const char *variable_name, const void *data, int entries, size_t element_size, bool flush) { // if already locked, just skip this call if (!reshade_object || pthread_mutex_trylock(&wayland_mutex) != 0) return; bool success = do_wl_set_uniform_variable(variable_name, data, entries, element_size, flush); if (!success && flush) { do_wl_cleanup(); } pthread_mutex_unlock(&wayland_mutex); } void gamescope_reshade_wl_handle_state_func() { pthread_mutex_lock(&wayland_mutex); if (device_present() && sombrero_file_exists() && !gamescope_config->disabled) { if (!gamescope_reshade_ipc_connected) { do_wl_server_connect(); if (gamescope_reshade_ipc_connected) { if (config()->debug_ipc) log_debug("gamescope_reshade_wl_handle_state_func connected to gamescope\n"); state()->is_gamescope_reshade_ipc_connected = true; do_trigger_plugins_ipc_change(); do_wl_add_gamescope_effect_ready_listener(_gamescope_reshade_effect_ready); do_wl_enable_gamescope_effect(); } } } else { if (gamescope_reshade_ipc_connected) do_wl_cleanup(); } pthread_mutex_unlock(&wayland_mutex); }; void gamescope_reshade_wl_handle_pose_data_func(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values) { if (!reshade_object) return; pthread_mutex_lock(&wayland_mutex); if (gamescope_reshade_effect_request_time != 0 && get_epoch_time_ms() - gamescope_reshade_effect_request_time > GAMESCOPE_RESHADE_WAIT_TIME_MS) { log_error("gamescope effect_ready event never received, falling back to shared memory IPC\n"); do_wl_cleanup(); } pthread_mutex_unlock(&wayland_mutex); } void gamescope_reshade_wl_reset_pose_data_func() { set_skippable_gamescope_reshade_effect_uniform_variable("pose_orientation", pose_orientation_reset_data, 16, sizeof(float), false); set_skippable_gamescope_reshade_effect_uniform_variable("pose_position", pose_position_reset_data, 3, sizeof(float), true); } const plugin_type gamescope_reshade_wayland_plugin = { .id = "gamescope_reshade_wayland", .default_config = gamescope_reshade_wayland_default_config_func, .handle_config_line = gamescope_reshade_wayland_handle_config_line_func, .set_config = gamescope_reshade_wayland_set_config_func, .setup_ipc = gamescope_reshade_wl_setup_ipc, .handle_state = gamescope_reshade_wl_handle_state_func, .handle_pose_data = gamescope_reshade_wl_handle_pose_data_func, .reset_pose_data = gamescope_reshade_wl_reset_pose_data_func, .handle_device_disconnect = wayland_cleanup, }; ================================================ FILE: src/plugins/metrics.c ================================================ #include "config.h" #include "curl.h" #include "devices.h" #include "memory.h" #include "plugins.h" #include "runtime_context.h" #include "system.h" #include #include #include #include #include const char *UA_MEASUREMENT_ID = "G-Z94MXP18T6"; const char *UA_CLIENT_ID="ARLinuxDriver"; void log_metric(char *event_name) { #ifdef UA_API_SECRET if (config()->metrics_disabled) return; CURL *curl; CURLcode res; struct curl_slist *headers = NULL; curl_init(); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L); headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); char url[1024]; snprintf(url, 1024, "https://www.google-analytics.com/mp/collect?api_secret=%s&measurement_id=%s&aip=1", UA_API_SECRET, UA_MEASUREMENT_ID); curl_easy_setopt(curl, CURLOPT_URL, url); char post_data[1024]; snprintf(post_data, 1024, "{\"client_id\": \"%s\", \"events\": [{\"name\": \"%s\"}]}", UA_CLIENT_ID, event_name); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); } #endif }; // Distill all possible modes into one enum. It's spread across multiple configs, so it's not a perfect representation. enum metrics_output_mode { OUTPUT_MODE_DISABLED, OUTPUT_MODE_SIDEVIEW, OUTPUT_MODE_VIRTUAL_DISPLAY, OUTPUT_MODE_MOUSE, OUTPUT_MODE_JOYSTICK, OUTPUT_MODE_BREEZY_DESKTOP, OUTPUT_MODE_OPENTRACK }; char *metrics_output_mode_to_event_name[7] = { "output_mode_disabled", "output_mode_follow", "output_mode_virtual_display", "output_mode_mouse", "output_mode_joystick", "output_mode_breezy_desktop", "output_mode_opentrack" }; enum metrics_output_mode current_output_mode = OUTPUT_MODE_DISABLED; bool config_disabled = true; char *config_output_mode = NULL; char *config_external_mode = NULL; char *current_device = NULL; bool state_sbs_enabled = false; bool was_smooth_follow_enabled = false; bool config_smooth_follow_enabled = false; bool was_auto_recenter_enabled = false; bool config_auto_recenter_enabled = false; void metrics_handle_config_line_func(void* config, char* key, char* value) { if (!config_output_mode) config_output_mode = strdup(mouse_output_mode); if (!config_external_mode) config_external_mode = strdup("none"); if (equal(key, "output_mode")) { string_config(key, value, &config_output_mode); } else if (equal(key, "external_mode")) { string_config(key, value, &config_external_mode); } else if (equal(key, "disabled")) { boolean_config(key, value, &config_disabled); } else if (equal(key, "virtual_display_smooth_follow_enabled")) { boolean_config(key, value, &config_auto_recenter_enabled); } else if (equal(key, "sideview_smooth_follow_enabled")) { boolean_config(key, value, &config_smooth_follow_enabled); } }; void metrics_set_config_func(void* config) { enum metrics_output_mode new_output_mode = OUTPUT_MODE_DISABLED; if (!config_disabled) { if (!config_output_mode || equal(config_output_mode, mouse_output_mode)) { new_output_mode = OUTPUT_MODE_MOUSE; } else if (equal(config_output_mode, joystick_output_mode)) { new_output_mode = OUTPUT_MODE_JOYSTICK; } else if (list_string_contains("virtual_display", config_external_mode)) { new_output_mode = OUTPUT_MODE_VIRTUAL_DISPLAY; } else if (list_string_contains("sideview", config_external_mode)) { new_output_mode = OUTPUT_MODE_SIDEVIEW; } else if (list_string_contains("breezy_desktop", config_external_mode)) { new_output_mode = OUTPUT_MODE_BREEZY_DESKTOP; } else if (list_string_contains("opentrack", config_external_mode)) { new_output_mode = OUTPUT_MODE_OPENTRACK; } } if (device_present()) { bool output_mode_changed = current_output_mode != new_output_mode; if (output_mode_changed && new_output_mode != OUTPUT_MODE_DISABLED) { log_metric(metrics_output_mode_to_event_name[new_output_mode]); } current_output_mode = new_output_mode; if (config_smooth_follow_enabled && (!was_smooth_follow_enabled || output_mode_changed && new_output_mode == OUTPUT_MODE_SIDEVIEW)) { log_metric("smooth_follow_enabled"); } was_smooth_follow_enabled = config_smooth_follow_enabled; if (config_auto_recenter_enabled && (!was_auto_recenter_enabled || output_mode_changed && new_output_mode == OUTPUT_MODE_VIRTUAL_DISPLAY)) { log_metric("auto_recenter_enabled"); } was_auto_recenter_enabled = config_auto_recenter_enabled; } }; void metrics_handle_state_func() { if (!state_sbs_enabled && state()->sbs_mode_enabled) { log_metric("sbs_enabled"); state_sbs_enabled = state()->sbs_mode_enabled; } }; void metrics_handle_device_connect_func() { device_properties_type* device = device_checkout(); if (device != NULL) { char new_device[1024]; snprintf(new_device, 1024, "device_%x_%x", device->hid_vendor_id, device->hid_product_id); if (!current_device || strcmp(new_device, current_device) != 0) { log_metric(new_device); free_and_clear(¤t_device); current_device = strdup(new_device); } } device_checkin(device); }; const plugin_type metrics_plugin = { .id = "metrics", .handle_config_line = metrics_handle_config_line_func, .set_config = metrics_set_config_func, .handle_state = metrics_handle_state_func, .handle_device_connect = metrics_handle_device_connect_func }; ================================================ FILE: src/plugins/neck_saver.c ================================================ #include "plugins/neck_saver.h" #include "imu.h" #include "logging.h" #include "memory.h" #include "strings.h" #include "config.h" #include #include #include static neck_saver_config_type *ns_config = NULL; static void *neck_saver_default_config_func() { neck_saver_config_type *config = calloc(1, sizeof(neck_saver_config_type)); config->horizontal_multiplier = 1.0f; config->vertical_multiplier = 1.0f; return config; } static void neck_saver_handle_config_line_func(void *config, char *key, char *value) { neck_saver_config_type *c = (neck_saver_config_type*)config; if (equal(key, "neck_saver_horizontal_multiplier")) { float_config(key, value, &c->horizontal_multiplier); } else if (equal(key, "neck_saver_vertical_multiplier")) { float_config(key, value, &c->vertical_multiplier); } } static void neck_saver_set_config_func(void *config) { neck_saver_config_type *new_config = (neck_saver_config_type*)config; if (!ns_config) { ns_config = new_config; return; } if (ns_config->horizontal_multiplier != new_config->horizontal_multiplier) { log_message("Neck Saver horizontal multiplier changed to %f\n", new_config->horizontal_multiplier); } if (ns_config->vertical_multiplier != new_config->vertical_multiplier) { log_message("Neck Saver vertical multiplier changed to %f\n", new_config->vertical_multiplier); } free(ns_config); ns_config = new_config; } static void neck_saver_modify_pose_func(imu_pose_type* pose) { if (!ns_config || !pose) return; if (ns_config->horizontal_multiplier == 1.0f && ns_config->vertical_multiplier == 1.0f) return; // euler is XYZ (roll,pitch,yaw). Apply multipliers accordingly. pose->euler.yaw *= ns_config->horizontal_multiplier; pose->euler.pitch *= ns_config->vertical_multiplier; // Keep quaternion consistent with updated euler angles pose->orientation = euler_to_quaternion_zyx(pose->euler); } const plugin_type neck_saver_plugin = { .id = "neck_saver", .default_config = neck_saver_default_config_func, .handle_config_line = neck_saver_handle_config_line_func, .set_config = neck_saver_set_config_func, .modify_pose = neck_saver_modify_pose_func }; ================================================ FILE: src/plugins/opentrack_listener.c ================================================ #include "config.h" #include "connection_pool.h" #include "devices.h" #include "driver.h" #include "imu.h" #include "logging.h" #include "memory.h" #include "plugins/opentrack_listener.h" #include "runtime_context.h" #include "strings.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define OT_DEVICE_BRAND "OpenTrack" #define OT_DRIVER_ID "opentrack" // This plugin exposes an OpenTrack UDP stream as a synthetic IMU device. // It binds a UDP socket, blocks waiting for 6-double payloads (x,y,z,yaw,pitch,roll), // converts yaw/pitch/roll (degrees) to a quaternion, and feeds the driver loop. static opentrack_listener_config *ot_cfg = NULL; // Socket state static int udp_fd = -1; static struct sockaddr_storage bind_addr; static socklen_t bind_addr_len = 0; static volatile bool connected = false; static pthread_t listener_thread; static bool listener_running = false; static pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t conn_cond = PTHREAD_COND_INITIALIZER; static volatile bool block_active = false; // Track OpenTrack source plugin config to prevent feedback loops static bool ot_source_enabled = false; static char *ot_source_ip = NULL; static int ot_source_port = 4242; static volatile bool feedback_loop_ignore = false; static void listener_device_disconnect() { connection_t* c = connection_pool_find_driver_connection(OT_DRIVER_ID); if (c) { connected_device_type* connected_device = calloc(1, sizeof(connected_device_type)); connected_device->driver = c->driver; connected_device->device = c->device; handle_device_connection_changed(false, connected_device); } pthread_mutex_lock(&conn_mutex); if (connected) { connected = false; pthread_cond_broadcast(&conn_cond); } pthread_mutex_unlock(&conn_mutex); } // Utility: check if a target IP string refers to localhost/unspecified static bool is_localhostish_ip(const char *ip_raw) { // defaults to localhost if unset, return true if (!ip_raw || !ip_raw[0]) return true; // make a scratch copy to strip brackets and zone-id char buf[256]; size_t len = strlen(ip_raw); if (len >= sizeof(buf)) len = sizeof(buf) - 1; memcpy(buf, ip_raw, len); buf[len] = '\0'; // Strip surrounding [ ] for IPv6 literals if (buf[0] == '[') { size_t blen = strlen(buf); if (blen >= 2 && buf[blen - 1] == ']') { memmove(buf, buf + 1, blen - 2); buf[blen - 2] = '\0'; } } // Strip zone id (e.g., fe80::1%lo0) char *pct = strchr(buf, '%'); if (pct) *pct = '\0'; // Quick textual checks if (strcmp(buf, "localhost") == 0) return true; if (strcmp(buf, "0.0.0.0") == 0) return true; // unspecified IPv4 if (strcmp(buf, "::") == 0) return true; // unspecified IPv6 // Parse as IPv4 struct in_addr a4; if (inet_pton(AF_INET, buf, &a4) == 1) { uint32_t host = ntohl(a4.s_addr); if (host == 0) return true; // 0.0.0.0 if ((host & 0xFF000000u) == 0x7F000000u) // 127.0.0.0/8 return true; return false; } // Parse as IPv6 struct in6_addr a6; if (inet_pton(AF_INET6, buf, &a6) == 1) { if (IN6_IS_ADDR_LOOPBACK(&a6)) return true; // ::1 if (IN6_IS_ADDR_UNSPECIFIED(&a6)) return true; // :: return false; } // Unknown format; be conservative and do not consider it localhost return false; } static void update_feedback_guard() { bool prev = feedback_loop_ignore; int listener_port = (ot_cfg && ot_cfg->port > 0) ? ot_cfg->port : 4242; feedback_loop_ignore = (ot_cfg && ot_cfg->enabled && ot_source_enabled && is_localhostish_ip(ot_source_ip) && (ot_source_port == listener_port)); if (feedback_loop_ignore && !prev) { log_message("OpenTrack listener: ignoring loopback packets (source enabled; target %s:%d matches listen port %d)\n", ot_source_ip ? ot_source_ip : "127.0.0.1", ot_source_port, listener_port); listener_device_disconnect(); } else if (!feedback_loop_ignore && prev) { log_message("OpenTrack listener: feedback guard disabled; accepting packets\n"); } } // Placeholder device properties for an OpenTrack source static device_properties_type *make_opentrack_device_properties() { device_properties_type *d = calloc(1, sizeof(*d)); d->brand = OT_DEVICE_BRAND; d->model = "UDP"; d->hid_vendor_id = 0; d->hid_product_id = 0; d->usb_bus = 0; d->usb_address = 0; d->calibration_setup = CALIBRATION_SETUP_AUTOMATIC; d->resolution_w = RESOLUTION_1080P_W; d->resolution_h = RESOLUTION_1080P_H; d->fov = 45.0f; d->lens_distance_ratio = 0.03125f; d->calibration_wait_s = 1; d->imu_cycles_per_s = 120; // nominal rate; actual rate comes from incoming stream timing d->imu_buffer_size = 1; d->look_ahead_constant = 25.0f; d->look_ahead_frametime_multiplier = 0.3f; d->look_ahead_scanline_adjust = 8.0f; d->look_ahead_ms_cap = 40.0f; d->sbs_mode_supported = false; d->firmware_update_recommended = false; d->can_be_supplemental = true; d->provides_orientation = true; d->provides_position = true; return d; } static void opentrack_close_socket() { if (udp_fd != -1) { close(udp_fd); udp_fd = -1; } bind_addr_len = 0; } static bool opentrack_bind_socket(const char *ip, int port) { opentrack_close_socket(); struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; char port_str[16]; snprintf(port_str, sizeof(port_str), "%d", port); const char *host = ip; char hostbuf[256]; if (!host || host[0] == '\0') { host = NULL; } else { size_t len = strlen(host); if (len >= 2 && host[0] == '[' && host[len - 1] == ']') { size_t n = len - 2; if (n >= sizeof(hostbuf)) n = sizeof(hostbuf) - 1; memcpy(hostbuf, host + 1, n); hostbuf[n] = '\0'; host = hostbuf; } } struct addrinfo *res = NULL, *rp = NULL; int rc = getaddrinfo(host, port_str, &hints, &res); if (rc != 0) { log_error("opentrack (consumer): getaddrinfo('%s', %d) failed: %s\n", host ? host : "*", port, gai_strerror(rc)); return false; } for (rp = res; rp != NULL; rp = rp->ai_next) { udp_fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (udp_fd < 0) continue; int one = 1; setsockopt(udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); if (rp->ai_family == AF_INET6) { int v6only = 0; (void)setsockopt(udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &v6only, sizeof(v6only)); } if (bind(udp_fd, rp->ai_addr, rp->ai_addrlen) == 0) { memset(&bind_addr, 0, sizeof(bind_addr)); memcpy(&bind_addr, rp->ai_addr, rp->ai_addrlen); bind_addr_len = (socklen_t)rp->ai_addrlen; break; } else { if (config()->debug_device) log_debug("opentrack listener: bind failed: %s\n", strerror(errno)); close(udp_fd); udp_fd = -1; } } if (rp == NULL) { log_error("opentrack listener: failed to bind %s:%d\n", ip && ip[0] ? ip : "*", port); freeaddrinfo(res); return false; } freeaddrinfo(res); return true; } // --- device driver impl --- static device_properties_type *opentrack_supported_device(uint16_t id_vendor, uint16_t id_product, uint8_t usb_bus, uint8_t usb_address) { (void)id_vendor; (void)id_product; (void)usb_bus; (void)usb_address; // This hook is specific to the libusb hotplug event, which will never be triggered for the OpenTrack source. return NULL; } static bool opentrack_device_connect() { connected = ot_cfg && ot_cfg->enabled && udp_fd != -1; return connected; } static void opentrack_block_on_device() { device_properties_type *device = device_checkout(); pthread_mutex_lock(&conn_mutex); block_active = true; while (connected) { pthread_cond_wait(&conn_cond, &conn_mutex); } block_active = false; pthread_mutex_unlock(&conn_mutex); device_checkin(device); } static bool opentrack_device_is_sbs_mode() { return false; } static bool opentrack_device_set_sbs_mode(bool enabled) { (void)enabled; return false; } static bool opentrack_is_connected() { return connected; } static void opentrack_disconnect(bool soft) { pthread_mutex_lock(&conn_mutex); connected = false; pthread_cond_broadcast(&conn_cond); pthread_mutex_unlock(&conn_mutex); } static const device_driver_type opentrack_driver = { .id = OT_DRIVER_ID, .supported_device_func = opentrack_supported_device, .device_connect_func = opentrack_device_connect, .block_on_device_func = opentrack_block_on_device, .device_is_sbs_mode_func = opentrack_device_is_sbs_mode, .device_set_sbs_mode_func = opentrack_device_set_sbs_mode, .is_connected_func = opentrack_is_connected, .disconnect_func = opentrack_disconnect }; // --- plugin impl --- static void *opentrack_default_config_func() { // Reset static variables tied to the opentrack_source plugin ot_source_enabled = false; if (ot_source_ip) free_and_clear(&ot_source_ip); ot_source_port = 4242; opentrack_listener_config *cfg = calloc(1, sizeof(*cfg)); cfg->enabled = false; cfg->ip = strdup("0.0.0.0"); cfg->port = 4242; return cfg; } static void opentrack_handle_config_line_func(void *config, char *key, char *value) { opentrack_listener_config *cfg = (opentrack_listener_config *)config; if (!cfg) return; if (equal(key, "opentrack_listener_enabled")) { boolean_config(key, value, &cfg->enabled); } else if (equal(key, "opentrack_listen_ip")) { string_config(key, value, &cfg->ip); } else if (equal(key, "opentrack_listen_port")) { int_config(key, value, &cfg->port); } else if (equal(key, "external_mode")) { ot_source_enabled = list_string_contains("opentrack", value); } else if (equal(key, "opentrack_app_ip")) { string_config(key, value, &ot_source_ip); } else if (equal(key, "opentrack_app_port")) { int_config(key, value, &ot_source_port); } } #define OT_UDP_TIMEOUT_MS 500 static const struct timeval OT_SELECT_TIMEOUT = { .tv_sec = 0, .tv_usec = OT_UDP_TIMEOUT_MS * 1000 }; static void* opentrack_listener_thread_func(void* arg) { (void)arg; uint8_t buf[6 * sizeof(double) + sizeof(uint32_t)]; while (!driver_disabled() && ot_cfg && ot_cfg->enabled && udp_fd != -1) { fd_set rfds; FD_ZERO(&rfds); FD_SET(udp_fd, &rfds); struct timeval tv = OT_SELECT_TIMEOUT; int sel = select(udp_fd + 1, &rfds, NULL, NULL, &tv); if (sel == 0) { // timed out if (connected) listener_device_disconnect(); continue; } else if (sel < 0) { if (errno == EINTR) continue; if (config()->debug_device) log_debug("opentrack listener: select error: %s\n", strerror(errno)); usleep(1000); continue; } ssize_t n = recvfrom(udp_fd, buf, sizeof(buf), 0, NULL, NULL); if (n < 0) { if (errno == EINTR) continue; if (config()->debug_device) log_debug("opentrack listener: recvfrom error: %s\n", strerror(errno)); usleep(1000); continue; } if (n < (ssize_t)(6 * sizeof(double))) continue; // If we're guarding against a feedback loop, discard packets silently if (feedback_loop_ignore) { continue; } if (!connected) { connected_device_type *nd = calloc(1, sizeof(connected_device_type)); nd->driver = &opentrack_driver; nd->device = make_opentrack_device_properties(); handle_device_connection_changed(true, nd); pthread_mutex_lock(&conn_mutex); connected = true; pthread_mutex_unlock(&conn_mutex); } static bool prev_block_active = false; if (block_active) { device_properties_type *device = device_checkout(); if (device) { // Only feed events when block_on_device is active double vals[6]; memcpy(vals, buf, 6 * sizeof(double)); imu_euler_type e = { .roll = (float)vals[5], .pitch = (float)vals[4], .yaw = (float)vals[3] }; imu_quat_type q = euler_to_quaternion_zyx(e); struct timeval tv2; gettimeofday(&tv2, NULL); uint32_t ts_ms = (uint32_t)((tv2.tv_sec * 1000ULL) + (tv2.tv_usec / 1000ULL)); static uint32_t start_ts_ms = 0; // set on first active event if (!prev_block_active) { start_ts_ms = ts_ms; } // OpenTrack reports in EUS; convert to NWU float full_distance_cm = LENS_TO_PIVOT_CM / device->lens_distance_ratio; imu_vec3_type pos = { .x = (float)-vals[2] / full_distance_cm, .y = (float)-vals[0] / full_distance_cm, .z = (float)vals[1] / full_distance_cm }; imu_pose_type pose = (imu_pose_type){0}; pose.orientation = q; pose.position = pos; pose.has_orientation = true; pose.has_position = true; pose.timestamp_ms = ts_ms - start_ts_ms; connection_pool_ingest_pose(OT_DRIVER_ID, pose); } device_checkin(device); } prev_block_active = block_active; } listener_running = false; return NULL; } static void opentrack_start_func() { // If disabled, stop listener and close socket if (driver_disabled() || !ot_cfg || !ot_cfg->enabled) { listener_device_disconnect(); opentrack_close_socket(); if (listener_running) { pthread_join(listener_thread, NULL); listener_running = false; } return; } // Enabled: ensure bound if (udp_fd == -1) { const char *ip = ot_cfg->ip && ot_cfg->ip[0] ? ot_cfg->ip : NULL; int port = ot_cfg->port > 0 ? ot_cfg->port : 4242; if (!opentrack_bind_socket(ip, port)) { log_error("OpenTrack listener: failed to bind on %s:%d; leaving disabled\n", ip ? ip : "*", port); return; } char ipstr[128] = {0}; if (ip && ip[0]) strncpy(ipstr, ip, sizeof(ipstr)-1); else strncpy(ipstr, "*", sizeof(ipstr)-1); log_message("OpenTrack listener bound on %s:%d\n", ipstr, port); } // Start listener thread to manage registration, feeding, and idle disconnect if (!listener_running) { listener_running = true; pthread_create(&listener_thread, NULL, opentrack_listener_thread_func, NULL); } } static void opentrack_set_config_func(void *new_config) { opentrack_listener_config *new_cfg = (opentrack_listener_config *)new_config; if (!new_cfg) return; bool first = (ot_cfg == NULL); if (!first) { bool was_enabled = ot_cfg && ot_cfg->enabled; if (was_enabled != new_cfg->enabled) log_message("OpenTrack listener has been %s\n", new_cfg->enabled ? "enabled" : "disabled"); free(ot_cfg->ip); free(ot_cfg); } ot_cfg = new_cfg; opentrack_start_func(); update_feedback_guard(); } static void opentrack_handle_device_disconnect_func() { opentrack_disconnect(false); } const plugin_type opentrack_listener_plugin = { .id = "opentrack_listener", .default_config = opentrack_default_config_func, .handle_config_line = opentrack_handle_config_line_func, .set_config = opentrack_set_config_func, .start = opentrack_start_func, .handle_device_disconnect = opentrack_handle_device_disconnect_func }; ================================================ FILE: src/plugins/opentrack_source.c ================================================ #include "config.h" #include "logging.h" #include "plugins.h" #include "plugins/opentrack_source.h" #include "runtime_context.h" #include "strings.h" #include #include #include #include #include #include #include #include #include #include #include #include static opentrack_source_config *ot_config = NULL; static int udp_fd = -1; static struct sockaddr_storage udp_addr; static socklen_t udp_addr_len = 0; static uint32_t frame_number = 0; static void opentrack_close_socket() { if (udp_fd != -1) { close(udp_fd); udp_fd = -1; } udp_addr_len = 0; } static bool opentrack_open_socket(const char *ip, int port) { opentrack_close_socket(); struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // Allow IPv4 or IPv6 hints.ai_socktype = SOCK_DGRAM; // UDP hints.ai_flags = 0; // No special flags; numeric or hostname char port_str[16]; snprintf(port_str, sizeof(port_str), "%d", port); // Accept IPv6 literals optionally wrapped in brackets like [::1] const char *host = ip; char hostbuf[256]; if (!host || host[0] == '\0') { host = "127.0.0.1"; } else { size_t len = strlen(host); if (len >= 2 && host[0] == '[' && host[len - 1] == ']') { size_t n = len - 2; if (n >= sizeof(hostbuf)) n = sizeof(hostbuf) - 1; memcpy(hostbuf, host + 1, n); hostbuf[n] = '\0'; host = hostbuf; } } struct addrinfo *res = NULL, *rp = NULL; int rc = getaddrinfo(host, port_str, &hints, &res); if (rc != 0) { log_error("opentrack: getaddrinfo('%s', %d) failed: %s\n", host, port, gai_strerror(rc)); return false; } for (rp = res; rp != NULL; rp = rp->ai_next) { udp_fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (udp_fd < 0) continue; memset(&udp_addr, 0, sizeof(udp_addr)); memcpy(&udp_addr, rp->ai_addr, rp->ai_addrlen); udp_addr_len = (socklen_t)rp->ai_addrlen; break; } if (rp == NULL) { log_error("opentrack: socket() failed for all addresses for '%s': %s\n", ip, strerror(errno)); freeaddrinfo(res); return false; } freeaddrinfo(res); return true; } static void *opentrack_default_config_func() { opentrack_source_config *cfg = calloc(1, sizeof(opentrack_source_config)); cfg->enabled = false; cfg->ip = strdup("127.0.0.1"); cfg->port = 4242; return cfg; } static void opentrack_handle_config_line_func(void *config, char *key, char *value) { opentrack_source_config *cfg = (opentrack_source_config *)config; if (!cfg) return; if (equal(key, "external_mode")) { cfg->enabled = list_string_contains("opentrack", value); } else if (equal(key, "opentrack_app_ip")) { string_config(key, value, &cfg->ip); } else if (equal(key, "opentrack_app_port")) { int_config(key, value, &cfg->port); } } static void opentrack_set_config_func(void *new_config) { opentrack_source_config *new_cfg = (opentrack_source_config *)new_config; if (!new_cfg) return; bool first = ot_config == NULL; bool reopen = false; if (!first) { if (ot_config->enabled != new_cfg->enabled) log_message("OpenTrack UDP source has been %s\n", new_cfg->enabled ? "enabled" : "disabled"); if (strcmp(ot_config->ip ? ot_config->ip : "", new_cfg->ip ? new_cfg->ip : "") != 0) { log_message("OpenTrack source's target IP changed to %s\n", new_cfg->ip); reopen = true; } if (ot_config->port != new_cfg->port) { log_message("OpenTrack source port changed to %d\n", new_cfg->port); reopen = true; } free(ot_config->ip); free(ot_config); } ot_config = new_cfg; if (ot_config->enabled) { if (first || reopen || udp_fd == -1) { if (opentrack_open_socket(ot_config->ip, ot_config->port)) { log_message("OpenTrack UDP target: %s:%d\n", ot_config->ip, ot_config->port); } } } else { opentrack_close_socket(); } } static void opentrack_handle_device_disconnect_func() { // keep socket open; opentrack may still accept data for other sources frame_number = 0; } static void opentrack_handle_pose_data_func(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values) { (void)ipc_values; if (!ot_config || !ot_config->enabled || !imu_calibrated || udp_fd == -1) return; // Map to OpenTrack expected payload: 6 doubles (x,y,z,yaw,pitch,roll) + uint32 frame number // Units: the PHP PoC scaled position by 10 and used degrees for yaw/pitch/roll. double payload[6] = {0}; // XR driver tracks in NWU, convert to EUS if (pose.has_position) { payload[0] = -pose.position.y; payload[1] = pose.position.z; payload[2] = -pose.position.x; } if (pose.has_orientation) { payload[3] = pose.euler.yaw; payload[4] = pose.euler.pitch; payload[5] = pose.euler.roll; } // Build buffer: 6 doubles + uint32 uint8_t buffer[6 * sizeof(double) + sizeof(uint32_t)]; memcpy(buffer, payload, 6 * sizeof(double)); uint32_t fn = frame_number++; memcpy(buffer + 6 * sizeof(double), &fn, sizeof(uint32_t)); ssize_t to_send = sizeof(buffer); ssize_t sent = sendto(udp_fd, buffer, to_send, 0, (struct sockaddr *)&udp_addr, udp_addr_len); if (sent < 0) { static int err_count = 0; if (err_count++ % 100 == 0) // rate limit errors log_error("opentrack: sendto failed: %s\n", strerror(errno)); } } static void opentrack_reset_pose_data_func() { frame_number = 0; } const plugin_type opentrack_source_plugin = { .id = "opentrack_source", .default_config = opentrack_default_config_func, .handle_config_line = opentrack_handle_config_line_func, .set_config = opentrack_set_config_func, .handle_pose_data = opentrack_handle_pose_data_func, .reset_pose_data = opentrack_reset_pose_data_func, .handle_device_disconnect = opentrack_handle_device_disconnect_func }; ================================================ FILE: src/plugins/sideview.c ================================================ #include "config.h" #include "devices.h" #include "ipc.h" #include "logging.h" #include "plugins.h" #include "plugins/gamescope_reshade_wayland.h" #include "plugins/sideview.h" #include "runtime_context.h" #include "strings.h" #include #include const char *sideview_position_names[SIDEVIEW_POSITION_COUNT] = { "top_left", "top_right", "bottom_left", "bottom_right", "center" }; sideview_config *sv_config; sideview_ipc_values_type *sideview_ipc_values; void *sideview_default_config_func() { sideview_config *config = calloc(1, sizeof(sideview_config)); config->enabled = false; config->position = 4; // center return config; }; void sideview_handle_config_line_func(void* config, char* key, char* value) { sideview_config* temp_config = (sideview_config*) config; if (equal(key, "external_mode")) { temp_config->enabled = list_string_contains("sideview", value); } else if (equal(key, "sideview_position")) { for (int i = 0; i < SIDEVIEW_POSITION_COUNT; i++) { if (equal(value, sideview_position_names[i])) { temp_config->position = i; return; } } } }; void sideview_handle_device_disconnect_func() { bool enabled = false; if (sideview_ipc_values) *sideview_ipc_values->enabled = enabled; set_gamescope_reshade_effect_uniform_variable("sideview_enabled", &enabled, 1, sizeof(bool), true); }; void set_sideview_ipc_values_from_config() { if (!sv_config) sv_config = sideview_default_config_func(); if (device_present()) { bool enabled = sv_config->enabled && !config()->disabled; float position = (float) sv_config->position; if (sideview_ipc_values) { *sideview_ipc_values->enabled = enabled && !is_gamescope_reshade_ipc_connected(); *sideview_ipc_values->position = position; } bool gamescope_enabled = enabled && is_gamescope_reshade_ipc_connected(); set_gamescope_reshade_effect_uniform_variable("sideview_enabled", &gamescope_enabled, 1, sizeof(bool), false); set_gamescope_reshade_effect_uniform_variable("sideview_position", &position, 1, sizeof(float), false); } else { sideview_handle_device_disconnect_func(); } } void sideview_set_config_func(void* config) { if (!config) return; sideview_config* temp_config = (sideview_config*) config; if (sv_config) { if (sv_config->enabled != temp_config->enabled) log_message("Sideview has been %s\n", temp_config->enabled ? "enabled" : "disabled"); if (sv_config->position != temp_config->position) log_message("Sideview position has been changed to %s\n", sideview_position_names[temp_config->position]); free(sv_config); } sv_config = temp_config; set_sideview_ipc_values_from_config(); }; const char *sideview_enabled_name = "sideview_enabled"; const char *sideview_position_name = "sideview_position"; bool sideview_setup_ipc_func() { bool debug = config()->debug_ipc; if (!sideview_ipc_values) sideview_ipc_values = calloc(1, sizeof(sideview_ipc_values_type)); setup_ipc_value(sideview_enabled_name, (void**) &sideview_ipc_values->enabled, sizeof(bool), debug); setup_ipc_value(sideview_position_name, (void**) &sideview_ipc_values->position, sizeof(float), debug); set_sideview_ipc_values_from_config(); return true; } const plugin_type sideview_plugin = { .id = "sideview", .default_config = sideview_default_config_func, .handle_config_line = sideview_handle_config_line_func, .set_config = sideview_set_config_func, .setup_ipc = sideview_setup_ipc_func, .handle_ipc_change = set_sideview_ipc_values_from_config, .handle_device_connect = set_sideview_ipc_values_from_config, .handle_device_disconnect = sideview_handle_device_disconnect_func }; ================================================ FILE: src/plugins/smooth_follow.c ================================================ #include "buffer.h" #include "config.h" #include "features/breezy_desktop.h" #include "features/smooth_follow.h" #include "imu.h" #include "ipc.h" #include "logging.h" #include "memory.h" #include "plugins/gamescope_reshade_wayland.h" #include "plugins/smooth_follow.h" #include "runtime_context.h" #include "state.h" #include "strings.h" #include #include #include #include typedef enum { FOLLOW_STATE_NONE, FOLLOW_STATE_INIT, FOLLOW_STATE_WAITING, FOLLOW_STATE_SLERPING } follow_state_type; const smooth_follow_params init_params = { .lower_angle_threshold = 2.0, .upper_angle_threshold = 2.0, .delay_ms = 0, .return_to_angle = 2.0, // moves 99.9% of the way to the center in 1 second .interpolation_ratio_ms = 1-pow(1 - 0.999, 1.0/1000.0) }; const smooth_follow_params sticky_params = { .lower_angle_threshold = 0.5, .upper_angle_threshold = 0.5, .delay_ms = 0, .return_to_angle = 0.5, // moves 99% of the way to the center in 1 second .interpolation_ratio_ms = 1-pow(1 - 0.99, 1.0/1000.0) }; const smooth_follow_params loose_follow_params = { .lower_angle_threshold = 20.0, .upper_angle_threshold = 40.0, .delay_ms = 2000, .return_to_angle = 5.0, // moves 99% of the way to the center in 1.5 seconds .interpolation_ratio_ms = 1-pow(1 - 0.99, 1.0/1500.0) }; uint32_t get_time_ms() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } smooth_follow_config* sf_config = NULL; smooth_follow_params* sf_params = NULL; void *smooth_follow_default_config_func() { smooth_follow_config *config = calloc(1, sizeof(smooth_follow_config)); config->virtual_display_enabled = false; config->virtual_display_follow_enabled = false; config->sideview_enabled = false; config->sideview_follow_enabled = false; config->sideview_follow_threshold = 0.5; config->breezy_desktop_enabled = false; config->display_distance = 1.0; config->display_size = 1.0; config->track_roll = false; config->track_pitch = true; config->track_yaw = true; return config; }; // TODO - This has become a bit of a mess with smooth_follow having to be aware of how it interacts with // 3 other plugins and their configs and control flags. Smooth follow should just become a utility // function that any plugin can utilize however it deems appropriate. void smooth_follow_handle_config_line_func(void* config, char* key, char* value) { smooth_follow_config* temp_config = (smooth_follow_config*) config; if (equal(key, "virtual_display_smooth_follow_enabled")) { boolean_config(key, value, &temp_config->virtual_display_follow_enabled); } else if (equal(key, "sideview_smooth_follow_enabled")) { boolean_config(key, value, &temp_config->sideview_follow_enabled); } else if (equal(key, "sideview_follow_threshold")) { float_config(key, value, &temp_config->sideview_follow_threshold); } else if (equal(key, "external_mode")) { if (list_string_contains("virtual_display", value)) { temp_config->virtual_display_enabled = true; } if (list_string_contains("sideview", value)) { temp_config->sideview_enabled = true; } if (list_string_contains("breezy_desktop", value)) { temp_config->breezy_desktop_enabled = true; } } else if (equal(key, "display_distance")) { float_config(key, value, &temp_config->display_distance); } else if (equal(key, "display_size")) { float_config(key, value, &temp_config->display_size); } else if (equal(key, "smooth_follow_track_roll")) { boolean_config(key, value, &temp_config->track_roll); } else if (equal(key, "smooth_follow_track_pitch")) { boolean_config(key, value, &temp_config->track_pitch); } else if (equal(key, "smooth_follow_track_yaw")) { boolean_config(key, value, &temp_config->track_yaw); } } static bool smooth_follow_enabled=false; follow_state_type follow_state = FOLLOW_STATE_NONE; uint32_t last_timestamp_ms = -1; static imu_pose_type *origin_pose = NULL; uint32_t start_snap_back_timestamp_ms = -1; static bool was_sbs_mode_enabled = false; static void update_smooth_follow_params() { if (!sf_params) sf_params = calloc(1, sizeof(smooth_follow_params)); bool virtual_display_follow = sf_config->virtual_display_enabled && sf_config->virtual_display_follow_enabled; bool smooth_follow = sf_config->sideview_enabled && sf_config->sideview_follow_enabled; bool breezy_desktop_follow = sf_config->breezy_desktop_enabled && state()->breezy_desktop_smooth_follow_enabled; device_properties_type* device = device_checkout(); if (device != NULL) { float half_fov = device->fov / 2.0; if (virtual_display_follow) { *sf_params = loose_follow_params; float device_fov_threshold = device->fov * sf_config->display_size / sf_config->display_distance; sf_params->lower_angle_threshold = device_fov_threshold; sf_params->upper_angle_threshold = device_fov_threshold * 2.0; } else if (smooth_follow) { *sf_params = sticky_params; bool widescreen = state()->sbs_mode_enabled && is_gamescope_reshade_ipc_connected(); float threshold = sf_params->lower_angle_threshold; if (sf_config->sideview_follow_threshold) threshold = sf_config->sideview_follow_threshold; float display_size = fmax(1.0, sf_config->display_size * (widescreen ? 2.0 : 1.0)); // this calculation tends to fall short for sizes > 1.0, so increase by 25% threshold += half_fov * (display_size - 1.0) * 1.25; threshold = fmax(sf_params->lower_angle_threshold, threshold); sf_params->lower_angle_threshold = threshold; sf_params->upper_angle_threshold = threshold; sf_params->return_to_angle = threshold; } else if (breezy_desktop_follow) { *sf_params = sticky_params; float display_distance = 1.0; float threshold = sf_params->lower_angle_threshold; if (state()->breezy_desktop_display_distance) display_distance = state()->breezy_desktop_display_distance; if (state()->breezy_desktop_follow_threshold) threshold = state()->breezy_desktop_follow_threshold; threshold += half_fov * (1.0 / display_distance - 1.0); threshold = fmax(sf_params->lower_angle_threshold, threshold); sf_params->lower_angle_threshold = threshold; sf_params->upper_angle_threshold = threshold; sf_params->return_to_angle = threshold; } } device_checkin(device); was_sbs_mode_enabled = state()->sbs_mode_enabled; bool was_smooth_follow_enabled = smooth_follow_enabled; smooth_follow_enabled = is_smooth_follow_granted() && (virtual_display_follow || smooth_follow); smooth_follow_enabled |= is_productivity_granted() && breezy_desktop_follow; if (!smooth_follow_enabled && was_smooth_follow_enabled && origin_pose) { // we'll want to return as close to the original center as possible *sf_params = sticky_params; } if (smooth_follow_enabled && !was_smooth_follow_enabled) { start_snap_back_timestamp_ms = -1; last_timestamp_ms = -1; *sf_params = init_params; follow_state = FOLLOW_STATE_INIT; } } void smooth_follow_set_config_func(void* config) { if (!config) return; smooth_follow_config* temp_config = (smooth_follow_config*) config; if (sf_config) { if (temp_config->virtual_display_enabled && ( sf_config->virtual_display_follow_enabled != temp_config->virtual_display_follow_enabled || sf_config->virtual_display_enabled != temp_config->virtual_display_enabled)) log_message("Virtual display follow has been %s\n", temp_config->virtual_display_follow_enabled ? "enabled" : "disabled"); if (temp_config->sideview_enabled && sf_config->sideview_follow_enabled != temp_config->sideview_follow_enabled || sf_config->sideview_enabled != temp_config->sideview_enabled && temp_config->sideview_follow_enabled) log_message("Sideview follow has been %s\n", temp_config->sideview_follow_enabled ? "enabled" : "disabled"); if (temp_config->sideview_follow_threshold != sf_config->sideview_follow_threshold) log_message("Sideview follow threshold has been changed to %f\n", temp_config->sideview_follow_threshold); free(sf_config); } sf_config = temp_config; update_smooth_follow_params(); } uint32_t follow_wait_time_start_ms = -1; follow_state_type next_state_for_angle(float angle_degrees) { if (follow_state == FOLLOW_STATE_INIT) { // double the return-to-angle so the movement will be more aggressive towards the center than usual if (!isnan(angle_degrees) && angle_degrees < sf_params->return_to_angle * 2.0) { follow_state = FOLLOW_STATE_NONE; update_smooth_follow_params(); } } else { if (isnan(angle_degrees) || angle_degrees < sf_params->return_to_angle || follow_state != FOLLOW_STATE_SLERPING && angle_degrees < sf_params->lower_angle_threshold) { follow_state = FOLLOW_STATE_NONE; } else if (angle_degrees > sf_params->lower_angle_threshold && angle_degrees < sf_params->upper_angle_threshold && sf_params->delay_ms > 0) { if (follow_state == FOLLOW_STATE_NONE) { follow_state = FOLLOW_STATE_WAITING; follow_wait_time_start_ms = get_time_ms(); } else if (follow_state == FOLLOW_STATE_WAITING) { if (get_time_ms() - follow_wait_time_start_ms > sf_params->delay_ms) { follow_state = FOLLOW_STATE_SLERPING; } } } else { follow_state = FOLLOW_STATE_SLERPING; } } return follow_state; } float percent_adjust(float multiplier, float percent, bool inverse) { float percent_compliment = 1.0 - percent; if (!inverse) return multiplier * percent_compliment + percent; float multiplier_compliment = 1.0 - multiplier; return 1.0 - (multiplier_compliment * percent_compliment + percent); } // ported and modified from https://github.com/g-truc/glm/blob/master/glm/ext/quaternion_common.inl // if slerping threshold is met, this returns a quaternion that's "a" percent of the way between "from" and "to" imu_quat_type slerp(imu_quat_type from, imu_quat_type to, float a) { imu_quat_type target = to; // modify the target orientation to filter out unwanted axes based on configured tracking preferences if (origin_pose && smooth_follow_enabled && (!sf_config->track_roll || !sf_config->track_pitch || !sf_config->track_yaw)) { // since we're going to convert the target to euler angles, we should first understand the target // relative to the origin to reduce the chances of gimbal locking (the user is more likely to be facing // towards the origin). this will also lock the non-tracked axes relative to the origin, which makes the // most sense for smooth follow. imu_quat_type to_rel = multiply_quaternions(conjugate(origin_pose->orientation), to); imu_euler_type to_euler = quaternion_to_euler_zyx(to_rel); // ignore tracking preferences if smooth_follow_enabled is false, since we want to fully return to // the original center imu_euler_type target_euler; target_euler.roll = sf_config->track_roll ? to_euler.roll : 0.0; target_euler.pitch = sf_config->track_pitch ? to_euler.pitch : 0.0; target_euler.yaw = sf_config->track_yaw ? to_euler.yaw : 0.0; // the result is relative to origin_quat, so we need to reapply it target = multiply_quaternions(origin_pose->orientation, euler_to_quaternion_zyx(target_euler)); } if (a < 0.0f) a = 0.0f; if (a > 1.0f) a = 1.0f; from = normalize_quaternion(from); target = normalize_quaternion(target); float cosTheta = from.w * target.w + from.x * target.x + from.y * target.y + from.z * target.z; if (cosTheta < 0) { imu_quat_type tmp = { .w = -target.w, .x = -target.x, .y = -target.y, .z = -target.z }; target = tmp; cosTheta = -cosTheta; } if (cosTheta > 1.0f) cosTheta = 1.0f; if (cosTheta < -1.0f) cosTheta = -1.0f; float half_angle = acosf(cosTheta); follow_state_type next_state = next_state_for_angle(radian_to_degree(2 * half_angle)); if (next_state == FOLLOW_STATE_SLERPING || next_state == FOLLOW_STATE_INIT) { // our return-to-angle gives us a margin around the center of the target, and we want to stop when // we hit that margin, not the center. if we don't factor that margin into the target, then we may still // be slerping pretty quickly when we hit the return-to-angle, then stop very abruptly. the below factors // return-to-angle into the target so we accelerate very smoothly to the edge of that margin. // target 95% of the return-to-angle, otherwise it becomes an asymptote and we'll never stop slerping float target_half_angle = degree_to_radian(sf_params->return_to_angle * 0.95) / 2.0; // how much of the current angle is the target angle, 100% means we're already at the desired return-to-angle float target_percent = half_angle > 0.0f ? (target_half_angle / half_angle) : 1.0f; // half of the remaining angle to the target half_angle -= target_half_angle; float a_compliment = 1 - a; float sin_of_angle = sinf(half_angle); if (fabsf(sin_of_angle) <= 1e-6f) { imu_quat_type result = { .w = (1.0f - a) * from.w + a * target.w, .x = (1.0f - a) * from.x + a * target.x, .y = (1.0f - a) * from.y + a * target.y, .z = (1.0f - a) * from.z + a * target.z }; return normalize_quaternion(result); } float from_weight = percent_adjust(sinf(a_compliment * half_angle) / sin_of_angle, target_percent, false); float target_weight = percent_adjust(sinf(a * half_angle) / sin_of_angle, target_percent, true); imu_quat_type result = { .w = from_weight * from.w + target_weight * target.w, .x = from_weight * from.x + target_weight * target.x, .y = from_weight * from.y + target_weight * target.y, .z = from_weight * from.z + target_weight * target.z }; return normalize_quaternion(result); } return from; } imu_buffer_type *smooth_follow_imu_buffer = NULL; bool smooth_follow_modify_reference_pose_func(imu_pose_type pose, imu_pose_type* ref_pose) { if ((!smooth_follow_enabled && !origin_pose) || !sf_params) { return false; } if (last_timestamp_ms == -1) { last_timestamp_ms = pose.timestamp_ms; return false; } if (follow_state == FOLLOW_STATE_NONE) { last_timestamp_ms = pose.timestamp_ms; } uint32_t elapsed_ms = pose.timestamp_ms - last_timestamp_ms; last_timestamp_ms = pose.timestamp_ms; if (origin_pose) { // allow 6DoF some freedom to move around in the forward/back direction within a half-meter float full_distance_cm = state()->connected_device_full_distance_cm; if (full_distance_cm > 0.0f && state()->connected_device_pose_has_position) { float half_meter_units = 50.0f / full_distance_cm; // transiently rotate into the current pose frame so we clamp along "forward" // instead of a fixed world axis, then rotate back. imu_quat_type inv_pose_orientation = conjugate(pose.orientation); imu_vec3_type pose_local = vector_rotate(pose.position, inv_pose_orientation); imu_vec3_type ref_local = vector_rotate(ref_pose->position, inv_pose_orientation); float delta_forward = pose_local.x - ref_local.x; // always follow in the up/down/left/right axes ref_local.y = pose_local.y; ref_local.z = pose_local.z; // forward axes has freedom to move around unless it's more than a half-meter away if (fabsf(delta_forward) >= half_meter_units) { float scale = half_meter_units / fabsf(delta_forward); ref_local.x = pose_local.x - delta_forward * scale; } ref_pose->position = vector_rotate(ref_local, pose.orientation); } else { ref_pose->position = pose.position; } if (!smooth_follow_imu_buffer) { device_properties_type* device = device_checkout(); if (device != NULL) smooth_follow_imu_buffer = create_imu_buffer(device->imu_buffer_size); device_checkin(device); } if (smooth_follow_imu_buffer) { // capture how far we are from the original screen center imu_quat_type delta_quat = multiply_quaternions(conjugate(origin_pose->orientation), pose.orientation); // for visual consistency with how screen placement behaves when smooth follow is disabled, // trigger the modify_pose hook imu_pose_type delta_pose = { .timestamp_ms = pose.timestamp_ms, .orientation = delta_quat, .position = (imu_vec3_type){0.0f,0.0f,0.0f}, .euler = quaternion_to_euler_zyx(delta_quat) }; plugins.modify_pose(&delta_pose); delta_quat = delta_pose.orientation; imu_buffer_response_type* response = push_to_imu_buffer( smooth_follow_imu_buffer, delta_quat, pose.timestamp_ms ); state()->smooth_follow_origin_ready = response && response->ready; if (state()->smooth_follow_origin_ready) { memcpy(state()->smooth_follow_origin, response->data, sizeof(float) * 16); } free(response); } // smooth follow has been disabled, slerp the screen back to its original center if (!smooth_follow_enabled) { if (start_snap_back_timestamp_ms == -1) { start_snap_back_timestamp_ms = pose.timestamp_ms; } uint32_t elapsed_snap_back_ms = pose.timestamp_ms - start_snap_back_timestamp_ms; ref_pose->orientation = slerp(ref_pose->orientation, origin_pose->orientation, 1 - pow(1 - sf_params->interpolation_ratio_ms, elapsed_ms)); // our return-to-angle is so small it will never hit the target, kill the snap-back slerp after 2 seconds if (follow_state == FOLLOW_STATE_NONE || elapsed_snap_back_ms > 2000) { follow_state = FOLLOW_STATE_NONE; ref_pose->orientation = origin_pose->orientation; ref_pose->position = origin_pose->position; // we've reached our destination, clear this out to stop slerping free_and_clear(&origin_pose); free_and_clear(&state()->smooth_follow_origin); state()->smooth_follow_origin_ready = false; start_snap_back_timestamp_ms = -1; } return true; } } else { // smooth follow was just enabled, capture the origin before it changes origin_pose = calloc(1, sizeof(imu_pose_type)); origin_pose->orientation = ref_pose->orientation; origin_pose->position = ref_pose->position; origin_pose->has_orientation = ref_pose->has_orientation; origin_pose->has_position = ref_pose->has_position; if (!state()->smooth_follow_origin) state()->smooth_follow_origin = calloc(16, sizeof(float)); state()->smooth_follow_origin_ready = false; } ref_pose->orientation = slerp(ref_pose->orientation, pose.orientation, 1 - pow(1 - sf_params->interpolation_ratio_ms, elapsed_ms)); return true; } // unlike gaming, smooth follow for desktop is a temporary state, handled via control flags rather than persistent config void smooth_follow_handle_control_flag_line_func(char* key, char* value) { if (is_productivity_granted() && sf_config->breezy_desktop_enabled) { bool was_enabled = state()->breezy_desktop_smooth_follow_enabled == true; if (equal(key, "enable_breezy_desktop_smooth_follow")) { boolean_config(key, value, &state()->breezy_desktop_smooth_follow_enabled); } else if (equal(key, "toggle_breezy_desktop_smooth_follow")) { state()->breezy_desktop_smooth_follow_enabled = !state()->breezy_desktop_smooth_follow_enabled; } // these will be applied to the thresholds on the next call to update_smooth_follow_params() if (equal(key, "breezy_desktop_follow_threshold")) { float_config(key, value, &state()->breezy_desktop_follow_threshold); } if (equal(key, "breezy_desktop_display_distance")) { float_config(key, value, &state()->breezy_desktop_display_distance); } if (was_enabled != state()->breezy_desktop_smooth_follow_enabled) log_message("Breezy Desktop follow has been %s\n", state()->breezy_desktop_smooth_follow_enabled ? "enabled" : "disabled"); update_smooth_follow_params(); } } static void smooth_follow_handle_state_func() { if (was_sbs_mode_enabled != state()->sbs_mode_enabled) { update_smooth_follow_params(); } } static void handle_device_disconnect() { last_timestamp_ms = -1; follow_state = FOLLOW_STATE_NONE; follow_wait_time_start_ms = -1; start_snap_back_timestamp_ms = -1; free_and_clear(&origin_pose); free_and_clear(&state()->smooth_follow_origin); state()->smooth_follow_origin_ready = false; } static void smooth_follow_handle_reference_pose_updated_func(imu_pose_type old_reference_pose, imu_pose_type new_reference_pose) { (void)old_reference_pose; if (!origin_pose) return; origin_pose->orientation = new_reference_pose.orientation; origin_pose->position = new_reference_pose.position; origin_pose->has_orientation = new_reference_pose.has_orientation; origin_pose->has_position = new_reference_pose.has_position; follow_state = FOLLOW_STATE_NONE; follow_wait_time_start_ms = -1; start_snap_back_timestamp_ms = -1; } const plugin_type smooth_follow_plugin = { .id = "smooth_follow", .default_config = smooth_follow_default_config_func, .handle_config_line = smooth_follow_handle_config_line_func, .handle_control_flag_line = smooth_follow_handle_control_flag_line_func, .set_config = smooth_follow_set_config_func, .handle_state = smooth_follow_handle_state_func, .handle_ipc_change = update_smooth_follow_params, .modify_reference_pose = smooth_follow_modify_reference_pose_func, .handle_reference_pose_updated = smooth_follow_handle_reference_pose_updated_func, .handle_device_connect = update_smooth_follow_params, .handle_device_disconnect = handle_device_disconnect }; ================================================ FILE: src/plugins/virtual_display.c ================================================ #include "config.h" #include "devices.h" #include "features/smooth_follow.h" #include "features/sbs.h" #include "imu.h" #include "ipc.h" #include "logging.h" #include "plugins.h" #include "plugins/gamescope_reshade_wayland.h" #include "plugins/smooth_follow.h" #include "plugins/virtual_display.h" #include "runtime_context.h" #include "state.h" #include #include #include #include #include #include virtual_display_config *vd_config; virtual_display_ipc_values_type *virtual_display_ipc_values; const int virtual_display_feature_count = 2; void virtual_display_reset_config(virtual_display_config *config) { config->enabled = false; config->look_ahead_override = 0.0; config->display_distance = 1.0; config->display_size = 1.0; config->sbs_content = false; config->sbs_mode_stretched = true; config->passthrough_smooth_follow_enabled = false; config->follow_mode_enabled = false; config->curved_display = false; }; void *virtual_display_default_config_func() { virtual_display_config *config = calloc(1, sizeof(virtual_display_config)); virtual_display_reset_config(config); return config; }; void virtual_display_handle_config_line_func(void* config, char* key, char* value) { virtual_display_config* temp_config = (virtual_display_config*) config; if (equal(key, "external_mode")) { temp_config->enabled = list_string_contains("virtual_display", value); temp_config->follow_mode_enabled = list_string_contains("sideview", value); } else if (equal(key, "look_ahead")) { float_config(key, value, &temp_config->look_ahead_override); } else if (equal(key, "display_distance")) { float_config(key, value, &temp_config->display_distance); } else if (equal(key, "display_size")) { float_config(key, value, &temp_config->display_size); } else if (equal(key, "sbs_content")) { boolean_config(key, value, &temp_config->sbs_content); } else if (equal(key, "sbs_mode_stretched")) { boolean_config(key, value, &temp_config->sbs_mode_stretched); } else if (equal(key, "sideview_smooth_follow_enabled") && is_smooth_follow_granted()) { boolean_config(key, value, &temp_config->passthrough_smooth_follow_enabled); } else if (equal(key, "curved_display")) { boolean_config(key, value, &temp_config->curved_display); } }; void virtual_display_handle_device_disconnect_func() { bool enabled = false; if (virtual_display_ipc_values) *virtual_display_ipc_values->enabled = enabled; set_gamescope_reshade_effect_uniform_variable("virtual_display_enabled", &enabled, 1, sizeof(bool), true); }; void set_virtual_display_ipc_values() { if (!vd_config) vd_config = virtual_display_default_config_func(); device_properties_type* device = device_checkout(); if (device != NULL) { bool enabled = !config()->disabled && (vd_config->enabled || vd_config->follow_mode_enabled && vd_config->passthrough_smooth_follow_enabled); bool show_banner = enabled && state()->calibration_state == CALIBRATING; float look_ahead_constant = vd_config->look_ahead_override == 0 ? device->look_ahead_constant : vd_config->look_ahead_override; float look_ahead_ftm = vd_config->look_ahead_override == 0 ? device->look_ahead_frametime_multiplier : 0.0; float look_ahead_cfg[4] = {look_ahead_constant, look_ahead_ftm, device->look_ahead_scanline_adjust, device->look_ahead_ms_cap}; // computed values based on display config/state bool pose_has_position = state()->connected_device_pose_has_position; float display_north_offset = (pose_has_position || state()->sbs_mode_enabled) ? vd_config->display_distance : 1.0; float display_aspect_ratio = (float)device->resolution_w / (float)device->resolution_h; float diag_to_vert_ratio = sqrt(pow(display_aspect_ratio, 2) + 1); float half_fov_z_rads = degree_to_radian(device->fov / diag_to_vert_ratio) / 2; float half_fov_y_rads = half_fov_z_rads * display_aspect_ratio; float fov_half_widths[2] = {tan(half_fov_y_rads), tan(half_fov_z_rads)}; float fov_widths[2] = {fov_half_widths[0] * 2, fov_half_widths[1] * 2}; float texcoord_x_limits[2] = {0.0, 1.0}; float texcoord_x_limits_r[2] = {0.0, 1.0}; // for 3DoF-only devices, the north offset creates a realistic shift in viewport position based // on orientation, but 6DoF devices give us the actual position, so we don't use the lens north // offset to avoid double shifting float lens_north_offset = pose_has_position ? 0.0 : device->lens_distance_ratio; float lens_vector[3] = {lens_north_offset, 0.0, 0.0}; float lens_vector_r[3] = {lens_north_offset, 0.0, 0.0}; // gamescope's texture will always be full width (no black bars) bool sbs_mode_full_width = is_gamescope_reshade_ipc_connected() || vd_config->sbs_mode_stretched; // if using vkBasalt as an implicit layer and the content is full screen, it must have been stretched, // if this is true it tells the shader to consider the real width of the content to be half of the texture width bool sbs_mode_stretched = !is_gamescope_reshade_ipc_connected() && vd_config->sbs_mode_stretched; if (state()->sbs_mode_enabled) { lens_vector[1] = device->lens_distance_ratio / 3.0; lens_vector_r[1] = -lens_vector[1]; if (vd_config->sbs_content) { texcoord_x_limits[1] = 0.5; texcoord_x_limits_r[0] = 0.5; if (!sbs_mode_full_width) { texcoord_x_limits[0] = 0.25; texcoord_x_limits_r[1] = 0.75; } } else if (!sbs_mode_full_width) { texcoord_x_limits[0] = 0.25; texcoord_x_limits[1] = 0.75; texcoord_x_limits_r[0] = 0.25; texcoord_x_limits_r[1] = 0.75; } } if (virtual_display_ipc_values) { *virtual_display_ipc_values->enabled = enabled && !is_gamescope_reshade_ipc_connected(); *virtual_display_ipc_values->show_banner = show_banner; *virtual_display_ipc_values->display_size = vd_config->display_size; *virtual_display_ipc_values->sbs_mode_stretched = sbs_mode_stretched; *virtual_display_ipc_values->display_north_offset = display_north_offset; *virtual_display_ipc_values->curved_display = vd_config->curved_display; *virtual_display_ipc_values->half_fov_z_rads = half_fov_z_rads; *virtual_display_ipc_values->half_fov_y_rads = half_fov_y_rads; memcpy(virtual_display_ipc_values->look_ahead_cfg, look_ahead_cfg, sizeof(look_ahead_cfg)); memcpy(virtual_display_ipc_values->fov_half_widths, fov_half_widths, sizeof(fov_half_widths)); memcpy(virtual_display_ipc_values->fov_widths, fov_widths, sizeof(fov_widths)); memcpy(virtual_display_ipc_values->texcoord_x_limits, texcoord_x_limits, sizeof(texcoord_x_limits)); memcpy(virtual_display_ipc_values->texcoord_x_limits_r, texcoord_x_limits_r, sizeof(texcoord_x_limits_r)); memcpy(virtual_display_ipc_values->lens_vector, lens_vector, sizeof(lens_vector)); memcpy(virtual_display_ipc_values->lens_vector_r, lens_vector_r, sizeof(lens_vector_r)); } // don't set the "flush" flag here if gamescope is enabled, we'll let the frequent IMU data writes trigger the flush bool gamescope_enabled = enabled && is_gamescope_reshade_ipc_connected(); set_gamescope_reshade_effect_uniform_variable("virtual_display_enabled", &gamescope_enabled, 1, sizeof(bool), !gamescope_enabled); set_gamescope_reshade_effect_uniform_variable("show_banner", &show_banner, 1, sizeof(bool), false); set_gamescope_reshade_effect_uniform_variable("display_size", &vd_config->display_size, 1, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("sbs_mode_stretched", &sbs_mode_stretched, 1, sizeof(bool), false); set_gamescope_reshade_effect_uniform_variable("display_north_offset", &display_north_offset, 1, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("look_ahead_cfg", (void*) look_ahead_cfg, 4, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("curved_display", &vd_config->curved_display, 1, sizeof(bool), false); set_gamescope_reshade_effect_uniform_variable("half_fov_z_rads", &half_fov_z_rads, 1, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("half_fov_y_rads", &half_fov_y_rads, 1, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("fov_half_widths", (void*) fov_half_widths, 2, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("fov_widths", (void*) fov_widths, 2, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("texcoord_x_limits", (void*) texcoord_x_limits, 2, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("texcoord_x_limits_r", (void*) texcoord_x_limits_r, 2, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("lens_vector", (void*) lens_vector, 3, sizeof(float), false); set_gamescope_reshade_effect_uniform_variable("lens_vector_r", (void*) lens_vector_r, 3, sizeof(float), false); } else { virtual_display_handle_device_disconnect_func(); } device_checkin(device); } void virtual_display_set_config_func(void* config) { if (!config) return; virtual_display_config* temp_config = (virtual_display_config*) config; if (vd_config) { if (vd_config->enabled != temp_config->enabled) log_message("Virtual display has been %s\n", temp_config->enabled ? "enabled" : "disabled"); if (temp_config->enabled || temp_config->follow_mode_enabled) { if (vd_config->look_ahead_override != temp_config->look_ahead_override) log_message("Look ahead override has changed to %f\n", temp_config->look_ahead_override); if (vd_config->display_size != temp_config->display_size) log_message("Display size has changed to %f\n", temp_config->display_size); if (vd_config->display_distance != temp_config->display_distance) log_message("Display distance has changed to %f\n", temp_config->display_distance); if (vd_config->sbs_content != temp_config->sbs_content) log_message("SBS content has been changed to %s\n", temp_config->sbs_content ? "enabled" : "disabled"); if (vd_config->sbs_mode_stretched != temp_config->sbs_mode_stretched) log_message("SBS mode has been changed to %s\n", temp_config->sbs_mode_stretched ? "stretched" : "centered"); if (vd_config->curved_display != temp_config->curved_display) log_message("Curved display has been %s\n", temp_config->curved_display ? "enabled" : "disabled"); } free(vd_config); } vd_config = temp_config; set_virtual_display_ipc_values(); }; const char *virtual_display_enabled_ipc_name = "virtual_display_enabled"; const char *virtual_display_show_banner_ipc_name = "show_banner"; const char *virtual_display_look_ahead_cfg_ipc_name = "look_ahead_cfg"; const char *virtual_display_display_size_ipc_name = "display_size"; const char *virtual_display_display_north_offset_ipc_name = "display_north_offset"; const char *virtual_display_sbs_enabled_ipc_name = "sbs_enabled"; const char *virtual_display_sbs_content_ipc_name = "sbs_content"; const char *virtual_display_sbs_mode_stretched_ipc_name = "sbs_mode_stretched"; const char *virtual_display_half_fov_z_rads_ipc_name = "half_fov_z_rads"; const char *virtual_display_half_fov_y_rads_ipc_name = "half_fov_y_rads"; const char *virtual_display_fov_half_widths_ipc_name = "fov_half_widths"; const char *virtual_display_fov_widths_ipc_name = "fov_widths"; const char *virtual_display_texcoord_x_limits_ipc_name = "texcoord_x_limits"; const char *virtual_display_texcoord_x_limits_r_ipc_name = "texcoord_x_limits_r"; const char *virtual_display_lens_vector_ipc_name = "lens_vector"; const char *virtual_display_lens_vector_r_ipc_name = "lens_vector_r"; const char *virtual_display_curved_display_ipc_name = "curved_display"; bool virtual_display_setup_ipc_func() { bool debug = config()->debug_ipc; if (!virtual_display_ipc_values) virtual_display_ipc_values = calloc(1, sizeof(virtual_display_ipc_values_type)); setup_ipc_value(virtual_display_enabled_ipc_name, (void**) &virtual_display_ipc_values->enabled, sizeof(bool), debug); setup_ipc_value(virtual_display_show_banner_ipc_name, (void**) &virtual_display_ipc_values->show_banner, sizeof(bool), debug); setup_ipc_value(virtual_display_look_ahead_cfg_ipc_name, (void**) &virtual_display_ipc_values->look_ahead_cfg, sizeof(float) * 4, debug); setup_ipc_value(virtual_display_display_size_ipc_name, (void**) &virtual_display_ipc_values->display_size, sizeof(float), debug); setup_ipc_value(virtual_display_display_north_offset_ipc_name, (void**) &virtual_display_ipc_values->display_north_offset, sizeof(float), debug); setup_ipc_value(virtual_display_sbs_enabled_ipc_name, (void**) &virtual_display_ipc_values->sbs_enabled, sizeof(bool), debug); setup_ipc_value(virtual_display_sbs_content_ipc_name, (void**) &virtual_display_ipc_values->sbs_content, sizeof(bool), debug); setup_ipc_value(virtual_display_sbs_mode_stretched_ipc_name, (void**) &virtual_display_ipc_values->sbs_mode_stretched, sizeof(bool), debug); setup_ipc_value(virtual_display_half_fov_z_rads_ipc_name, (void**) &virtual_display_ipc_values->half_fov_z_rads, sizeof(float), debug); setup_ipc_value(virtual_display_half_fov_y_rads_ipc_name, (void**) &virtual_display_ipc_values->half_fov_y_rads, sizeof(float), debug); setup_ipc_value(virtual_display_fov_half_widths_ipc_name, (void**) &virtual_display_ipc_values->fov_half_widths, sizeof(float) * 2, debug); setup_ipc_value(virtual_display_fov_widths_ipc_name, (void**) &virtual_display_ipc_values->fov_widths, sizeof(float) * 2, debug); setup_ipc_value(virtual_display_texcoord_x_limits_ipc_name, (void**) &virtual_display_ipc_values->texcoord_x_limits, sizeof(float) * 2, debug); setup_ipc_value(virtual_display_texcoord_x_limits_r_ipc_name, (void**) &virtual_display_ipc_values->texcoord_x_limits_r, sizeof(float) * 2, debug); setup_ipc_value(virtual_display_lens_vector_ipc_name, (void**) &virtual_display_ipc_values->lens_vector, sizeof(float) * 3, debug); setup_ipc_value(virtual_display_lens_vector_r_ipc_name, (void**) &virtual_display_ipc_values->lens_vector_r, sizeof(float) * 3, debug); setup_ipc_value(virtual_display_curved_display_ipc_name, (void**) &virtual_display_ipc_values->curved_display, sizeof(bool), debug); set_virtual_display_ipc_values(); return true; } void virtual_display_handle_state_func() { bool sbs_enabled = state()->sbs_mode_enabled && is_sbs_granted(); if (virtual_display_ipc_values) *virtual_display_ipc_values->sbs_enabled = sbs_enabled; set_gamescope_reshade_effect_uniform_variable("sbs_enabled", &sbs_enabled, 1, sizeof(bool), true); set_virtual_display_ipc_values(); } const plugin_type virtual_display_plugin = { .id = "virtual_display", .default_config = virtual_display_default_config_func, .handle_config_line = virtual_display_handle_config_line_func, .set_config = virtual_display_set_config_func, .setup_ipc = virtual_display_setup_ipc_func, .handle_ipc_change = set_virtual_display_ipc_values, .handle_state = virtual_display_handle_state_func, .handle_device_connect = set_virtual_display_ipc_values, .handle_device_disconnect = virtual_display_handle_device_disconnect_func }; ================================================ FILE: src/plugins.c ================================================ #include "logging.h" #include "plugins.h" #include "plugins/custom_banner.h" #include "plugins/breezy_desktop.h" #include "plugins/device_license.h" #include "plugins/gamescope_reshade_wayland.h" #include "plugins/metrics.h" #include "plugins/sideview.h" #include "plugins/smooth_follow.h" #include "plugins/virtual_display.h" #include "plugins/neck_saver.h" #include "plugins/opentrack_source.h" #include "plugins/opentrack_listener.h" #include "state.h" #include #define PLUGIN_COUNT 11 const plugin_type* all_plugins[PLUGIN_COUNT] = { &device_license_plugin, &virtual_display_plugin, &sideview_plugin, &metrics_plugin, &custom_banner_plugin, &smooth_follow_plugin, &breezy_desktop_plugin, &gamescope_reshade_wayland_plugin, &neck_saver_plugin, &opentrack_source_plugin, &opentrack_listener_plugin }; void all_plugins_start_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->start == NULL) continue; all_plugins[i]->start(); } } void* all_plugins_default_config_func() { void** configs = calloc(PLUGIN_COUNT, sizeof(void*)); for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->default_config == NULL) continue; configs[i] = all_plugins[i]->default_config(); } return configs; } void all_plugins_handle_config_line_func(void* config, char* key, char* value) { void **configs = (void**)config; for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_config_line == NULL) continue; all_plugins[i]->handle_config_line(configs[i], key, value); } } void all_plugins_handle_control_flag_line_func(char* key, char* value) { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_control_flag_line == NULL) continue; all_plugins[i]->handle_control_flag_line(key, value); } } void all_plugins_set_config_func(void* config) { void **configs = (void**)config; for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->set_config == NULL) continue; all_plugins[i]->set_config(configs[i]); } } bool all_plugins_setup_ipc_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->setup_ipc == NULL) continue; if (!all_plugins[i]->setup_ipc()) { log_error("Failed to setup IPC for plugin %s\n", all_plugins[i]->id); exit(1); } } return true; } void all_plugins_handle_ipc_change_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_ipc_change == NULL) continue; all_plugins[i]->handle_ipc_change(); } } bool all_plugins_modify_reference_pose_func(imu_pose_type pose, imu_pose_type* ref_pose) { bool modified = false; for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->modify_reference_pose == NULL) continue; modified |= all_plugins[i]->modify_reference_pose(pose, ref_pose); } return modified; } void all_plugins_handle_reference_pose_updated_func(imu_pose_type old_reference_pose, imu_pose_type new_reference_pose) { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_reference_pose_updated == NULL) continue; all_plugins[i]->handle_reference_pose_updated(old_reference_pose, new_reference_pose); } } void all_plugins_modify_pose_func(imu_pose_type* pose) { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->modify_pose == NULL) continue; all_plugins[i]->modify_pose(pose); } } void all_plugins_handle_pose_data_func(imu_pose_type pose, imu_euler_type velocities, bool imu_calibrated, ipc_values_type *ipc_values) { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_pose_data == NULL) continue; all_plugins[i]->handle_pose_data(pose, velocities, imu_calibrated, ipc_values); } } void all_plugins_reset_pose_data_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->reset_pose_data == NULL) continue; all_plugins[i]->reset_pose_data(); } } void all_plugins_handle_state_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_state == NULL) continue; all_plugins[i]->handle_state(); } } void all_plugins_handle_device_connect_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_device_connect == NULL) continue; all_plugins[i]->handle_device_connect(); } } void all_plugins_handle_device_disconnect_func() { for (int i = 0; i < PLUGIN_COUNT; i++) { if (all_plugins[i]->handle_device_disconnect == NULL) continue; all_plugins[i]->handle_device_disconnect(); } } const plugin_type plugins = { .id = "all_plugins", .start = all_plugins_start_func, .default_config = all_plugins_default_config_func, .handle_config_line = all_plugins_handle_config_line_func, .handle_control_flag_line = all_plugins_handle_control_flag_line_func, .set_config = all_plugins_set_config_func, .setup_ipc = all_plugins_setup_ipc_func, .handle_ipc_change = all_plugins_handle_ipc_change_func, .modify_reference_pose = all_plugins_modify_reference_pose_func, .handle_reference_pose_updated = all_plugins_handle_reference_pose_updated_func, .modify_pose = all_plugins_modify_pose_func, .handle_pose_data = all_plugins_handle_pose_data_func, .reset_pose_data = all_plugins_reset_pose_data_func, .handle_state = all_plugins_handle_state_func, .handle_device_connect = all_plugins_handle_device_connect_func, .handle_device_disconnect = all_plugins_handle_device_disconnect_func }; ================================================ FILE: src/runtime_context.c ================================================ #include "devices.h" #include "runtime_context.h" #include #include runtime_context g_runtime_context; static int device_ref_count = 0; pthread_mutex_t device_ref_count_mutex = PTHREAD_MUTEX_INITIALIZER; static device_properties_type* queued_device = NULL; static on_device_change_callback on_device_change_callback_func = NULL; // the mutex must already be locked when calling this function static bool _check_and_set_queued_device() { if (g_runtime_context.device == NULL && queued_device != NULL) { g_runtime_context.device = queued_device; queued_device = NULL; device_ref_count = 1; return true; } return false; } void set_device_and_checkout(device_properties_type* device) { bool device_changed = false; pthread_mutex_lock(&device_ref_count_mutex); if (!device_equal(device, g_runtime_context.device)) { queued_device = device; device_changed = _check_and_set_queued_device(); } else { device_ref_count++; } pthread_mutex_unlock(&device_ref_count_mutex); if (device_changed && on_device_change_callback_func != NULL) on_device_change_callback_func(); } device_properties_type* device_checkout() { device_properties_type* device = NULL; pthread_mutex_lock(&device_ref_count_mutex); if (device_present()) { device_ref_count++; device = g_runtime_context.device; } pthread_mutex_unlock(&device_ref_count_mutex); return device; } void device_checkin(device_properties_type* device) { bool device_changed = false; pthread_mutex_lock(&device_ref_count_mutex); if (device_ref_count > 0 && device_equal(device, g_runtime_context.device)) { device_ref_count--; if (device_ref_count == 0) { free(g_runtime_context.device); g_runtime_context.device = NULL; _check_and_set_queued_device(); device_changed = true; } } else if (device_equal(device, queued_device)) { free(queued_device); queued_device = NULL; } pthread_mutex_unlock(&device_ref_count_mutex); if (device_changed && on_device_change_callback_func != NULL) on_device_change_callback_func(); } // if a device is queued, the current device is already disconnected, return false until queued device takes over bool device_present() { return g_runtime_context.device != NULL && queued_device == NULL; } void set_on_device_change_callback(on_device_change_callback callback) { on_device_change_callback_func = callback; } ================================================ FILE: src/state.c ================================================ #include "devices.h" #include "imu.h" #include "logging.h" #include "memory.h" #include "plugins.h" #include "state.h" #include "strings.h" #include "system.h" #include #include #include #include #include #include #include #include #include const char *calibration_setup_strings[2] = { "AUTOMATIC", "INTERACTIVE" }; const char *calibration_state_strings[4] = { "NOT_CALIBRATED", "CALIBRATED", "CALIBRATING", "WAITING_ON_USER" }; const char* state_files_directory = "/dev/shm"; const char* state_filename = "xr_driver_state"; const char* control_flags_filename = "xr_driver_control"; FILE* get_driver_state_file(const char *filename, char *mode, char **full_path) { int full_path_length = strlen(state_files_directory) + strlen(filename) + 2; *full_path = malloc(full_path_length); snprintf(*full_path, full_path_length, "%s/%s", state_files_directory, filename); return fopen(*full_path, mode ? mode : "r"); } pthread_mutex_t state_mutex = PTHREAD_MUTEX_INITIALIZER; void write_state(driver_state_type *state) { pthread_mutex_lock(&state_mutex); char *full_path = NULL; FILE* fp = get_driver_state_file(state_filename, "w", &full_path); fprintf(fp, "heartbeat=%d\n", state->heartbeat); if (get_hardware_id()) fprintf(fp, "hardware_id=%s\n", get_hardware_id()); if (state->device_license) fprintf(fp, "device_license=%s\n", state->device_license); if (state->connected_device_model && state->connected_device_brand) { fprintf(fp, "connected_device_brand=%s\n", state->connected_device_brand); fprintf(fp, "connected_device_model=%s\n", state->connected_device_model); fprintf(fp, "calibration_setup=%s\n", calibration_setup_strings[state->calibration_setup]); fprintf(fp, "calibration_state=%s\n", calibration_state_strings[state->calibration_state]); fprintf(fp, "sbs_mode_supported=%s\n", state->sbs_mode_supported ? "true" : "false"); fprintf(fp, "sbs_mode_enabled=%s\n", state->sbs_mode_enabled ? "true" : "false"); fprintf(fp, "connected_device_full_distance_cm=%.2f\n", state->connected_device_full_distance_cm); fprintf(fp, "connected_device_full_size_cm=%.2f\n", state->connected_device_full_size_cm); fprintf(fp, "connected_device_pose_has_position=%s\n", state->connected_device_pose_has_position ? "true" : "false"); if (state->breezy_desktop_smooth_follow_enabled) fprintf(fp, "breezy_desktop_smooth_follow_enabled=true\n"); if (state->is_gamescope_reshade_ipc_connected) fprintf(fp, "is_gamescope_reshade_ipc_connected=true\n"); fprintf(fp, "firmware_update_recommended=%s\n", state->firmware_update_recommended ? "true" : "false"); } fclose(fp); pthread_mutex_unlock(&state_mutex); } void read_control_flags(FILE *fp, control_flags_type *flags) { if (fp) { char line[1024]; while (fgets(line, sizeof(line), fp) != NULL) { char *key = strtok(line, "="); char *value = strtok(NULL, "\n"); if (strcmp(key, "recenter_screen") == 0) { flags->recenter_screen = strcmp(value, "true") == 0; } else if (strcmp(key, "recalibrate") == 0) { flags->recalibrate = strcmp(value, "true") == 0; } else if (strcmp(key, "sbs_mode") == 0) { if (strcmp(value, "unset") == 0) { flags->sbs_mode = SBS_CONTROL_UNSET; } else if (strcmp(value, "disable") == 0) { flags->sbs_mode = SBS_CONTROL_DISABLE; } else if (strcmp(value, "enable") == 0) { flags->sbs_mode = SBS_CONTROL_ENABLE; } else { log_message("Invalid sbs_mode value: %s\n", value); } } else if (strcmp(key, "force_quit") == 0) { flags->force_quit = strcmp(value, "true") == 0; } else if (strcmp(key, "request_features") == 0) { free_and_clear(&flags->request_features); if (value && strlen(value) > 0) { flags->request_features = strdup(value); if (!flags->request_features) { log_error("Failed to allocate memory for request_features\n"); } } } plugins.handle_control_flag_line(key, value); } } } void update_state_from_device(driver_state_type *state, device_properties_type *primary_device, device_properties_type *supplemental_device, device_driver_type *device_driver) { pthread_mutex_lock(&state_mutex); bool was_sbs_mode_enabled = state->sbs_mode_enabled; struct timeval tv; gettimeofday(&tv, NULL); state->heartbeat = tv.tv_sec; state->calibration_setup = CALIBRATION_SETUP_AUTOMATIC; state->sbs_mode_supported = false; state->sbs_mode_enabled = false; state->firmware_update_recommended = false; if (primary_device == NULL) { // not connected free_and_clear(&state->connected_device_brand); free_and_clear(&state->connected_device_model); } else { state->sbs_mode_enabled = false; if (primary_device->sbs_mode_supported && device_driver != NULL && device_driver->is_connected_func()) { state->sbs_mode_enabled = device_driver->device_is_sbs_mode_func(); } state->firmware_update_recommended = primary_device->firmware_update_recommended; if (state->connected_device_brand == NULL || !equal(state->connected_device_brand, primary_device->brand)) { free_and_clear(&state->connected_device_brand); state->connected_device_brand = strdup(primary_device->brand); } if (state->connected_device_model == NULL || !equal(state->connected_device_model, primary_device->model)) { free_and_clear(&state->connected_device_model); state->connected_device_model = strdup(primary_device->model); } // Rough estimate of display parameters based on lens distance ratio and FOV float full_distance_cm = LENS_TO_PIVOT_CM / primary_device->lens_distance_ratio; state->connected_device_full_distance_cm = full_distance_cm; state->connected_device_full_size_cm = 2.0f * full_distance_cm * tanf(degree_to_radian(primary_device->fov) * 0.5f); state->connected_device_pose_has_position = primary_device->provides_position || (supplemental_device != NULL && supplemental_device->provides_position); state->calibration_setup = primary_device->calibration_setup; state->sbs_mode_supported = primary_device->sbs_mode_supported; } if (was_sbs_mode_enabled != state->sbs_mode_enabled) { if (state->sbs_mode_enabled) { log_message("SBS mode has been enabled\n"); } else { log_message("SBS mode has been disabled\n"); } } pthread_mutex_unlock(&state_mutex); } ================================================ FILE: src/strings.c ================================================ #include #include #include #include bool equal(const char *a, const char *b) { return strcmp(a, b) == 0; } bool list_string_contains(const char* str, const char* list_string) { if (str == NULL || list_string == NULL) return false; const char* p = list_string; size_t len = strlen(str); while (*p) { // Find the end of the current token const char* start = p; while (*p && *p != ',') p++; size_t token_len = (size_t)(p - start); // Compare lengths and content if (token_len == len && strncmp(start, str, len) == 0) { return true; } // Move to the next token if not at the end if (*p == ',') p++; } return false; } bool in_array(const char *str, const char **array, int size) { if (array == NULL || str == NULL) return false; for (int i = 0; i < size; i++) { if (equal(str, array[i])) { return true; } } return false; } const char* concat(const char* path, const char* extension) { char* s = malloc((strlen(path) + strlen(extension) + 1) * sizeof(char)); strcpy(s, path); strcat(s, extension); return s; } // Comparison function intended for qsort int compare_strings(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); } // Deep copy an array of strings char** deep_copy_string_array(char** array, int count) { if (count == 0 || !array) return NULL; char** copy = calloc(count, sizeof(char*)); if (!copy) return NULL; int i; for (i = 0; i < count; i++) { if (!array[i]) { goto cleanup_and_fail; } copy[i] = strdup(array[i]); if (!copy[i]) { goto cleanup_and_fail; } } return copy; cleanup_and_fail: for (int j = 0; j < i; j++) { free(copy[j]); } free(copy); return NULL; } // Parse comma-separated string into array of strings int parse_comma_separated_string(const char* str, char*** result) { if (!str || strlen(str) == 0) { *result = NULL; return 0; } char* str_copy = strdup(str); if (!str_copy) { *result = NULL; return 0; } int count = 0; *result = NULL; char* token = strtok(str_copy, ","); while (token != NULL) { // Trim whitespace while (*token == ' ') token++; char* end = token + strlen(token) - 1; while (end > token && *end == ' ') end--; *(end + 1) = '\0'; if (strlen(token) > 0) { char** temp = realloc(*result, (count + 1) * sizeof(char*)); if (!temp) { // Clean up on allocation failure for (int i = 0; i < count; i++) { free((*result)[i]); } free(*result); free(str_copy); *result = NULL; return 0; } *result = temp; (*result)[count] = strdup(token); if (!(*result)[count]) { // Clean up on strdup failure for (int i = 0; i < count; i++) { free((*result)[i]); } free(*result); free(str_copy); *result = NULL; return 0; } count++; } token = strtok(NULL, ","); } free(str_copy); return count; } ================================================ FILE: src/system.c ================================================ #include "logging.h" #include "strings.h" #include #include #include #include #include #include #include #include #include #include #include #include #define NET_INTERFACE_COUNT 2 const char *network_interfaces[NET_INTERFACE_COUNT] = {"eth0", "wlan0"}; bool get_mac_address_hash(char **mac_address_hash, const char *interface) { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) return false; ifr.ifr_addr.sa_family = AF_INET; strncpy(ifr.ifr_name, interface, IFNAMSIZ-1); bool found = false; if (ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0) { unsigned char *mac = (unsigned char *)ifr.ifr_hwaddr.sa_data; bool isZeroMac = true; for (int i = 0; i < 6; ++i) { if (mac[i] != 0) { isZeroMac = false; break; } } if (isZeroMac) return false; char mac_str[18]; snprintf(mac_str, sizeof(mac_str), "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256((unsigned char*)mac_str, strlen(mac_str), hash); *mac_address_hash = calloc(1, SHA256_DIGEST_LENGTH*2 + 1); for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) sprintf(*mac_address_hash + (i*2), "%02x", hash[i]); found = true; log_message("Using hardware id %s\n", *mac_address_hash); } close(fd); return found; } #define RETRY_ATTEMPTS 6 #define RETRY_DELAY_SEC 5 // with 6 retries: 30 seconds of total attempts pthread_mutex_t get_hardware_id_lock = PTHREAD_MUTEX_INITIALIZER; char *get_hardware_id() { static char *mac_address_hash = NULL; static bool no_mac_address = false; pthread_mutex_lock(&get_hardware_id_lock); if (!mac_address_hash && !no_mac_address) { int attempts = 0; bool found = false; while (!found && attempts <= RETRY_ATTEMPTS) { // check these first so that hardwareIds don't change from the old logic here for (int i = 0; i < NET_INTERFACE_COUNT && !found; i++) { found = get_mac_address_hash(&mac_address_hash, network_interfaces[i]); } if (!found) { // find and sort the remaining interfaces before generating a hash // in an attempt to get a consistent hardwareId struct ifaddrs *ifaddr, *ifa; char **remaining_interfaces = NULL; int remaining_count = 0; if (getifaddrs(&ifaddr) != -1) { for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET || in_array(ifa->ifa_name, network_interfaces, NET_INTERFACE_COUNT)) continue; remaining_count++; } remaining_interfaces = malloc(remaining_count * sizeof(char*)); if (remaining_interfaces == NULL) { log_error("Memory allocation failed\n"); freeifaddrs(ifaddr); break; } int index = 0; for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET || in_array(ifa->ifa_name, network_interfaces, NET_INTERFACE_COUNT)) continue; remaining_interfaces[index++] = strdup(ifa->ifa_name); } // sort by ifa->ifa_name qsort(remaining_interfaces, remaining_count, sizeof(char*), compare_strings); for (int i = 0; i < remaining_count && !found; i++) { found = get_mac_address_hash(&mac_address_hash, remaining_interfaces[i]); } for (int i = 0; i < remaining_count; i++) { free(remaining_interfaces[i]); } free(remaining_interfaces); freeifaddrs(ifaddr); } } if (!found && ++attempts <= RETRY_ATTEMPTS) { log_error("Failed to get hardwareId, retrying in %d seconds\n", RETRY_DELAY_SEC); sleep(RETRY_DELAY_SEC); } } no_mac_address = !found; } pthread_mutex_unlock(&get_hardware_id_lock); return mac_address_hash; } ================================================ FILE: src/wl_client/gamescope_reshade.c ================================================ /* Generated by wayland-scanner 1.23.0 */ /* * Copyright © 2024 Wayne Heaney * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include "wayland-util.h" #ifndef __has_attribute # define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ #endif #if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) #define WL_PRIVATE __attribute__ ((visibility("hidden"))) #else #define WL_PRIVATE #endif static const struct wl_interface *gamescope_reshade_types[] = { NULL, NULL, }; static const struct wl_message gamescope_reshade_requests[] = { { "destroy", "", gamescope_reshade_types + 0 }, { "set_effect", "s", gamescope_reshade_types + 0 }, { "enable_effect", "", gamescope_reshade_types + 0 }, { "set_uniform_variable", "sa", gamescope_reshade_types + 0 }, { "disable_effect", "", gamescope_reshade_types + 0 }, }; static const struct wl_message gamescope_reshade_events[] = { { "effect_ready", "s", gamescope_reshade_types + 0 }, }; WL_PRIVATE const struct wl_interface gamescope_reshade_interface = { "gamescope_reshade", 1, 5, gamescope_reshade_requests, 1, gamescope_reshade_events, }; ================================================ FILE: systemd/xr-driver.service ================================================ [Unit] Description=XR user-space driver After=network.target [Service] Type=simple Environment=LD_LIBRARY_PATH={ld_library_path} ExecStart={bin_dir}/xrDriver Restart=always [Install] WantedBy=default.target ================================================ FILE: udev/70-rayneo-xr.rules ================================================ SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="1bbb", MODE="0660", TAG+="uaccess" ================================================ FILE: udev/70-rokid-xr.rules ================================================ SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="04d2", MODE="0660", TAG+="uaccess" ================================================ FILE: udev/70-uinput-xr.rules ================================================ # Mouse output KERNEL=="uinput", SUBSYSTEM=="misc" MODE="0660", TAG+="uaccess", OPTIONS+="static_node=uinput" ================================================ FILE: udev/70-viture-xr.rules ================================================ SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="35ca", MODE="0660", TAG+="uaccess" SUBSYSTEM=="usb", KERNEL=="hiddev[0-9]*", ATTRS{idVendor}=="35ca", MODE="0660", TAG+="uaccess" SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="35ca", MODE="0660", TAG+="uaccess" SUBSYSTEM=="hidraw", KERNEL=="hidraw[0-9]*", ATTRS{idVendor}=="35ca", MODE="0660", TAG+="uaccess" ================================================ FILE: udev/70-xreal-xr.rules ================================================ # Rule for USB devices SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="3318", MODE="0660", TAG+="uaccess" # Rule for Input devices (such as eventX) SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{idVendor}=="3318", MODE="0660", TAG+="uaccess" # Rule for Sound devices (pcmCxDx and controlCx) SUBSYSTEM=="sound", KERNEL=="pcmC[0-9]D[0-9]p", ATTRS{idVendor}=="3318", MODE="0660", TAG+="uaccess" SUBSYSTEM=="sound", KERNEL=="controlC[0-9]", ATTRS{idVendor}=="3318", MODE="0660", TAG+="uaccess" # Rule for HID Devices (hidraw) SUBSYSTEM=="hidraw", KERNEL=="hidraw[0-9]*", ATTRS{idVendor}=="3318", MODE="0660", TAG+="uaccess" # Rule for HID Devices (hiddev) SUBSYSTEM=="usb", KERNEL=="hiddev[0-9]*", ATTRS{idVendor}=="3318", MODE="0660", TAG+="uaccess"