| ## 7.9\. Virtual Reality |
| |
| Android includes APIs and facilities to build "Virtual Reality" (VR) |
| applications including high quality mobile VR experiences. Device |
| implementations MUST properly implement these APIs and behaviors, |
| as detailed in this section. |
| |
| ### 7.9.1\. Virtual Reality Mode |
| |
| Android includes support for [VR Mode]( |
| https://developer.android.com/reference/android/app/Activity.html#setVrModeEnabled%28boolean, android.content.ComponentName%29), |
| a feature which handles stereoscopic rendering of notifications and disables |
| monocular system UI components while a VR application has user focus. |
| |
| ### 7.9.2\. Virtual Reality Mode - High Performance |
| |
| If device implementations support VR mode, they: |
| |
| * [C-1-1] MUST have at least 2 physical cores. |
| * [C-1-2] MUST declare the `android.hardware.vr.high_performance` feature. |
| * [C-1-3] MUST support sustained performance mode. |
| * [C-1-4] MUST support OpenGL ES 3.2. |
| * [C-1-5] MUST support `android.hardware.vulkan.level` 0. |
| * SHOULD support `android.hardware.vulkan.level` 1 or higher. |
| * [C-1-6] MUST implement |
| [`EGL_KHR_mutable_render_buffer`](https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_mutable_render_buffer.txt), |
| [`EGL_ANDROID_front_buffer_auto_refresh`](https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_front_buffer_auto_refresh.txt), |
| [`EGL_ANDROID_get_native_client_buffer`](https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_get_native_client_buffer.txt), |
| [`EGL_KHR_fence_sync`](https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_fence_sync.txt), |
| [`EGL_KHR_wait_sync`](https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_wait_sync.txt), |
| [`EGL_IMG_context_priority`](https://www.khronos.org/registry/EGL/extensions/IMG/EGL_IMG_context_priority.txt), |
| [`EGL_EXT_protected_content`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_protected_content.txt), |
| [`EGL_EXT_image_gl_colorspace`](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_gl_colorspace.txt), |
| and expose the extensions in the list of available EGL extensions. |
| * [C-1-8] MUST implement |
| [`GL_EXT_multisampled_render_to_texture2`](https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture2.txt), |
| [`GL_OVR_multiview`](https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt), |
| [`GL_OVR_multiview2`](https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt), |
| [`GL_EXT_protected_textures`](https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_protected_textures.txt), |
| and expose the extensions in the list of available GL extensions. |
| * [C-SR] Are STRONGLY RECOMMENDED to implement |
| [`GL_EXT_external_buffer`](https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_external_buffer.txt), |
| [`GL_EXT_EGL_image_array`](https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_array.txt), |
| [`GL_OVR_multiview_multisampled_render_to_texture`](https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview_multisampled_render_to_texture.txt), |
| and expose the extensions in the list of available GL extensions. |
| * [C-SR] Are STRONGLY RECOMMENDED to support Vulkan 1.1. |
| * [C-SR] Are STRONGLY RECOMMENDED to implement |
| [`VK_ANDROID_external_memory_android_hardware_buffer`](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VK_ANDROID_external_memory_android_hardware_buffer), |
| [`VK_GOOGLE_display_timing`](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VK_GOOGLE_display_timing), |
| [`VK_KHR_shared_presentable_image`](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VK_KHR_shared_presentable_image), |
| and expose it in the list of available Vulkan extensions. |
| * [C-SR] Are STRONGLY RECOMMENDED to expose at least one Vulkan queue family where `flags` |
| contain both `VK_QUEUE_GRAPHICS_BIT` and `VK_QUEUE_COMPUTE_BIT`, |
| and `queueCount` is at least 2. |
| * [C-1-7] The GPU and display MUST be able to synchronize access to the shared |
| front buffer such that alternating-eye rendering of VR content at 60fps with two |
| render contexts will be displayed with no visible tearing artifacts. |
| * [C-1-9] MUST implement support for [`AHardwareBuffer`](https://developer.android.com/ndk/reference/hardware__buffer_8h.html) |
| flags `AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER`, |
| `AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA` and |
| `AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT` |
| as described in the NDK. |
| * [C-1-10] MUST implement support for `AHardwareBuffer`s with any |
| combination of the usage flags |
| `AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT`, |
| `AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE`, |
| `AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT` |
| for at least the following formats: |
| `AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM`, |
| `AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM`, |
| `AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM`, |
| `AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT`. |
| * [C-SR] Are STRONGLY RECOMMENDED to support the allocation of `AHardwareBuffer`s |
| with more than one layer and flags and formats specified in C-1-10. |
| * [C-1-11] MUST support H.264 decoding at least 3840 x 2160 at 30fps, |
| compressed to an average of 40Mbps (equivalent to 4 instances of |
| 1920 x1080 at 30 fps-10 Mbps or 2 instances of 1920 x 1080 at 60 fps-20 Mbps). |
| * [C-1-12] MUST support HEVC and VP9, MUST be capable of decoding at least |
| 1920 x 1080 at 30 fps compressed to an average of 10 Mbps and SHOULD be |
| capable of decoding 3840 x 2160 at 30 fps-20 Mbps (equivalent to |
| 4 instances of 1920 x 1080 at 30 fps-5 Mbps). |
| * [C-1-13] MUST support `HardwarePropertiesManager.getDeviceTemperatures` API |
| and return accurate values for skin temperature. |
| * [C-1-14] MUST have an embedded screen, and its resolution MUST be at least |
| 1920 x 1080. |
| * [C-SR] Are STRONGLY RECOMMENDED to have a display resolution of at least |
| 2560 x 1440. |
| * [C-1-15] The display MUST update at least 60 Hz while in VR Mode. |
| * [C-1-17] The display MUST support a low-persistence mode with ≤ 5 milliseconds |
| persistence, persistence being defined as the amount of time for |
| which a pixel is emitting light. |
| * [C-1-18] MUST support Bluetooth 4.2 and Bluetooth LE Data Length Extension |
| [section 7.4.3](#7_4_3_bluetooth). |
| * [C-1-19] MUST support and properly report |
| [Direct Channel Type](https://developer.android.com/reference/android/hardware/Sensor#isDirectChannelTypeSupported%28int%29) |
| for all of the following default sensor types: |
| * `TYPE_ACCELEROMETER` |
| * `TYPE_ACCELEROMETER_UNCALIBRATED` |
| * `TYPE_GYROSCOPE` |
| * `TYPE_GYROSCOPE_UNCALIBRATED` |
| * `TYPE_MAGNETIC_FIELD` |
| * `TYPE_MAGNETIC_FIELD_UNCALIBRATED` |
| * [C-SR] Are STRONGLY RECOMMENDED to support the |
| [`TYPE_HARDWARE_BUFFER`](https://developer.android.com/reference/android/hardware/SensorDirectChannel.html#TYPE_HARDWARE_BUFFER) |
| direct channel type for all Direct Channel Types listed above. |
| * [C-1-21] MUST meet the gyroscope, accelerometer, and magnetometer related |
| requirements for `android.hardware.hifi_sensors`, as specified in |
| [section 7.3.9](#7_3_9_high_fidelity_sensors). |
| * [C-SR] Are STRONGLY RECOMMENDED to support the |
| `android.hardware.sensor.hifi_sensors` feature. |
| * [C-1-22] MUST have end-to-end motion to photon latency not higher than |
| 28 milliseconds. |
| * [C-SR] Are STRONGLY RECOMMENDED to have end-to-end motion to photon latency |
| not higher than 20 milliseconds. |
| * [C-1-23] MUST have first-frame ratio, which is the ratio between the |
| brightness of pixels on the first frame after a transition from black to |
| white and the brightness of white pixels in steady state, of at least 85%. |
| * [C-SR] Are STRONGLY RECOMMENDED to have first-frame ratio of at least 90%. |
| * MAY provide an exclusive core to the foreground |
| application and MAY support the `Process.getExclusiveCores` API to return |
| the numbers of the cpu cores that are exclusive to the top foreground |
| application. |
| |
| If exclusive core is supported, then the core: |
| |
| * [C-2-1] MUST not allow any other userspace processes to run on it |
| (except device drivers used by the application), but MAY allow some kernel |
| processes to run as necessary. |