1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_HWUI_PROPERTIES_H
18 #define ANDROID_HWUI_PROPERTIES_H
19 
20 #include <cutils/compiler.h>
21 #include <cutils/properties.h>
22 
23 /**
24  * This file contains the list of system properties used to configure libhwui.
25  */
26 
27 namespace android {
28 namespace uirenderer {
29 
30 ///////////////////////////////////////////////////////////////////////////////
31 // Compile-time properties
32 ///////////////////////////////////////////////////////////////////////////////
33 
34 // Textures used by layers must have dimensions multiples of this number
35 #define LAYER_SIZE 64
36 
37 // Defines the size in bits of the stencil buffer for the framebuffer
38 // Note: Only 1 bit is required for clipping but more bits are required
39 // to properly implement overdraw debugging
40 #define STENCIL_BUFFER_SIZE 8
41 
42 ///////////////////////////////////////////////////////////////////////////////
43 // Debug properties
44 ///////////////////////////////////////////////////////////////////////////////
45 
46 /**
47  * Debug level for app developers. The value is a numeric value defined
48  * by the DebugLevel enum below.
49  */
50 #define PROPERTY_DEBUG "debug.hwui.level"
51 
52 /**
53  * Debug levels. Debug levels are used as flags.
54  */
55 enum DebugLevel {
56     kDebugDisabled = 0,
57     kDebugMemory = 1,
58     kDebugCaches = 2,
59     kDebugMoreCaches = kDebugMemory | kDebugCaches
60 };
61 
62 /**
63  * Used to enable/disable layers update debugging. The accepted values are
64  * "true" and "false". The default value is "false".
65  */
66 #define PROPERTY_DEBUG_LAYERS_UPDATES "debug.hwui.show_layers_updates"
67 
68 /**
69  * Used to enable/disable overdraw debugging.
70  *
71  * The accepted values are
72  * "show", to show overdraw
73  * "show_deuteranomaly", to show overdraw if you suffer from Deuteranomaly
74  * "count", to show an overdraw counter
75  * "false", to disable overdraw debugging
76  *
77  * The default value is "false".
78  */
79 #define PROPERTY_DEBUG_OVERDRAW "debug.hwui.overdraw"
80 
81 /**
82  *  System property used to enable or disable hardware rendering profiling.
83  * The default value of this property is assumed to be false.
84  *
85  * When profiling is enabled, the adb shell dumpsys gfxinfo command will
86  * output extra information about the time taken to execute by the last
87  * frames.
88  *
89  * Possible values:
90  * "true", to enable profiling
91  * "visual_bars", to enable profiling and visualize the results on screen
92  * "false", to disable profiling
93  */
94 #define PROPERTY_PROFILE "debug.hwui.profile"
95 #define PROPERTY_PROFILE_VISUALIZE_BARS "visual_bars"
96 
97 /**
98  * Turn on to draw dirty regions every other frame.
99  *
100  * Possible values:
101  * "true", to enable dirty regions debugging
102  * "false", to disable dirty regions debugging
103  */
104 #define PROPERTY_DEBUG_SHOW_DIRTY_REGIONS "debug.hwui.show_dirty_regions"
105 
106 /**
107  * Setting this property will enable or disable the dropping of frames with
108  * empty damage. Default is "true".
109  */
110 #define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage"
111 
112 /**
113  * Controls whether or not HWUI will use the EGL_EXT_buffer_age extension
114  * to do partial invalidates. Setting this to "false" will fall back to
115  * using BUFFER_PRESERVED instead
116  * Default is "true"
117  */
118 #define PROPERTY_USE_BUFFER_AGE "debug.hwui.use_buffer_age"
119 
120 /**
121  * Setting this to "false" will force HWUI to always do full-redraws of the surface.
122  * This will disable the use of EGL_EXT_buffer_age and BUFFER_PRESERVED.
123  * Default is "true"
124  */
125 #define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.use_partial_updates"
126 
127 #define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead"
128 
129 /**
130  * Indicates whether PBOs can be used to back pixel buffers.
131  * Accepted values are "true" and "false". Default is true.
132  */
133 #define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "debug.hwui.use_gpu_pixel_buffers"
134 
135 /**
136  * Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL
137  * or Vulkan.
138  */
139 #define PROPERTY_RENDERER "debug.hwui.renderer"
140 
141 /**
142  * Allows to collect a recording of Skia drawing commands.
143  */
144 #define PROPERTY_CAPTURE_SKP_ENABLED "debug.hwui.capture_skp_enabled"
145 
146 /**
147  * Allows to record Skia drawing commands with systrace.
148  */
149 #define PROPERTY_SKIA_ATRACE_ENABLED "debug.hwui.skia_atrace_enabled"
150 
151 /**
152  * Defines how many frames in a sequence to capture.
153  */
154 #define PROPERTY_CAPTURE_SKP_FRAMES "debug.hwui.capture_skp_frames"
155 
156 /**
157  * File name and location, where a SKP recording will be saved.
158  */
159 #define PROPERTY_CAPTURE_SKP_FILENAME "debug.hwui.skp_filename"
160 
161 /**
162  * Property for whether this is running in the emulator.
163  */
164 #define PROPERTY_QEMU_KERNEL "ro.kernel.qemu"
165 
166 #define PROPERTY_RENDERAHEAD "debug.hwui.render_ahead"
167 
168 ///////////////////////////////////////////////////////////////////////////////
169 // Misc
170 ///////////////////////////////////////////////////////////////////////////////
171 
172 // Converts a number of mega-bytes into bytes
173 #define MB(s) ((s)*1024 * 1024)
174 // Converts a number of kilo-bytes into bytes
175 #define KB(s) ((s)*1024)
176 
177 enum class ProfileType { None, Console, Bars };
178 
179 enum class OverdrawColorSet { Default = 0, Deuteranomaly };
180 
181 enum class RenderPipelineType { SkiaGL, SkiaVulkan, NotInitialized = 128 };
182 
183 /**
184  * Renderthread-only singleton which manages several static rendering properties. Most of these
185  * are driven by system properties which are queried once at initialization, and again if init()
186  * is called.
187  */
188 class Properties {
189 public:
190     static bool load();
191 
192     static bool debugLayersUpdates;
193     static bool debugOverdraw;
194     static bool showDirtyRegions;
195     // TODO: Remove after stabilization period
196     static bool skipEmptyFrames;
197     static bool useBufferAge;
198     static bool enablePartialUpdates;
199 
200     // TODO: Move somewhere else?
201     static constexpr float textGamma = 1.45f;
202 
203     static DebugLevel debugLevel;
204     static OverdrawColorSet overdrawColorSet;
205 
206     // Override the value for a subset of properties in this class
207     static void overrideProperty(const char* name, const char* value);
208 
209     static float overrideLightRadius;
210     static float overrideLightPosY;
211     static float overrideLightPosZ;
212     static float overrideAmbientRatio;
213     static int overrideAmbientShadowStrength;
214     static int overrideSpotShadowStrength;
215 
216     static ProfileType getProfileType();
217     ANDROID_API static RenderPipelineType peekRenderPipelineType();
218     ANDROID_API static RenderPipelineType getRenderPipelineType();
219 
220     ANDROID_API static bool enableHighContrastText;
221 
222     // Should be used only by test apps
223     static bool waitForGpuCompletion;
224     static bool forceDrawFrame;
225 
226     // Should only be set by automated tests to try and filter out
227     // any overhead they add
228     static bool filterOutTestOverhead;
229 
230     // Workaround a device lockup in edge cases by switching to async mode
231     // instead of the default vsync (b/38372997). Only system_server should hit this.
232     // Any existing RenderProxy & Surface combination will be unaffected, only things
233     // created after changing this.
234     static bool disableVsync;
235 
236     static bool skpCaptureEnabled;
237 
238     // For experimentation b/68769804
239     ANDROID_API static bool enableRTAnimations;
240 
241     // Used for testing only to change the render pipeline.
242     static void overrideRenderPipelineType(RenderPipelineType);
243 
244     static bool runningInEmulator;
245 
246     ANDROID_API static bool debuggingEnabled;
247     ANDROID_API static bool isolatedProcess;
248 
249     ANDROID_API static int contextPriority;
250 
251     static int defaultRenderAhead;
252 
253 private:
254     static ProfileType sProfileType;
255     static bool sDisableProfileBars;
256     static RenderPipelineType sRenderPipelineType;
257 };  // class Caches
258 
259 }  // namespace uirenderer
260 }  // namespace android
261 
262 #endif  // ANDROID_HWUI_PROPERTIES_H
263