Home | History | Annotate | Download | only in hwui
      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 #include <stdlib.h>
     22 #include <utils/Singleton.h>
     23 
     24 /**
     25  * This file contains the list of system properties used to configure
     26  * the OpenGLRenderer.
     27  */
     28 
     29 namespace android {
     30 namespace uirenderer {
     31 
     32 ///////////////////////////////////////////////////////////////////////////////
     33 // Compile-time properties
     34 ///////////////////////////////////////////////////////////////////////////////
     35 
     36 // If turned on, text is interpreted as glyphs instead of UTF-16
     37 #define RENDER_TEXT_AS_GLYPHS 1
     38 
     39 // Indicates whether to remove the biggest layers first, or the smaller ones
     40 #define LAYER_REMOVE_BIGGEST_FIRST 0
     41 
     42 // Textures used by layers must have dimensions multiples of this number
     43 #define LAYER_SIZE 64
     44 
     45 // Defines the size in bits of the stencil buffer for the framebuffer
     46 // Note: Only 1 bit is required for clipping but more bits are required
     47 // to properly implement overdraw debugging
     48 #define STENCIL_BUFFER_SIZE 8
     49 
     50 ///////////////////////////////////////////////////////////////////////////////
     51 // Debug properties
     52 ///////////////////////////////////////////////////////////////////////////////
     53 
     54 /**
     55  * Debug level for app developers. The value is a numeric value defined
     56  * by the DebugLevel enum below.
     57  */
     58 #define PROPERTY_DEBUG "debug.hwui.level"
     59 
     60 /**
     61  * Debug levels. Debug levels are used as flags.
     62  */
     63 enum DebugLevel {
     64     kDebugDisabled = 0,
     65     kDebugMemory = 1,
     66     kDebugCaches = 2,
     67     kDebugMoreCaches = kDebugMemory | kDebugCaches
     68 };
     69 
     70 /**
     71  * Used to enable/disable layers update debugging. The accepted values are
     72  * "true" and "false". The default value is "false".
     73  */
     74 #define PROPERTY_DEBUG_LAYERS_UPDATES "debug.hwui.show_layers_updates"
     75 
     76 /**
     77  * Used to enable/disable overdraw debugging.
     78  *
     79  * The accepted values are
     80  * "show", to show overdraw
     81  * "show_deuteranomaly", to show overdraw if you suffer from Deuteranomaly
     82  * "count", to show an overdraw counter
     83  * "false", to disable overdraw debugging
     84  *
     85  * The default value is "false".
     86  */
     87 #define PROPERTY_DEBUG_OVERDRAW "debug.hwui.overdraw"
     88 
     89 /**
     90  * Used to enable/disable PerfHUD ES profiling. The accepted values
     91  * are "true" and "false". The default value is "false".
     92  */
     93 #define PROPERTY_DEBUG_NV_PROFILING "debug.hwui.nv_profiling"
     94 
     95 /**
     96  *  System property used to enable or disable hardware rendering profiling.
     97  * The default value of this property is assumed to be false.
     98  *
     99  * When profiling is enabled, the adb shell dumpsys gfxinfo command will
    100  * output extra information about the time taken to execute by the last
    101  * frames.
    102  *
    103  * Possible values:
    104  * "true", to enable profiling
    105  * "visual_bars", to enable profiling and visualize the results on screen
    106  * "false", to disable profiling
    107  */
    108 #define PROPERTY_PROFILE "debug.hwui.profile"
    109 #define PROPERTY_PROFILE_VISUALIZE_BARS "visual_bars"
    110 
    111 /**
    112  * Used to enable/disable non-rectangular clipping debugging.
    113  *
    114  * The accepted values are:
    115  * "highlight", drawing commands clipped by the stencil will
    116  *              be colored differently
    117  * "region", renders the clipping region on screen whenever
    118  *           the stencil is set
    119  * "hide", don't show the clip
    120  *
    121  * The default value is "hide".
    122  */
    123 #define PROPERTY_DEBUG_STENCIL_CLIP "debug.hwui.show_non_rect_clip"
    124 
    125 /**
    126  * Turn on to draw dirty regions every other frame.
    127  *
    128  * Possible values:
    129  * "true", to enable dirty regions debugging
    130  * "false", to disable dirty regions debugging
    131  */
    132 #define PROPERTY_DEBUG_SHOW_DIRTY_REGIONS "debug.hwui.show_dirty_regions"
    133 
    134 /**
    135  * Disables draw operation deferral if set to "true", forcing draw
    136  * commands to be issued to OpenGL in order, and processed in sequence
    137  * with state-manipulation canvas commands.
    138  */
    139 #define PROPERTY_DISABLE_DRAW_DEFER "debug.hwui.disable_draw_defer"
    140 
    141 /**
    142  * Used to disable draw operation reordering when deferring draw operations
    143  * Has no effect if PROPERTY_DISABLE_DRAW_DEFER is set to "true"
    144  */
    145 #define PROPERTY_DISABLE_DRAW_REORDER "debug.hwui.disable_draw_reorder"
    146 
    147 /**
    148  * Setting this property will enable or disable the dropping of frames with
    149  * empty damage. Default is "true".
    150  */
    151 #define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage"
    152 
    153 /**
    154  * Setting this property will enable usage of EGL_KHR_swap_buffers_with_damage
    155  * See: https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_swap_buffers_with_damage.txt
    156  * Default is "false" temporarily
    157  * TODO: Change to "true", make sure to remove the log in EglManager::swapBuffers
    158  * before changing this to default to true!
    159  */
    160 #define PROPERTY_SWAP_WITH_DAMAGE "debug.hwui.swap_with_damage"
    161 
    162 ///////////////////////////////////////////////////////////////////////////////
    163 // Runtime configuration properties
    164 ///////////////////////////////////////////////////////////////////////////////
    165 
    166 /**
    167  * Used to enable/disable scissor optimization. The accepted values are
    168  * "true" and "false". The default value is "false".
    169  *
    170  * When scissor optimization is enabled, OpenGLRenderer will attempt to
    171  * minimize the use of scissor by selectively enabling and disabling the
    172  * GL scissor test.
    173  * When the optimization is disabled, OpenGLRenderer will keep the GL
    174  * scissor test enabled and change the scissor rect as needed.
    175  * Some GPUs (for instance the SGX 540) perform better when changing
    176  * the scissor rect often than when enabling/disabling the scissor test
    177  * often.
    178  */
    179 #define PROPERTY_DISABLE_SCISSOR_OPTIMIZATION "ro.hwui.disable_scissor_opt"
    180 
    181 /**
    182  * Indicates whether PBOs can be used to back pixel buffers.
    183  * Accepted values are "true" and "false". Default is true.
    184  */
    185 #define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "ro.hwui.use_gpu_pixel_buffers"
    186 
    187 // These properties are defined in mega-bytes
    188 #define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
    189 #define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"
    190 #define PROPERTY_RENDER_BUFFER_CACHE_SIZE "ro.hwui.r_buffer_cache_size"
    191 #define PROPERTY_GRADIENT_CACHE_SIZE "ro.hwui.gradient_cache_size"
    192 #define PROPERTY_PATH_CACHE_SIZE "ro.hwui.path_cache_size"
    193 #define PROPERTY_VERTEX_CACHE_SIZE "ro.hwui.vertex_cache_size"
    194 #define PROPERTY_PATCH_CACHE_SIZE "ro.hwui.patch_cache_size"
    195 #define PROPERTY_DROP_SHADOW_CACHE_SIZE "ro.hwui.drop_shadow_cache_size"
    196 #define PROPERTY_FBO_CACHE_SIZE "ro.hwui.fbo_cache_size"
    197 
    198 // These properties are defined in percentage (range 0..1)
    199 #define PROPERTY_TEXTURE_CACHE_FLUSH_RATE "ro.hwui.texture_cache_flushrate"
    200 
    201 // These properties are defined in pixels
    202 #define PROPERTY_TEXT_SMALL_CACHE_WIDTH "ro.hwui.text_small_cache_width"
    203 #define PROPERTY_TEXT_SMALL_CACHE_HEIGHT "ro.hwui.text_small_cache_height"
    204 #define PROPERTY_TEXT_LARGE_CACHE_WIDTH "ro.hwui.text_large_cache_width"
    205 #define PROPERTY_TEXT_LARGE_CACHE_HEIGHT "ro.hwui.text_large_cache_height"
    206 
    207 // Indicates whether gamma correction should be applied in the shaders
    208 // or in lookup tables. Accepted values:
    209 //
    210 //     - "lookup3", correction based on lookup tables. Gamma correction
    211 //        is different for black and white text (see thresholds below)
    212 //
    213 //     - "lookup", correction based on a single lookup table
    214 //
    215 //     - "shader3", correction applied by a GLSL shader. Gamma correction
    216 //        is different for black and white text (see thresholds below)
    217 //
    218 //     - "shader", correction applied by a GLSL shader
    219 //
    220 // See PROPERTY_TEXT_GAMMA, PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD and
    221 // PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD for more control.
    222 #define PROPERTY_TEXT_GAMMA_METHOD "hwui.text_gamma_correction"
    223 #define DEFAULT_TEXT_GAMMA_METHOD "lookup"
    224 
    225 // Gamma (>= 1.0, <= 10.0)
    226 #define PROPERTY_TEXT_GAMMA "hwui.text_gamma"
    227 // Luminance threshold below which black gamma correction is applied. Range: [0..255]
    228 #define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "hwui.text_gamma.black_threshold"
    229 // Lumincance threshold above which white gamma correction is applied. Range: [0..255]
    230 #define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "hwui.text_gamma.white_threshold"
    231 
    232 ///////////////////////////////////////////////////////////////////////////////
    233 // Default property values
    234 ///////////////////////////////////////////////////////////////////////////////
    235 
    236 #define DEFAULT_TEXTURE_CACHE_SIZE 24.0f
    237 #define DEFAULT_LAYER_CACHE_SIZE 16.0f
    238 #define DEFAULT_RENDER_BUFFER_CACHE_SIZE 2.0f
    239 #define DEFAULT_PATH_CACHE_SIZE 4.0f
    240 #define DEFAULT_VERTEX_CACHE_SIZE 1.0f
    241 #define DEFAULT_PATCH_CACHE_SIZE 128 // in kB
    242 #define DEFAULT_GRADIENT_CACHE_SIZE 0.5f
    243 #define DEFAULT_DROP_SHADOW_CACHE_SIZE 2.0f
    244 #define DEFAULT_FBO_CACHE_SIZE 0
    245 
    246 #define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
    247 
    248 #define DEFAULT_TEXT_GAMMA 1.4f
    249 #define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
    250 #define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
    251 
    252 ///////////////////////////////////////////////////////////////////////////////
    253 // Misc
    254 ///////////////////////////////////////////////////////////////////////////////
    255 
    256 // Converts a number of mega-bytes into bytes
    257 #define MB(s) s * 1024 * 1024
    258 // Converts a number of kilo-bytes into bytes
    259 #define KB(s) s * 1024
    260 
    261 enum class ProfileType {
    262     None,
    263     Console,
    264     Bars
    265 };
    266 
    267 enum class OverdrawColorSet {
    268     Default = 0,
    269     Deuteranomaly
    270 };
    271 
    272 enum class StencilClipDebug {
    273     Hide,
    274     ShowHighlight,
    275     ShowRegion
    276 };
    277 
    278 /**
    279  * Renderthread-only singleton which manages several static rendering properties. Most of these
    280  * are driven by system properties which are queried once at initialization, and again if init()
    281  * is called.
    282  */
    283 class Properties {
    284 public:
    285     static bool load();
    286 
    287     static bool drawDeferDisabled;
    288     static bool drawReorderDisabled;
    289     static bool debugLayersUpdates;
    290     static bool debugOverdraw;
    291     static bool showDirtyRegions;
    292     // TODO: Remove after stabilization period
    293     static bool skipEmptyFrames;
    294     // TODO: Remove after stabilization period
    295     static bool swapBuffersWithDamage;
    296 
    297     static DebugLevel debugLevel;
    298     static OverdrawColorSet overdrawColorSet;
    299     static StencilClipDebug debugStencilClip;
    300 
    301     // Override the value for a subset of properties in this class
    302     static void overrideProperty(const char* name, const char* value);
    303 
    304     static float overrideLightRadius;
    305     static float overrideLightPosY;
    306     static float overrideLightPosZ;
    307     static float overrideAmbientRatio;
    308     static int overrideAmbientShadowStrength;
    309     static int overrideSpotShadowStrength;
    310 
    311     static ProfileType getProfileType();
    312 
    313 private:
    314     static ProfileType sProfileType;
    315     static bool sDisableProfileBars;
    316 
    317 }; // class Caches
    318 
    319 }; // namespace uirenderer
    320 }; // namespace android
    321 
    322 #endif // ANDROID_HWUI_PROPERTIES_H
    323