1# Copyright (C) 2019 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the License); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an AS IS BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15module: "android.sysprop.SurfaceFlingerProperties" 16owner: Platform 17 18# The following two properties define (respectively): 19# 20# - The phase offset between hardware vsync and when apps are woken up by the 21# Choreographer callback 22# - The phase offset between hardware vsync and when SurfaceFlinger wakes up 23# to consume input 24# Their values may be tuned to trade off between display pipeline latency (both 25# overall latency and the lengths of the app --> SF and SF --> display phases) 26# and frame delivery jitter (which typically manifests as "jank" or "jerkiness" 27# while interacting with the device). The default values must produce a 28# relatively low amount of jitter at the expense of roughly two frames of 29# app --> display latency, and unless significant testing is performed to avoid 30# increased display jitter (both manual investigation using systrace [1] and 31# automated testing using dumpsys gfxinfo [2] are recommended), they should not 32# be modified. 33# 34# [1] https://developer.android.com/studio/profile/systrace.html 35# [2] https://developer.android.com/training/testing/performance.html 36prop { 37 api_name: "vsync_event_phase_offset_ns" 38 type: Long 39 scope: Public 40 access: Readonly 41 prop_name: "ro.surface_flinger.vsync_event_phase_offset_ns" 42} 43 44prop { 45 api_name: "vsync_sf_event_phase_offset_ns" 46 type: Long 47 scope: Public 48 access: Readonly 49 prop_name: "ro.surface_flinger.vsync_sf_event_phase_offset_ns" 50} 51 52# Instruct the Render Engine to use EGL_IMG_context_priority hint if available. 53prop { 54 api_name: "use_context_priority" 55 type: Boolean 56 scope: Public 57 access: Readonly 58 prop_name: "ro.surface_flinger.use_context_priority" 59} 60 61# Controls the number of buffers SurfaceFlinger will allocate for use in FramebufferSurface. 62prop { 63 api_name: "max_frame_buffer_acquired_buffers" 64 type: Long 65 scope: Public 66 access: Readonly 67 prop_name: "ro.surface_flinger.max_frame_buffer_acquired_buffers" 68} 69 70# hasWideColorDisplay indicates that the device has 71# or can support a wide-color display, e.g. color space 72# greater than sRGB. Typical display may have same 73# color primaries as DCI-P3. 74# Indicate support for this feature by setting 75# TARGET_HAS_WIDE_COLOR_DISPLAY to true in BoardConfig.mk 76# This also means that the device is color managed. 77# A color managed device will use the appropriate 78# display mode depending on the content on the screen. 79# Default is sRGB. 80prop { 81 api_name: "has_wide_color_display" 82 type: Boolean 83 scope: Public 84 access: Readonly 85 prop_name: "ro.surface_flinger.has_wide_color_display" 86} 87 88# Indicates if Sync framework is available. Sync framework provides fence 89# mechanism which significantly reduces buffer processing latency. 90prop { 91 api_name: "running_without_sync_framework" 92 type: Boolean 93 scope: Public 94 access: Readonly 95 prop_name: "ro.surface_flinger.running_without_sync_framework" 96} 97 98# hwHDRDisplay indicates that the device has an High Dynamic Range display. 99# A display is considered High Dynamic Range if it 100# 101# 1. is a wide color gamut display, typically DCI-P3 or lager 102# 2. has high luminance capability, typically 540 nits or higher at 10% OPR 103# 104# Indicate support for this feature by setting 105# ro.surface_flinger.has_HDR_display to true in device.mk 106# ro.surface_flinger.has_wide_color_display must be set to true when 107# ro.surface_flinger.has_HDR_display is true. 108prop { 109 api_name: "has_HDR_display" 110 type: Boolean 111 scope: Public 112 access: Readonly 113 prop_name: "ro.surface_flinger.has_HDR_display" 114} 115 116# Specify the offset in nanoseconds to add to vsync time when timestamping present fences. 117prop { 118 api_name: "present_time_offset_from_vsync_ns" 119 type: Long 120 scope: Public 121 access: Readonly 122 prop_name: "ro.surface_flinger.present_time_offset_from_vsync_ns" 123} 124 125# Some hardware can do RGB->YUV conversion more efficiently in hardware 126# controlled by HWC than in hardware controlled by the video encoder. 127# This instruct VirtualDisplaySurface to use HWC for such conversion on 128# GL composition. 129prop { 130 api_name: "force_hwc_copy_for_virtual_displays" 131 type: Boolean 132 scope: Public 133 access: Readonly 134 prop_name: "ro.surface_flinger.force_hwc_copy_for_virtual_displays" 135} 136 137# Maximum dimension supported by HWC for virtual display. 138# Must be equals to min(max_width, max_height). 139prop { 140 api_name: "max_virtual_display_dimension" 141 type: Long 142 scope: Public 143 access: Readonly 144 prop_name: "ro.surface_flinger.max_virtual_display_dimension" 145} 146 147# Return true if surface flinger should use vr flinger for compatible vr 148# apps, false otherwise. Devices that will never be running vr apps should 149# return false to avoid extra resource usage. Daydream ready devices must 150# return true for full vr support. 151prop { 152 api_name: "use_vr_flinger" 153 type: Boolean 154 scope: Public 155 access: Readonly 156 prop_name: "ro.surface_flinger.use_vr_flinger" 157} 158 159# Returns true if surface flinger should start 160# hardware.graphics.allocator@2.0::IAllocator service. 161prop { 162 api_name: "start_graphics_allocator_service" 163 type: Boolean 164 scope: Public 165 access: Readonly 166 prop_name: "ro.surface_flinger.start_graphics_allocator_service" 167} 168 169# Returns the orientation of the primary display device. 170prop { 171 api_name: "primary_display_orientation" 172 type: Enum 173 enum_values: "ORIENTATION_0|ORIENTATION_90|ORIENTATION_180|ORIENTATION_270" 174 scope: Public 175 access: Readonly 176 prop_name: "ro.surface_flinger.primary_display_orientation" 177} 178 179# useColorManagement indicates whether SurfaceFlinger should manage color 180# by switching to appropriate color mode automatically depending on the 181# Dataspace of the surfaces on screen. 182prop { 183 api_name: "use_color_management" 184 type: Boolean 185 scope: Public 186 access: Readonly 187 prop_name: "ro.surface_flinger.use_color_management" 188} 189 190# The following four propertiess define: 191# Returns the default data space and pixel format that SurfaceFlinger 192# expects to receive and output as well as the wide color gamut data space 193# and pixel format for wide color gamut surfaces. 194# To determine the data space and pixel format, there are a few things 195# we recommend to consider: 196# 197# 1. Hardware composer's capability to composite contents with the chosen 198# data space and pixel format efficiently; 199# 2. Hardware composer's ability to composite contents when sRGB contents 200# and the chosen wide color gamut data space contents coexist; 201# 3. For better blending, consider using pixel format where the alpha 202# channel has as many bits as the RGB color channel. 203# 4. Memory consumption and efficient buffer compression when considering 204# more bits in pixel format. 205 206# dataspace is the default data space that SurfaceFlinger expects. 207# The data space must not be Dataspace::UNKNOWN, if unspecified, 208# the default data space is Dataspace::V0_SRGB; 209prop { 210 api_name: "default_composition_dataspace" 211 type: Long 212 scope: Public 213 access: Readonly 214 prop_name: "ro.surface_flinger.default_composition_dataspace" 215} 216 217# pixelFormat is the default pixel format that SurfaceFlinger 218# expects. If unspecified, the default pixel format is 219# PixelFormat::RGBA_8888. 220prop { 221 api_name: "default_composition_pixel_format" 222 type: Integer 223 scope: Public 224 access: Readonly 225 prop_name: "ro.surface_flinger.default_composition_pixel_format" 226} 227 228# wcgDataspace is the data space that SurfaceFlinger expects for 229# wide color gamut surfaces. 230# When hasWideColorDisplay returns true, this API must return a 231# valid wide color gamut data space. 232# The data space must not be UNKNOWN, if unspecified, the data space 233# is V0_SRGB by default, which essentially indicates there's no wide 234# color gamut, meaning hasWideColorDisplay returns false. 235prop { 236 api_name: "wcg_composition_dataspace" 237 type: Long 238 scope: Public 239 access: Readonly 240 prop_name: "ro.surface_flinger.wcg_composition_dataspace" 241} 242 243# wcgPixelFormat is the pixel format that SurfaceFlinger expects for 244# wide color gamut surfaces. If unspecified, the pixel format is 245# PixelFormat::RGBA_8888 by default. 246prop { 247 api_name: "wcg_composition_pixel_format" 248 type: Integer 249 scope: Public 250 access: Readonly 251 prop_name: "ro.surface_flinger.wcg_composition_pixel_format" 252} 253 254# colorSpaceAgnosticDataspace specifies the data space that 255# SurfaceFlinger expects for surfaces which are color space agnostic. 256# The variable works only when useColorManagement is specified. If 257# unspecified, the data space follows what SurfaceFlinger expects for 258# surfaces when useColorManagement is specified. 259 260prop { 261 api_name: "color_space_agnostic_dataspace" 262 type: Long 263 scope: Public 264 access: Readonly 265 prop_name: "ro.surface_flinger.color_space_agnostic_dataspace" 266} 267 268# Return the native panel primary data. The data includes red, green, 269# blue and white. The primary format is CIE 1931 XYZ color space. 270# If unspecified, the primaries is sRGB gamut by default. 271 272prop { 273 api_name: "display_primary_red" 274 type: DoubleList 275 scope: Public 276 access: Readonly 277 prop_name: "ro.surface_flinger.display_primary_red" 278} 279 280prop { 281 api_name: "display_primary_green" 282 type: DoubleList 283 scope: Public 284 access: Readonly 285 prop_name: "ro.surface_flinger.display_primary_green" 286} 287 288prop { 289 api_name: "display_primary_blue" 290 type: DoubleList 291 scope: Public 292 access: Readonly 293 prop_name: "ro.surface_flinger.display_primary_blue" 294} 295 296prop { 297 api_name: "display_primary_white" 298 type: DoubleList 299 scope: Public 300 access: Readonly 301 prop_name: "ro.surface_flinger.display_primary_white" 302} 303 304# refreshRateSwitching indicates whether SurfaceFlinger should use refresh rate 305# switching on the device, e.g. to switch between 60 and 90 Hz. The settings 306# below that are related to refresh rate switching will only have an effect if 307# refresh_rate_switching is enabled. 308prop { 309 api_name: "refresh_rate_switching" 310 type: Boolean 311 scope: Public 312 access: Readonly 313 prop_name: "ro.surface_flinger.refresh_rate_switching" 314} 315 316# setIdleTimerMs indicates what is considered a timeout in milliseconds for Scheduler. This value is 317# used by the Scheduler to trigger inactivity callbacks that will switch the display to a lower 318# refresh rate. Setting this property to 0 means there is no timer. 319prop { 320 api_name: "set_idle_timer_ms" 321 type: Integer 322 scope: Public 323 access: Readonly 324 prop_name: "ro.surface_flinger.set_idle_timer_ms" 325} 326 327# setTouchTimerMs indicates what is considered a timeout in milliseconds for Scheduler. 328# This value is used by the Scheduler to trigger touch inactivity callbacks that will switch the 329# display to a lower refresh rate. Setting this property to 0 means there is no timer. 330prop { 331 api_name: "set_touch_timer_ms" 332 type: Integer 333 scope: Public 334 access: Readonly 335 prop_name: "ro.surface_flinger.set_touch_timer_ms" 336} 337 338# setDisplayPowerTimerMs indicates what is considered a timeout in milliseconds for Scheduler. 339# This value is used by the Scheduler to trigger display power inactivity callbacks that will 340# keep the display in peak refresh rate as long as display power is not in normal mode. 341# Setting this property to 0 means there is no timer. 342prop { 343 api_name: "set_display_power_timer_ms" 344 type: Integer 345 scope: Public 346 access: Readonly 347 prop_name: "ro.surface_flinger.set_display_power_timer_ms" 348} 349 350# useSmart90ForVideo indicates whether Scheduler should detect content FPS, and try to adjust the 351# screen refresh rate based on that. 352prop { 353 api_name: "use_smart_90_for_video" 354 type: Boolean 355 scope: Public 356 access: Readonly 357 prop_name: "ro.surface_flinger.use_smart_90_for_video" 358} 359 360prop { 361 api_name: "enable_protected_contents" 362 type: Boolean 363 scope: Public 364 access: Readonly 365 prop_name: "ro.surface_flinger.protected_contents" 366} 367 368# Indicates whether Scheduler's idle timer should support a display driver timeout in the kernel. 369# The value of set_idle_timer_ms should be shorter in time than the timeout duration in the kernel. 370prop { 371 api_name: "support_kernel_idle_timer" 372 type: Boolean 373 scope: Public 374 access: Readonly 375 prop_name: "ro.surface_flinger.support_kernel_idle_timer" 376} 377