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 
15 module: "android.sysprop.SurfaceFlingerProperties"
16 owner: 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
36 prop {
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 
44 prop {
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.
53 prop {
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.
62 prop {
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.
80 prop {
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.
90 prop {
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.
108 prop {
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.
117 prop {
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.
129 prop {
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).
139 prop {
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.
151 prop {
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.
161 prop {
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.
170 prop {
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.
182 prop {
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;
209 prop {
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.
220 prop {
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.
235 prop {
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.
246 prop {
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 
260 prop {
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 
272 prop {
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 
280 prop {
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 
288 prop {
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 
296 prop {
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.
308 prop {
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.
319 prop {
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.
330 prop {
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.
342 prop {
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.
352 prop {
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 
360 prop {
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.
370 prop {
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