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