Name String
XR_ANDROID_eye_tracking
Extension Type
Instance extension
Registered Extension Number
457
Revision
1
Extension and Version Dependencies
Last Modified Date
2025-01-17
IP Status
No known IP claims.
Contributors
Spencer Quin, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Prasanthi Gurumurthy, Google
Nihav Jain, Google
Overview
This extension enables applications to obtain position and orientation of the user's eyes, as well as eye tracking status.
Eye tracking data is provided in two modes: coarse and fine. Coarse tracking provides a coarse estimate of the user's eyes, while fine tracking provides a more accurate estimate. Coarse tracking is meant for applications that want to provide a basic avatar-like representation, while fine tracking is meant for more precise applications.
For
interaction, XR_EXT_eye_gaze_interaction should be used.
Inspect system capability
The XrSystemEyeTrackingPropertiesANDROID structure is defined as:
typedef struct XrSystemEyeTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsEyeTracking;
} XrSystemEyeTrackingPropertiesANDROID;
Member Descriptions
- typeis the- XrStructureTypeof this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
- supportsEyeTrackingis an- XrBool32, indicating if the current system supports eye tracking.
An application can inspect whether the system is capable of eye tracking by
chaining an XrSystemEyeTrackingPropertiesANDROID structure to the
XrSystemProperties when calling xrGetSystemProperties. If
supportsEyeTracking returns XR_FALSE, then an application will receive
XR_ERROR_FEATURE_UNSUPPORTED from xrCreateEyeTrackerANDROID.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to usingXrSystemEyeTrackingPropertiesANDROID
- typemust be- XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
Create an eye tracker handle
XR_DEFINE_HANDLE(XrEyeTrackerANDROID)
The XrEyeTrackerANDROID handle represents an eye tracker for tracking eyes
and accurately maps what the user is looking at.
Eye tracking data can be sensitive personal information and is closely linked to personal privacy and integrity. It is strongly recommended that applications that store or transfer eye tracking data always ask the user for active and specific acceptance to do so.
This handle can be used to access eye tracking data using other functions in this extension.
Eye tracking provides eye pose and status representation in the scene.
The xrCreateEyeTrackerANDROID function is defined
as: 
XrResult xrCreateEyeTrackerANDROID(
    XrSession                                   session,
    const XrEyeTrackerCreateInfoANDROID*        createInfo,
    XrEyeTrackerANDROID*                        eyeTracker);
Parameter Descriptions
- sessionis an- XrSessionhandle in which the eye tracking will be active.
- createInfois the- XrEyeTrackerCreateInfoANDROIDused to specify the eye tracking.
- eyeTrackeris the returned- XrEyeTrackerANDROIDhandle.
An application can create an XrEyeTrackerANDROID handle using
xrCreateEyeTrackerANDROID function.
If the system does not support eye tracking, then XR_ERROR_FEATURE_UNSUPPORTED
will be returned from xrCreateEyeTrackerANDROID.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to callingxrCreateEyeTrackerANDROID
- sessionmust be a valid- XrSessionhandle
- createInfomust be a pointer to a valid- XrEyeTrackerCreateInfoANDROIDstructure
- eyeTrackermust be a pointer to an- XrEyeTrackerANDROIDhandle
Return Codes
- XR_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_VALIDATION_FAILURE
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_LIMIT_REACHED
- XR_ERROR_FEATURE_UNSUPPORTED
The XrEyeTrackerCreateInfoANDROID structure is defined as:
typedef struct XrEyeTrackerCreateInfoANDROID {
    XrStructureType    type;
    void*              next;
} XrEyeTrackerCreateInfoANDROID;
Member Descriptions
- typeis the- XrStructureTypeof this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
The XrEyeTrackerCreateInfoANDROID structure describes the information to
create an XrEyeTrackerANDROID handle.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to usingXrEyeTrackerCreateInfoANDROID
- typemust be- XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
The xrDestroyEyeTrackerANDROID function is defined as:
XrResult xrDestroyEyeTrackerANDROID(
    XrEyeTrackerANDROID                         eyeTracker);
Parameter Descriptions
- eyeTrackeris an- XrEyeTrackerANDROIDpreviously created by- xrCreateEyeTrackerANDROID.
xrDestroyEyeTrackerANDROID function releases the eyeTracker and the
underlying resources when finished with eye tracking experiences.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to callingxrDestroyEyeTrackerANDROID
- eyeTrackermust be a valid- XrEyeTrackerANDROIDhandle.
Thread Safety
- Access to eyeTracker, and any child handles, must be externally synchronized
Return Codes
- XR_SUCCESS
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_HANDLE_INVALID
Getting eyes information
The xrGetCoarseTrackingEyesInfoANDROID function is defined as:
XrResult xrGetCoarseTrackingEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              eyesOutput);
Parameter Descriptions
- eyeTrackeris an- XrEyeTrackerANDROIDpreviously created by- xrCreateEyeTrackerANDROID.
- getInfois a pointer to- XrEyesGetInfoANDROIDused to specify what output is required.
- infoOutputis a pointer to- XrEyesANDROIDthat contains the returned eyes information including poses and states.
xrGetCoarseTrackingEyesInfoANDROID function gets the information for eye
states and
poses in a way that preserves user privacy.
The runtime must return XR_ERROR_PERMISSION_INSUFFICIENT if the application
does not have the android.permission.EYE_TRACKING_COARSE permission.
The eyes information is resolved and relative to the base space at the time of
the call to xrGetCoarseTrackingEyesInfoANDROID using
XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.
At any point of time both the position and direction of the eye pose is tracked
or untracked. This means that applications can expect that both
XR_SPACE_LOCATION_POSITION_TRACKED_BIT and
XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT will either be set or cleared on the
supplied XrEyesANDROID::eyes, and that XrEyesANDROID::mode will
indicate the tracking states.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to callingxrGetCoarseTrackingEyesInfoANDROID
- eyeTrackermust be a valid- XrEyeTrackerANDROIDhandle
- getInfomust be a pointer to a valid- XrEyesGetInfoANDROIDstructure
- eyesOutputmust be a pointer to an- XrEyesANDROIDstructure
Return Codes
- XR_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_VALIDATION_FAILURE
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_LIMIT_REACHED
- XR_ERROR_TIME_INVALID
- XR_ERROR_PERMISSION_INSUFFICIENT
The xrGetFineTrackingEyesInfoANDROID
function is defined as:
{:#xrGetFineTrackingEyesInfoANDROID}
C++
XrResult xrGetFineTrackingEyesInfoANDROID(
    XrEyeTrackerANDROID                         eyeTracker,
    const XrEyesGetInfoANDROID*                 getInfo,
    XrEyesANDROID*                              eyesOutput);
Parameter Descriptions
- eyeTrackeris an- XrEyeTrackerANDROIDpreviously created by- xrCreateEyeTrackerANDROID.
- getInfois a pointer to- XrEyesGetInfoANDROIDused to specify what output is required.
- infoOutputis a pointer to- XrEyesANDROIDthat contains the returned eyes information including poses and states.- xrGetFineTrackingEyesInfoANDROIDfunction gets the information for eye states and poses with higher precision than- xrGetCoarseTrackingEyesInfoANDROID.
The runtime must return XR_ERROR_PERMISSION_INSUFFICIENT if the application
does not have the android.permission.EYE_TRACKING_FINE permission.
The eyes information is resolved and relative to the base space at the time of
the call to xrGetFineTrackingEyesInfoANDROID using
XrEyesGetInfoANDROID::time, XrEyesGetInfoANDROID::baseSpace.
At any point of time both the position and direction of the eye pose is tracked
or untracked. This means that applications can expect that both
XR_SPACE_LOCATION_POSITION_TRACKED_BIT and
XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT will either be set or cleared on the
supplied XrEyesANDROID::eyes, and that XrEyesANDROID::mode will
indicate the tracking states.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to callingxrGetFineTrackingEyesInfoANDROID
- eyeTrackermust be a valid- XrEyeTrackerANDROIDhandle
- getInfomust be a pointer to a valid- XrEyesGetInfoANDROIDstructure
- eyesOutputmust be a pointer to an- XrEyesANDROIDstructure
Return Codes
- XR_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_VALIDATION_FAILURE
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_LIMIT_REACHED
- XR_ERROR_TIME_INVALID
- XR_ERROR_PERMISSION_INSUFFICIENT
XrEyesGetInfoANDROID structure contains the information required to
retrieve eye poses and states. 
typedef struct XrEyesGetInfoANDROID {
    XrStructureType    type;
    void*              next;
    XrTime             time;
    XrSpace            baseSpace;
} XrEyesGetInfoANDROID;
Member Descriptions
- typeis the- XrStructureTypeof this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
- timeis the- XrTimeat which to evaluate the coordinates relative to the- baseSpace.
- baseSpacethe eye pose will be relative to this- XrSpaceat- time.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to usingXrEyesGetInfoANDROID
- typemust be- XR_TYPE_EYES_GET_INFO_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- baseSpacemust be a valid- XrSpacehandle
XrEyesANDROID structure contains information on the tracked eyes.
typedef struct XrEyesANDROID {
    XrStructureType             type;
    void*                       next;
    XrEyeANDROID                eyes[XR_EYE_MAX_ANDROID];
    XrEyeTrackingModeANDROID    mode;
} XrEyesANDROID;
Member Descriptions
- typeis the- XrStructureTypeof this structure.
- nextis- NULLor a pointer to the next structure in a structure chain. No such structures are defined in core OpenXR or this extension.
- eyesis an array of- XrEyeANDROIDfor the left and right eyes as indexed by- XrEyeIndexANDROID.
- modeis the- XrEyeTrackingModeANDROIDto indicate if the eyes are tracking and which ones.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to usingXrEyesANDROID
- typemust be- XR_TYPE_EYES_ANDROID
- nextmust be- NULLor a valid pointer to the next structure in a structure chain
- Any given element of eyesmust be a validXrEyeANDROIDstructure
- modemust be a valid- XrEyeTrackingModeANDROIDvalue
XrEyeANDROID structure describes the state, position and orientation of an
eye. 
typedef struct XrEyeANDROID {
    XrEyeStateANDROID    eyeState;
    XrPosef              eyePose;
} XrEyeANDROID;
Member Descriptions
- eyeStateis the- XrEyeStateANDROIDof an eye.
- poseis an- XrPosefdefining the position and orientation of the origin of an eye within the reference frame of the corresponding- XrEyesGetInfoANDROID::baseSpace. An identity orientation here represents a coordinate axes with +Z into the user's eyes, +X to the right and +Y up.
Valid Usage (Implicit)
- The XR_ANDROID_eye_trackingextension must be enabled prior to usingXrEyeANDROID
- eyeStatemust be a valid- XrEyeStateANDROIDvalue
The XrEyeStateANDROID enumeration identifies the different states of
tracked eyes. 
typedef enum XrEyeStateANDROID {
    XR_EYE_STATE_INVALID_ANDROID = 0,
    XR_EYE_STATE_GAZING_ANDROID = 1,
    XR_EYE_STATE_SHUT_ANDROID = 2
} XrEyeStateANDROID;
The enums have the following meanings:
| Enum | Description | 
| 
 | Indicates that the eye is in an error state or not present. | 
| 
 | Indicates that the eye is gazing. | 
| 
 | Indicates that the eye is shut due to a wink or a blink. | 
The XrEyeIndexANDROID enumeration identifies the index of the left or
right eye. 
typedef enum XrEyeIndexANDROID {
    XR_EYE_INDEX_LEFT_ANDROID = 0,
    XR_EYE_INDEX_RIGHT_ANDROID = 1
} XrEyeIndexANDROID;
The enums have the following meanings:
| Enum | Description | 
| 
 | Left eye. | 
| 
 | Right eye. | 
The XrEyeTrackingModeANDROID enumeration identifies the different modes of
tracked eyes. 
typedef enum XrEyeTrackingModeANDROID {
    XR_EYE_TRACKING_MODE_NOT_TRACKING_ANDROID = 0,
    XR_EYE_TRACKING_MODE_RIGHT_ANDROID = 1,
    XR_EYE_TRACKING_MODE_LEFT_ANDROID = 2,
    XR_EYE_TRACKING_MODE_BOTH_ANDROID = 3
} XrEyeTrackingModeANDROID;
The enums have the following meanings:
| Enum | Description | 
| 
 | Indicates that eye tracking is not active. | 
| 
 | Indicates that only the right eye is tracking. | 
| 
 | Indicates that only the left eye is tracking. | 
| 
 | Indicates that both the left and right eyes are tracking. | 
Example code for eye tracking
The following example code demonstrates how to get eye information relative to a view space.
XrSession session; // previously initialized, e.g. created at app startup.
XrSpace viewSpace; // space created for XR_REFERENCE_SPACE_TYPE_VIEW.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateEyeTrackerANDROID xrCreateEyeTrackerANDROID; // previously initialized
PFN_xrDestroyEyeTrackerANDROID xrDestroyEyeTrackerANDROID; // previously initialized
PFN_xrGetCoarseTrackingEyesInfoANDROID xrGetCoarseTrackingEyesInfoANDROID; // previously initialized
PFN_xrGetFineTrackingEyesInfoANDROID xrGetFineTrackingEyesInfoANDROID; // previously initialized
// This will use the XrSession that is bound to the eye tracker done at time of creation.
XrEyeTrackerANDROID eyeTracker;
XrEyeTrackerCreateInfoANDROID createInfo{
    .type = XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID,
    .next = nullptr};
CHK_XR(xrCreateEyeTrackerANDROID(session, &createInfo, &eyeTracker));
while (1) {
    // ...
    // For every frame in frame loop
    // ...
    XrFrameState frameState;  // previously returned from xrWaitFrame
    const XrTime time = frameState.predictedDisplayTime;
    XrEyesANDROID fineEyesInfo{.type = XR_TYPE_EYES_ANDROID,
                               .next = nullptr,
                               .mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
    XrEyesANDROID coarseEyesInfo{.type = XR_TYPE_EYES_ANDROID,
                                 .next = nullptr,
                                 .mode = XR_EYE_TRACKING_MODE_BOTH_ANDROID};
    XrEyesGetInfoANDROID eyesGetInfo{.type = XR_TYPE_EYES_GET_INFO_ANDROID,
                                     .next = nullptr,
                                     .time = time,
                                     .baseSpace = viewSpace};
    CHK_XR(xrGetCoarseTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &coarseEyesInfo));
    CHK_XR(xrGetFineTrackingEyesInfoANDROID(eyeTracker, &eyesGetInfo, &fineEyesInfo));
    // eyes tracking information is now available:
    // drawLeftEye(eyesInfo.eyes[XR_EYE_INDEX_LEFT_ANDROID].eyePose);
    // drawRightEye(eyesInfo.eyes[XR_EYE_INDEX_RIGHT_ANDROID].eyePose);
    // ...
    // Finish frame loop
    // ...
}
// after usage
CHK_XR(xrDestroyEyeTrackerANDROID(eyeTracker));
New Object Types
New Enum Constants
- XR_EYE_MAX_ANDROID
XrObjectType enumeration is extended with:
- XR_OBJECT_TYPE_EYE_TRACKER_ANDROID
XrStructureType enumeration is extended with:
- XR_TYPE_EYES_ANDROID
- XR_TYPE_EYE_TRACKER_CREATE_INFO_ANDROID
- XR_TYPE_EYES_GET_INFO_ANDROID
- XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_ANDROID
New Enums
New Structures
- XrEyeANDROID
- XrEyesANDROID
- XrEyesGetInfoANDROID
- XrEyeTrackerCreateInfoANDROID
- XrSystemEyeTrackingPropertiesANDROID
New Functions
- xrCreateEyeTrackerANDROID
- xrDestroyEyeTrackerANDROID
- xrGetCoarseTrackingEyesInfoANDROID
- xrGetFineTrackingEyesInfoANDROID
Issues
Version History
- Revision 1, 2025-01-17 (Kenny Vercaemer)
- Initial extension description
 
OpenXR™ and the OpenXR logo are trademarks owned by The Khronos Group Inc. and are registered as a trademark in China, the European Union, Japan and the United Kingdom.
