# Copyright (C) 2019 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the License); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an AS IS BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module: "android.sysprop.SurfaceFlingerProperties" owner: Platform # The following two properties define (respectively): # # - The phase offset between hardware vsync and when apps are woken up by the # Choreographer callback # - The phase offset between hardware vsync and when SurfaceFlinger wakes up # to consume input # Their values may be tuned to trade off between display pipeline latency (both # overall latency and the lengths of the app --> SF and SF --> display phases) # and frame delivery jitter (which typically manifests as "jank" or "jerkiness" # while interacting with the device). The default values must produce a # relatively low amount of jitter at the expense of roughly two frames of # app --> display latency, and unless significant testing is performed to avoid # increased display jitter (both manual investigation using systrace [1] and # automated testing using dumpsys gfxinfo [2] are recommended), they should not # be modified. # # [1] https://developer.android.com/studio/profile/systrace.html # [2] https://developer.android.com/training/testing/performance.html prop { api_name: "vsync_event_phase_offset_ns" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.vsync_event_phase_offset_ns" } prop { api_name: "vsync_sf_event_phase_offset_ns" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.vsync_sf_event_phase_offset_ns" } # Instruct the Render Engine to use EGL_IMG_context_priority hint if available. prop { api_name: "use_context_priority" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.use_context_priority" } # Controls the number of buffers SurfaceFlinger will allocate for use in FramebufferSurface. prop { api_name: "max_frame_buffer_acquired_buffers" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.max_frame_buffer_acquired_buffers" } # Controls the maximum width in pixels that the graphics pipeline can support for GPU fallback # composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs. prop { api_name: "max_graphics_width" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.max_graphics_width" } # Controls the maximum height in pixels that the graphics pipeline can support for GPU fallback # composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs. prop { api_name: "max_graphics_height" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.max_graphics_height" } # hasWideColorDisplay indicates that the device has # or can support a wide-color display, e.g. color space # greater than sRGB. Typical display may have same # color primaries as DCI-P3. # Indicate support for this feature by setting # TARGET_HAS_WIDE_COLOR_DISPLAY to true in BoardConfig.mk # This also means that the device is color managed. # A color managed device will use the appropriate # display mode depending on the content on the screen. # Default is sRGB. prop { api_name: "has_wide_color_display" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.has_wide_color_display" } # Indicates if Sync framework is available. Sync framework provides fence # mechanism which significantly reduces buffer processing latency. prop { api_name: "running_without_sync_framework" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.running_without_sync_framework" } # hwHDRDisplay indicates that the device has an High Dynamic Range display. # A display is considered High Dynamic Range if it # # 1. is a wide color gamut display, typically DCI-P3 or lager # 2. has high luminance capability, typically 540 nits or higher at 10% OPR # # Indicate support for this feature by setting # ro.surface_flinger.has_HDR_display to true in device.mk # ro.surface_flinger.has_wide_color_display must be set to true when # ro.surface_flinger.has_HDR_display is true. prop { api_name: "has_HDR_display" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.has_HDR_display" } # Specify the offset in nanoseconds to add to vsync time when timestamping present fences. prop { api_name: "present_time_offset_from_vsync_ns" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.present_time_offset_from_vsync_ns" } # Some hardware can do RGB->YUV conversion more efficiently in hardware # controlled by HWC than in hardware controlled by the video encoder. # This instruct VirtualDisplaySurface to use HWC for such conversion on # GL composition. prop { api_name: "force_hwc_copy_for_virtual_displays" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.force_hwc_copy_for_virtual_displays" } # Maximum dimension supported by HWC for virtual display. # Must be equals to min(max_width, max_height). prop { api_name: "max_virtual_display_dimension" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.max_virtual_display_dimension" } # Return true if surface flinger should use vr flinger for compatible vr # apps, false otherwise. Devices that will never be running vr apps should # return false to avoid extra resource usage. Daydream ready devices must # return true for full vr support. prop { api_name: "use_vr_flinger" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.use_vr_flinger" } # Returns true if surface flinger should start # hardware.graphics.allocator@2.0::IAllocator service. prop { api_name: "start_graphics_allocator_service" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.start_graphics_allocator_service" } # Returns the orientation of the primary display device. prop { api_name: "primary_display_orientation" type: Enum enum_values: "ORIENTATION_0|ORIENTATION_90|ORIENTATION_180|ORIENTATION_270" scope: Public access: Readonly prop_name: "ro.surface_flinger.primary_display_orientation" } # useColorManagement indicates whether SurfaceFlinger should manage color # by switching to appropriate color mode automatically depending on the # Dataspace of the surfaces on screen. # DEPRECATED: SurfaceFlinger is always color managed. prop { api_name: "use_color_management" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.use_color_management" } # The following four properties define: # Returns the default data space and pixel format that SurfaceFlinger # expects to receive and output as well as the wide color gamut data space # and pixel format for wide color gamut surfaces. # To determine the data space and pixel format, there are a few things # we recommend to consider: # # 1. Hardware composer's capability to composite contents with the chosen # data space and pixel format efficiently; # 2. Hardware composer's ability to composite contents when sRGB contents # and the chosen wide color gamut data space contents coexist; # 3. For better blending, consider using pixel format where the alpha # channel has as many bits as the RGB color channel. # 4. Memory consumption and efficient buffer compression when considering # more bits in pixel format. # dataspace is the default data space that SurfaceFlinger expects. # The data space must not be Dataspace::UNKNOWN, if unspecified, # the default data space is Dataspace::V0_SRGB; prop { api_name: "default_composition_dataspace" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.default_composition_dataspace" } # pixelFormat is the default pixel format that SurfaceFlinger # expects. If unspecified, the default pixel format is # PixelFormat::RGBA_8888. prop { api_name: "default_composition_pixel_format" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.default_composition_pixel_format" } # wcgDataspace is the data space that SurfaceFlinger expects for # wide color gamut surfaces. # When hasWideColorDisplay returns true, this API must return a # valid wide color gamut data space. # The data space must not be UNKNOWN, if unspecified, the data space # is V0_SRGB by default, which essentially indicates there's no wide # color gamut, meaning hasWideColorDisplay returns false. prop { api_name: "wcg_composition_dataspace" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.wcg_composition_dataspace" } # wcgPixelFormat is the pixel format that SurfaceFlinger expects for # wide color gamut surfaces. If unspecified, the pixel format is # PixelFormat::RGBA_8888 by default. prop { api_name: "wcg_composition_pixel_format" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.wcg_composition_pixel_format" } # colorSpaceAgnosticDataspace specifies the data space that # SurfaceFlinger expects for surfaces which are color space agnostic. # The variable works only when useColorManagement is specified. If # unspecified, the data space follows what SurfaceFlinger expects for # surfaces when useColorManagement is specified. # DEPRECATED: do not use prop { api_name: "color_space_agnostic_dataspace" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.color_space_agnostic_dataspace" } # Return the native panel primary data. The data includes red, green, # blue and white. The primary format is CIE 1931 XYZ color space. # If unspecified, the primaries is sRGB gamut by default. prop { api_name: "display_primary_red" type: DoubleList scope: Public access: Readonly prop_name: "ro.surface_flinger.display_primary_red" } prop { api_name: "display_primary_green" type: DoubleList scope: Public access: Readonly prop_name: "ro.surface_flinger.display_primary_green" } prop { api_name: "display_primary_blue" type: DoubleList scope: Public access: Readonly prop_name: "ro.surface_flinger.display_primary_blue" } prop { api_name: "display_primary_white" type: DoubleList scope: Public access: Readonly prop_name: "ro.surface_flinger.display_primary_white" } # refreshRateSwitching indicates whether SurfaceFlinger should use refresh rate # switching on the device, e.g. to switch between 60 and 90 Hz. The settings # below that are related to refresh rate switching will only have an effect if # refresh_rate_switching is enabled. prop { api_name: "refresh_rate_switching" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.refresh_rate_switching" deprecated: true } prop { api_name: "set_idle_timer_ms" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.set_idle_timer_ms" } # setTouchTimerMs indicates what is considered a timeout in milliseconds for Scheduler. # This value is used by the Scheduler to trigger touch inactivity callbacks that will switch the # display to a lower refresh rate. Setting this property to 0 means there is no timer. prop { api_name: "set_touch_timer_ms" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.set_touch_timer_ms" } # setDisplayPowerTimerMs indicates what is considered a timeout in milliseconds for Scheduler. # This value is used by the Scheduler to trigger display power inactivity callbacks that will # keep the display in peak refresh rate as long as display power is not in normal mode. # Setting this property to 0 means there is no timer. prop { api_name: "set_display_power_timer_ms" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.set_display_power_timer_ms" } # useContentDetectionForRefreshRate indicates whether Scheduler should detect content FPS, and try # to adjust the screen refresh rate based on that. prop { api_name: "use_content_detection_for_refresh_rate" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.use_content_detection_for_refresh_rate" } # useSmart90ForVideo indicates whether Scheduler should detect content FPS, and try to adjust the # screen refresh rate based on that. # Replaced by useContentDetectionForRefreshRate prop { api_name: "use_smart_90_for_video" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.use_smart_90_for_video" deprecated: true } prop { api_name: "enable_protected_contents" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.protected_contents" } # Indicates whether Scheduler's idle timer should support a display driver timeout in the kernel. # The value of set_idle_timer_ms should be shorter in time than the timeout duration in the kernel. prop { api_name: "support_kernel_idle_timer" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.support_kernel_idle_timer" } # Indicates whether background blurs are supported. prop { api_name: "supports_background_blur" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.supports_background_blur" } # Sets the timeout used to rate limit DISPLAY_UPDATE_IMMINENT Power HAL notifications. # SurfaceFlinger wakeups will trigger this boost whenever they are separated by more than this # duration (specified in milliseconds). A value of 0 disables the rate limit, and will result in # Power HAL notifications every time SF wakes up. prop { api_name: "display_update_imminent_timeout_ms" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.display_update_imminent_timeout_ms" } # Updates the DeviceProductInfo when a hoplug reconnect event is processed prop { api_name: "update_device_product_info_on_hotplug_reconnect" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.update_device_product_info_on_hotplug_reconnect" } # Enables the frame rate override feature prop { api_name: "enable_frame_rate_override" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.enable_frame_rate_override" } # Enables Layer Caching prop { api_name: "enable_layer_caching" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.enable_layer_caching" } # Enables SDR layer dimming prop { api_name: "enable_sdr_dimming" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.enable_sdr_dimming" } # Ignores Camera layers when calculating HDR coverage information prop { api_name: "ignore_hdr_camera_layers" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.ignore_hdr_camera_layers" } # Controls the minimum acquired buffers SurfaceFlinger will suggest via # ISurfaceComposer.getMaxAcquiredBufferCount(). prop { api_name: "min_acquired_buffers" type: Long scope: Public access: Readonly prop_name: "ro.surface_flinger.min_acquired_buffers" } # When enabled, SurfaceFlinger will attempt to clear the per-layer HAL buffer cache slots for # buffers when they are evicted from the app cache by using additional setLayerBuffer commands. # Ideally, this behavior would always be enabled to reduce graphics memory consumption. However, # Some HAL implementations may not support the additional setLayerBuffer commands used to clear # the cache slots. prop { api_name: "clear_slots_with_set_layer_buffer" type: Boolean scope: Public access: Readonly prop_name: "ro.surface_flinger.clear_slots_with_set_layer_buffer" } # Controls the default frame rate override of game applications. Ideally, game applications set # desired frame rate via setFrameRate() API. However, to cover the scenario when the game didn't # have a set frame rate, we introduce the default frame rate. The priority of this override is the # lowest among setFrameRate() and game intervention override. prop { api_name: "game_default_frame_rate_override" type: Integer scope: Public access: Readonly prop_name: "ro.surface_flinger.game_default_frame_rate_override" }