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 
     22 /**
     23  * This file contains the list of system properties used to configure libhwui.
     24  */
     25 
     26 namespace android {
     27 namespace uirenderer {
     28 
     29 ///////////////////////////////////////////////////////////////////////////////
     30 // Compile-time properties
     31 ///////////////////////////////////////////////////////////////////////////////
     32 
     33 // Textures used by layers must have dimensions multiples of this number
     34 #define LAYER_SIZE 64
     35 
     36 // Defines the size in bits of the stencil buffer for the framebuffer
     37 // Note: Only 1 bit is required for clipping but more bits are required
     38 // to properly implement overdraw debugging
     39 #define STENCIL_BUFFER_SIZE 8
     40 
     41 ///////////////////////////////////////////////////////////////////////////////
     42 // Debug properties
     43 ///////////////////////////////////////////////////////////////////////////////
     44 
     45 /**
     46  * Debug level for app developers. The value is a numeric value defined
     47  * by the DebugLevel enum below.
     48  */
     49 #define PROPERTY_DEBUG "debug.hwui.level"
     50 
     51 /**
     52  * Debug levels. Debug levels are used as flags.
     53  */
     54 enum DebugLevel {
     55     kDebugDisabled = 0,
     56     kDebugMemory = 1,
     57     kDebugCaches = 2,
     58     kDebugMoreCaches = kDebugMemory | kDebugCaches
     59 };
     60 
     61 /**
     62  * Used to enable/disable layers update debugging. The accepted values are
     63  * "true" and "false". The default value is "false".
     64  */
     65 #define PROPERTY_DEBUG_LAYERS_UPDATES "debug.hwui.show_layers_updates"
     66 
     67 /**
     68  * Used to enable/disable overdraw debugging.
     69  *
     70  * The accepted values are
     71  * "show", to show overdraw
     72  * "show_deuteranomaly", to show overdraw if you suffer from Deuteranomaly
     73  * "count", to show an overdraw counter
     74  * "false", to disable overdraw debugging
     75  *
     76  * The default value is "false".
     77  */
     78 #define PROPERTY_DEBUG_OVERDRAW "debug.hwui.overdraw"
     79 
     80 /**
     81  *  System property used to enable or disable hardware rendering profiling.
     82  * The default value of this property is assumed to be false.
     83  *
     84  * When profiling is enabled, the adb shell dumpsys gfxinfo command will
     85  * output extra information about the time taken to execute by the last
     86  * frames.
     87  *
     88  * Possible values:
     89  * "true", to enable profiling
     90  * "visual_bars", to enable profiling and visualize the results on screen
     91  * "false", to disable profiling
     92  */
     93 #define PROPERTY_PROFILE "debug.hwui.profile"
     94 #define PROPERTY_PROFILE_VISUALIZE_BARS "visual_bars"
     95 
     96 /**
     97  * Used to enable/disable non-rectangular clipping debugging.
     98  *
     99  * The accepted values are:
    100  * "highlight", drawing commands clipped by the stencil will
    101  *              be colored differently
    102  * "region", renders the clipping region on screen whenever
    103  *           the stencil is set
    104  * "hide", don't show the clip
    105  *
    106  * The default value is "hide".
    107  */
    108 #define PROPERTY_DEBUG_STENCIL_CLIP "debug.hwui.show_non_rect_clip"
    109 
    110 /**
    111  * Turn on to draw dirty regions every other frame.
    112  *
    113  * Possible values:
    114  * "true", to enable dirty regions debugging
    115  * "false", to disable dirty regions debugging
    116  */
    117 #define PROPERTY_DEBUG_SHOW_DIRTY_REGIONS "debug.hwui.show_dirty_regions"
    118 
    119 /**
    120  * Disables draw operation deferral if set to "true", forcing draw
    121  * commands to be issued to OpenGL in order, and processed in sequence
    122  * with state-manipulation canvas commands.
    123  */
    124 #define PROPERTY_DISABLE_DRAW_DEFER "debug.hwui.disable_draw_defer"
    125 
    126 /**
    127  * Used to disable draw operation reordering when deferring draw operations
    128  * Has no effect if PROPERTY_DISABLE_DRAW_DEFER is set to "true"
    129  */
    130 #define PROPERTY_DISABLE_DRAW_REORDER "debug.hwui.disable_draw_reorder"
    131 
    132 /**
    133  * Setting this property will enable or disable the dropping of frames with
    134  * empty damage. Default is "true".
    135  */
    136 #define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage"
    137 
    138 /**
    139  * Controls whether or not HWUI will use the EGL_EXT_buffer_age extension
    140  * to do partial invalidates. Setting this to "false" will fall back to
    141  * using BUFFER_PRESERVED instead
    142  * Default is "true"
    143  */
    144 #define PROPERTY_USE_BUFFER_AGE "debug.hwui.use_buffer_age"
    145 
    146 /**
    147  * Setting this to "false" will force HWUI to always do full-redraws of the surface.
    148  * This will disable the use of EGL_EXT_buffer_age and BUFFER_PRESERVED.
    149  * Default is "true"
    150  */
    151 #define PROPERTY_ENABLE_PARTIAL_UPDATES "debug.hwui.use_partial_updates"
    152 
    153 #define PROPERTY_FILTER_TEST_OVERHEAD "debug.hwui.filter_test_overhead"
    154 
    155 /**
    156  * Indicates whether PBOs can be used to back pixel buffers.
    157  * Accepted values are "true" and "false". Default is true.
    158  */
    159 #define PROPERTY_ENABLE_GPU_PIXEL_BUFFERS "debug.hwui.use_gpu_pixel_buffers"
    160 
    161 /**
    162  * Allows to set rendering pipeline mode to OpenGL (default), Skia OpenGL
    163  * or Vulkan.
    164  */
    165 #define PROPERTY_RENDERER "debug.hwui.renderer"
    166 
    167 ///////////////////////////////////////////////////////////////////////////////
    168 // Misc
    169 ///////////////////////////////////////////////////////////////////////////////
    170 
    171 // Converts a number of mega-bytes into bytes
    172 #define MB(s) ((s) * 1024 * 1024)
    173 // Converts a number of kilo-bytes into bytes
    174 #define KB(s) ((s) * 1024)
    175 
    176 enum class ProfileType {
    177     None,
    178     Console,
    179     Bars
    180 };
    181 
    182 enum class OverdrawColorSet {
    183     Default = 0,
    184     Deuteranomaly
    185 };
    186 
    187 enum class StencilClipDebug {
    188     Hide,
    189     ShowHighlight,
    190     ShowRegion
    191 };
    192 
    193 enum class RenderPipelineType {
    194     OpenGL = 0,
    195     SkiaGL,
    196     SkiaVulkan,
    197     NotInitialized = 128
    198 };
    199 
    200 /**
    201  * Renderthread-only singleton which manages several static rendering properties. Most of these
    202  * are driven by system properties which are queried once at initialization, and again if init()
    203  * is called.
    204  */
    205 class Properties {
    206 public:
    207     static bool load();
    208 
    209     static bool drawDeferDisabled;
    210     static bool drawReorderDisabled;
    211     static bool debugLayersUpdates;
    212     static bool debugOverdraw;
    213     static bool showDirtyRegions;
    214     // TODO: Remove after stabilization period
    215     static bool skipEmptyFrames;
    216     static bool useBufferAge;
    217     static bool enablePartialUpdates;
    218 
    219     // TODO: Move somewhere else?
    220     static constexpr float textGamma = 1.45f;
    221 
    222     static DebugLevel debugLevel;
    223     static OverdrawColorSet overdrawColorSet;
    224     static StencilClipDebug debugStencilClip;
    225 
    226     // Override the value for a subset of properties in this class
    227     static void overrideProperty(const char* name, const char* value);
    228 
    229     static float overrideLightRadius;
    230     static float overrideLightPosY;
    231     static float overrideLightPosZ;
    232     static float overrideAmbientRatio;
    233     static int overrideAmbientShadowStrength;
    234     static int overrideSpotShadowStrength;
    235 
    236     static ProfileType getProfileType();
    237     static RenderPipelineType getRenderPipelineType();
    238     static bool isSkiaEnabled();
    239 
    240     // Should be used only by test apps
    241     static bool waitForGpuCompletion;
    242     static bool forceDrawFrame;
    243 
    244     // Should only be set by automated tests to try and filter out
    245     // any overhead they add
    246     static bool filterOutTestOverhead;
    247 
    248     // Workaround a device lockup in edge cases by switching to async mode
    249     // instead of the default vsync (b/38372997). Only system_server should hit this.
    250     // Any existing RenderProxy & Surface combination will be unaffected, only things
    251     // created after changing this.
    252     static bool disableVsync;
    253 
    254     // Used for testing only to change the render pipeline.
    255 #ifdef HWUI_GLES_WRAP_ENABLED
    256     static void overrideRenderPipelineType(RenderPipelineType);
    257 #endif
    258 
    259 private:
    260     static ProfileType sProfileType;
    261     static bool sDisableProfileBars;
    262     static RenderPipelineType sRenderPipelineType;
    263 }; // class Caches
    264 
    265 }; // namespace uirenderer
    266 }; // namespace android
    267 
    268 #endif // ANDROID_HWUI_PROPERTIES_H
    269