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# Controls the maximum width in pixels that the graphics pipeline can support for GPU fallback 71# composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs. 72prop { 73 api_name: "max_graphics_width" 74 type: Integer 75 scope: System 76 access: Readonly 77 prop_name: "ro.surface_flinger.max_graphics_width" 78} 79 80# Controls the maximum height in pixels that the graphics pipeline can support for GPU fallback 81# composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs. 82prop { 83 api_name: "max_graphics_height" 84 type: Integer 85 scope: System 86 access: Readonly 87 prop_name: "ro.surface_flinger.max_graphics_height" 88} 89 90# hasWideColorDisplay indicates that the device has 91# or can support a wide-color display, e.g. color space 92# greater than sRGB. Typical display may have same 93# color primaries as DCI-P3. 94# Indicate support for this feature by setting 95# TARGET_HAS_WIDE_COLOR_DISPLAY to true in BoardConfig.mk 96# This also means that the device is color managed. 97# A color managed device will use the appropriate 98# display mode depending on the content on the screen. 99# Default is sRGB. 100prop { 101 api_name: "has_wide_color_display" 102 type: Boolean 103 scope: Public 104 access: Readonly 105 prop_name: "ro.surface_flinger.has_wide_color_display" 106} 107 108# Indicates if Sync framework is available. Sync framework provides fence 109# mechanism which significantly reduces buffer processing latency. 110prop { 111 api_name: "running_without_sync_framework" 112 type: Boolean 113 scope: Public 114 access: Readonly 115 prop_name: "ro.surface_flinger.running_without_sync_framework" 116} 117 118# hwHDRDisplay indicates that the device has an High Dynamic Range display. 119# A display is considered High Dynamic Range if it 120# 121# 1. is a wide color gamut display, typically DCI-P3 or lager 122# 2. has high luminance capability, typically 540 nits or higher at 10% OPR 123# 124# Indicate support for this feature by setting 125# ro.surface_flinger.has_HDR_display to true in device.mk 126# ro.surface_flinger.has_wide_color_display must be set to true when 127# ro.surface_flinger.has_HDR_display is true. 128prop { 129 api_name: "has_HDR_display" 130 type: Boolean 131 scope: Public 132 access: Readonly 133 prop_name: "ro.surface_flinger.has_HDR_display" 134} 135 136# Specify the offset in nanoseconds to add to vsync time when timestamping present fences. 137prop { 138 api_name: "present_time_offset_from_vsync_ns" 139 type: Long 140 scope: Public 141 access: Readonly 142 prop_name: "ro.surface_flinger.present_time_offset_from_vsync_ns" 143} 144 145# Some hardware can do RGB->YUV conversion more efficiently in hardware 146# controlled by HWC than in hardware controlled by the video encoder. 147# This instruct VirtualDisplaySurface to use HWC for such conversion on 148# GL composition. 149prop { 150 api_name: "force_hwc_copy_for_virtual_displays" 151 type: Boolean 152 scope: Public 153 access: Readonly 154 prop_name: "ro.surface_flinger.force_hwc_copy_for_virtual_displays" 155} 156 157# Maximum dimension supported by HWC for virtual display. 158# Must be equals to min(max_width, max_height). 159prop { 160 api_name: "max_virtual_display_dimension" 161 type: Long 162 scope: Public 163 access: Readonly 164 prop_name: "ro.surface_flinger.max_virtual_display_dimension" 165} 166 167# Return true if surface flinger should use vr flinger for compatible vr 168# apps, false otherwise. Devices that will never be running vr apps should 169# return false to avoid extra resource usage. Daydream ready devices must 170# return true for full vr support. 171prop { 172 api_name: "use_vr_flinger" 173 type: Boolean 174 scope: Public 175 access: Readonly 176 prop_name: "ro.surface_flinger.use_vr_flinger" 177} 178 179# Returns true if surface flinger should start 180# hardware.graphics.allocator@2.0::IAllocator service. 181prop { 182 api_name: "start_graphics_allocator_service" 183 type: Boolean 184 scope: Public 185 access: Readonly 186 prop_name: "ro.surface_flinger.start_graphics_allocator_service" 187} 188 189# Returns the orientation of the primary display device. 190prop { 191 api_name: "primary_display_orientation" 192 type: Enum 193 enum_values: "ORIENTATION_0|ORIENTATION_90|ORIENTATION_180|ORIENTATION_270" 194 scope: Public 195 access: Readonly 196 prop_name: "ro.surface_flinger.primary_display_orientation" 197} 198 199# useColorManagement indicates whether SurfaceFlinger should manage color 200# by switching to appropriate color mode automatically depending on the 201# Dataspace of the surfaces on screen. 202prop { 203 api_name: "use_color_management" 204 type: Boolean 205 scope: Public 206 access: Readonly 207 prop_name: "ro.surface_flinger.use_color_management" 208} 209 210# The following four propertiess define: 211# Returns the default data space and pixel format that SurfaceFlinger 212# expects to receive and output as well as the wide color gamut data space 213# and pixel format for wide color gamut surfaces. 214# To determine the data space and pixel format, there are a few things 215# we recommend to consider: 216# 217# 1. Hardware composer's capability to composite contents with the chosen 218# data space and pixel format efficiently; 219# 2. Hardware composer's ability to composite contents when sRGB contents 220# and the chosen wide color gamut data space contents coexist; 221# 3. For better blending, consider using pixel format where the alpha 222# channel has as many bits as the RGB color channel. 223# 4. Memory consumption and efficient buffer compression when considering 224# more bits in pixel format. 225 226# dataspace is the default data space that SurfaceFlinger expects. 227# The data space must not be Dataspace::UNKNOWN, if unspecified, 228# the default data space is Dataspace::V0_SRGB; 229prop { 230 api_name: "default_composition_dataspace" 231 type: Long 232 scope: Public 233 access: Readonly 234 prop_name: "ro.surface_flinger.default_composition_dataspace" 235} 236 237# pixelFormat is the default pixel format that SurfaceFlinger 238# expects. If unspecified, the default pixel format is 239# PixelFormat::RGBA_8888. 240prop { 241 api_name: "default_composition_pixel_format" 242 type: Integer 243 scope: Public 244 access: Readonly 245 prop_name: "ro.surface_flinger.default_composition_pixel_format" 246} 247 248# wcgDataspace is the data space that SurfaceFlinger expects for 249# wide color gamut surfaces. 250# When hasWideColorDisplay returns true, this API must return a 251# valid wide color gamut data space. 252# The data space must not be UNKNOWN, if unspecified, the data space 253# is V0_SRGB by default, which essentially indicates there's no wide 254# color gamut, meaning hasWideColorDisplay returns false. 255prop { 256 api_name: "wcg_composition_dataspace" 257 type: Long 258 scope: Public 259 access: Readonly 260 prop_name: "ro.surface_flinger.wcg_composition_dataspace" 261} 262 263# wcgPixelFormat is the pixel format that SurfaceFlinger expects for 264# wide color gamut surfaces. If unspecified, the pixel format is 265# PixelFormat::RGBA_8888 by default. 266prop { 267 api_name: "wcg_composition_pixel_format" 268 type: Integer 269 scope: Public 270 access: Readonly 271 prop_name: "ro.surface_flinger.wcg_composition_pixel_format" 272} 273 274# colorSpaceAgnosticDataspace specifies the data space that 275# SurfaceFlinger expects for surfaces which are color space agnostic. 276# The variable works only when useColorManagement is specified. If 277# unspecified, the data space follows what SurfaceFlinger expects for 278# surfaces when useColorManagement is specified. 279 280prop { 281 api_name: "color_space_agnostic_dataspace" 282 type: Long 283 scope: Public 284 access: Readonly 285 prop_name: "ro.surface_flinger.color_space_agnostic_dataspace" 286} 287 288# Return the native panel primary data. The data includes red, green, 289# blue and white. The primary format is CIE 1931 XYZ color space. 290# If unspecified, the primaries is sRGB gamut by default. 291 292prop { 293 api_name: "display_primary_red" 294 type: DoubleList 295 scope: Public 296 access: Readonly 297 prop_name: "ro.surface_flinger.display_primary_red" 298} 299 300prop { 301 api_name: "display_primary_green" 302 type: DoubleList 303 scope: Public 304 access: Readonly 305 prop_name: "ro.surface_flinger.display_primary_green" 306} 307 308prop { 309 api_name: "display_primary_blue" 310 type: DoubleList 311 scope: Public 312 access: Readonly 313 prop_name: "ro.surface_flinger.display_primary_blue" 314} 315 316prop { 317 api_name: "display_primary_white" 318 type: DoubleList 319 scope: Public 320 access: Readonly 321 prop_name: "ro.surface_flinger.display_primary_white" 322} 323 324# refreshRateSwitching indicates whether SurfaceFlinger should use refresh rate 325# switching on the device, e.g. to switch between 60 and 90 Hz. The settings 326# below that are related to refresh rate switching will only have an effect if 327# refresh_rate_switching is enabled. 328prop { 329 api_name: "refresh_rate_switching" 330 type: Boolean 331 scope: System 332 access: Readonly 333 prop_name: "ro.surface_flinger.refresh_rate_switching" 334 deprecated: true 335} 336 337prop { 338 api_name: "set_idle_timer_ms" 339 type: Integer 340 scope: Public 341 access: Readonly 342 prop_name: "ro.surface_flinger.set_idle_timer_ms" 343} 344 345# setTouchTimerMs indicates what is considered a timeout in milliseconds for Scheduler. 346# This value is used by the Scheduler to trigger touch inactivity callbacks that will switch the 347# display to a lower refresh rate. Setting this property to 0 means there is no timer. 348prop { 349 api_name: "set_touch_timer_ms" 350 type: Integer 351 scope: Public 352 access: Readonly 353 prop_name: "ro.surface_flinger.set_touch_timer_ms" 354} 355 356# setDisplayPowerTimerMs indicates what is considered a timeout in milliseconds for Scheduler. 357# This value is used by the Scheduler to trigger display power inactivity callbacks that will 358# keep the display in peak refresh rate as long as display power is not in normal mode. 359# Setting this property to 0 means there is no timer. 360prop { 361 api_name: "set_display_power_timer_ms" 362 type: Integer 363 scope: Public 364 access: Readonly 365 prop_name: "ro.surface_flinger.set_display_power_timer_ms" 366} 367 368# useContentDetectionForRefreshRate indicates whether Scheduler should detect content FPS, and try 369# to adjust the screen refresh rate based on that. 370prop { 371 api_name: "use_content_detection_for_refresh_rate" 372 type: Boolean 373 scope: Public 374 access: Readonly 375 prop_name: "ro.surface_flinger.use_content_detection_for_refresh_rate" 376} 377 378# useSmart90ForVideo indicates whether Scheduler should detect content FPS, and try to adjust the 379# screen refresh rate based on that. 380# Replaced by useContentDetectionForRefreshRate 381prop { 382 api_name: "use_smart_90_for_video" 383 type: Boolean 384 scope: Public 385 access: Readonly 386 prop_name: "ro.surface_flinger.use_smart_90_for_video" 387 deprecated: true 388} 389 390prop { 391 api_name: "enable_protected_contents" 392 type: Boolean 393 scope: Public 394 access: Readonly 395 prop_name: "ro.surface_flinger.protected_contents" 396} 397 398# Indicates whether Scheduler's idle timer should support a display driver timeout in the kernel. 399# The value of set_idle_timer_ms should be shorter in time than the timeout duration in the kernel. 400prop { 401 api_name: "support_kernel_idle_timer" 402 type: Boolean 403 scope: Public 404 access: Readonly 405 prop_name: "ro.surface_flinger.support_kernel_idle_timer" 406} 407 408# Indicates whether background blurs are supported. 409prop { 410 api_name: "supports_background_blur" 411 type: Boolean 412 scope: Public 413 access: Readonly 414 prop_name: "ro.surface_flinger.supports_background_blur" 415} 416 417# Indicates whether Scheduler should use frame rate API when adjusting the 418# display refresh rate. 419prop { 420 api_name: "use_frame_rate_api" 421 type: Boolean 422 scope: Public 423 access: Readonly 424 prop_name: "ro.surface_flinger.use_frame_rate_api" 425} 426 427# Sets the timeout used to rate limit DISPLAY_UPDATE_IMMINENT Power HAL notifications. 428# SurfaceFlinger wakeups will trigger this boost whenever they are separated by more than this 429# duration (specified in milliseconds). A value of 0 disables the rate limit, and will result in 430# Power HAL notifications every time SF wakes up. 431prop { 432 api_name: "display_update_imminent_timeout_ms" 433 type: Integer 434 scope: Public 435 access: Readonly 436 prop_name: "ro.surface_flinger.display_update_imminent_timeout_ms" 437} 438