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/properties.h>
21 
22 /**
23  * This file contains the list of system properties used to configure
24  * the OpenGLRenderer.
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  * Used to enable/disable non-rectangular clipping debugging.
99  *
100  * The accepted values are:
101  * "highlight", drawing commands clipped by the stencil will
102  *              be colored differently
103  * "region", renders the clipping region on screen whenever
104  *           the stencil is set
105  * "hide", don't show the clip
106  *
107  * The default value is "hide".
108  */
109 #define PROPERTY_DEBUG_STENCIL_CLIP "debug.hwui.show_non_rect_clip"
110 
111 /**
112  * Turn on to draw dirty regions every other frame.
113  *
114  * Possible values:
115  * "true", to enable dirty regions debugging
116  * "false", to disable dirty regions debugging
117  */
118 #define PROPERTY_DEBUG_SHOW_DIRTY_REGIONS "debug.hwui.show_dirty_regions"
119 
120 /**
121  * Disables draw operation deferral if set to "true", forcing draw
122  * commands to be issued to OpenGL in order, and processed in sequence
123  * with state-manipulation canvas commands.
124  */
125 #define PROPERTY_DISABLE_DRAW_DEFER "debug.hwui.disable_draw_defer"
126 
127 /**
128  * Used to disable draw operation reordering when deferring draw operations
129  * Has no effect if PROPERTY_DISABLE_DRAW_DEFER is set to "true"
130  */
131 #define PROPERTY_DISABLE_DRAW_REORDER "debug.hwui.disable_draw_reorder"
132 
133 /**
134  * Setting this property will enable or disable the dropping of frames with
135  * empty damage. Default is "true".
136  */
137 #define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage"
138 
139 /**
140  * Controls whether or not HWUI will use the EGL_EXT_buffer_age extension
141  * to do partial invalidates. Setting this to "false" will fall back to
142  * using BUFFER_PRESERVED instead
143  * Default is "true"
144  */
145 #define PROPERTY_USE_BUFFER_AGE "debug.hwui.use_buffer_age"
146 
147 /**
148  * Setting this to "false" will force HWUI to always do full-redraws of the surface.
149  * This will disable the use of EGL_EXT_buffer_age and BUFFER_PRESERVED.
150  * Default is "true"
151  */
152 #define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.enable_partial_updates"
153 
154 #define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead"
155 
156 ///////////////////////////////////////////////////////////////////////////////
157 // Runtime configuration properties
158 ///////////////////////////////////////////////////////////////////////////////
159 
160 /**
161  * Used to enable/disable scissor optimization. The accepted values are
162  * "true" and "false". The default value is "false".
163  *
164  * When scissor optimization is enabled, OpenGLRenderer will attempt to
165  * minimize the use of scissor by selectively enabling and disabling the
166  * GL scissor test.
167  * When the optimization is disabled, OpenGLRenderer will keep the GL
168  * scissor test enabled and change the scissor rect as needed.
169  * Some GPUs (for instance the SGX 540) perform better when changing
170  * the scissor rect often than when enabling/disabling the scissor test
171  * often.
172  */
173 #define PROPERTY_DISABLE_SCISSOR_OPTIMIZATION "ro.hwui.disable_scissor_opt"
174 
175 /**
176  * Indicates whether PBOs can be used to back pixel buffers.
177  * Accepted values are "true" and "false". Default is true.
178  */
179 #define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "ro.hwui.use_gpu_pixel_buffers"
180 
181 // These properties are defined in mega-bytes
182 #define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
183 #define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"
184 #define PROPERTY_RENDER_BUFFER_CACHE_SIZE "ro.hwui.r_buffer_cache_size"
185 #define PROPERTY_GRADIENT_CACHE_SIZE "ro.hwui.gradient_cache_size"
186 #define PROPERTY_PATH_CACHE_SIZE "ro.hwui.path_cache_size"
187 #define PROPERTY_VERTEX_CACHE_SIZE "ro.hwui.vertex_cache_size"
188 #define PROPERTY_PATCH_CACHE_SIZE "ro.hwui.patch_cache_size"
189 #define PROPERTY_DROP_SHADOW_CACHE_SIZE "ro.hwui.drop_shadow_cache_size"
190 #define PROPERTY_FBO_CACHE_SIZE "ro.hwui.fbo_cache_size"
191 
192 // These properties are defined in percentage (range 0..1)
193 #define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flushrate"
194 
195 // These properties are defined in pixels
196 #define PROPERTY_TEXT_SMALL_CACHE_WIDTH "ro.hwui.text_small_cache_width"
197 #define PROPERTY_TEXT_SMALL_CACHE_HEIGHT "ro.hwui.text_small_cache_height"
198 #define PROPERTY_TEXT_LARGE_CACHE_WIDTH "ro.hwui.text_large_cache_width"
199 #define PROPERTY_TEXT_LARGE_CACHE_HEIGHT "ro.hwui.text_large_cache_height"
200 
201 // Gamma (>= 1.0, <= 10.0)
202 #define PROPERTY_TEXT_GAMMA "hwui.text_gamma"
203 
204 ///////////////////////////////////////////////////////////////////////////////
205 // Default property values
206 ///////////////////////////////////////////////////////////////////////////////
207 
208 #define DEFAULT_TEXTURE_CACHE_SIZE 24.0f
209 #define DEFAULT_LAYER_CACHE_SIZE 16.0f
210 #define DEFAULT_RENDER_BUFFER_CACHE_SIZE 2.0f
211 #define DEFAULT_PATH_CACHE_SIZE 4.0f
212 #define DEFAULT_VERTEX_CACHE_SIZE 1.0f
213 #define DEFAULT_PATCH_CACHE_SIZE 128.0f // in kB
214 #define DEFAULT_GRADIENT_CACHE_SIZE 0.5f
215 #define DEFAULT_DROP_SHADOW_CACHE_SIZE 2.0f
216 #define DEFAULT_FBO_CACHE_SIZE 0
217 
218 #define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
219 
220 #define DEFAULT_TEXT_GAMMA 1.4f
221 
222 ///////////////////////////////////////////////////////////////////////////////
223 // Misc
224 ///////////////////////////////////////////////////////////////////////////////
225 
226 // Converts a number of mega-bytes into bytes
227 #define MB(s) s * 1024 * 1024
228 // Converts a number of kilo-bytes into bytes
229 #define KB(s) s * 1024
230 
231 enum class ProfileType {
232     None,
233     Console,
234     Bars
235 };
236 
237 enum class OverdrawColorSet {
238     Default = 0,
239     Deuteranomaly
240 };
241 
242 enum class StencilClipDebug {
243     Hide,
244     ShowHighlight,
245     ShowRegion
246 };
247 
248 /**
249  * Renderthread-only singleton which manages several static rendering properties. Most of these
250  * are driven by system properties which are queried once at initialization, and again if init()
251  * is called.
252  */
253 class Properties {
254 public:
255     static bool load();
256 
257     static bool drawDeferDisabled;
258     static bool drawReorderDisabled;
259     static bool debugLayersUpdates;
260     static bool debugOverdraw;
261     static bool showDirtyRegions;
262     // TODO: Remove after stabilization period
263     static bool skipEmptyFrames;
264     static bool useBufferAge;
265     static bool enablePartialUpdates;
266 
267     static float textGamma;
268 
269     static int fboCacheSize;
270     static int gradientCacheSize;
271     static int layerPoolSize;
272     static int patchCacheSize;
273     static int pathCacheSize;
274     static int renderBufferCacheSize;
275     static int tessellationCacheSize;
276     static int textDropShadowCacheSize;
277     static int textureCacheSize;
278     static float textureCacheFlushRate;
279 
280     static DebugLevel debugLevel;
281     static OverdrawColorSet overdrawColorSet;
282     static StencilClipDebug debugStencilClip;
283 
284     // Override the value for a subset of properties in this class
285     static void overrideProperty(const char* name, const char* value);
286 
287     static float overrideLightRadius;
288     static float overrideLightPosY;
289     static float overrideLightPosZ;
290     static float overrideAmbientRatio;
291     static int overrideAmbientShadowStrength;
292     static int overrideSpotShadowStrength;
293 
294     static ProfileType getProfileType();
295 
296     // Should be used only by test apps
297     static bool waitForGpuCompletion;
298 
299     // Should only be set by automated tests to try and filter out
300     // any overhead they add
301     static bool filterOutTestOverhead;
302 
303 private:
304     static ProfileType sProfileType;
305     static bool sDisableProfileBars;
306 
307 }; // class Caches
308 
309 }; // namespace uirenderer
310 }; // namespace android
311 
312 #endif // ANDROID_HWUI_PROPERTIES_H
313