Home | History | Annotate | Download | only in hwui
      1 /*
      2  * Copyright (C) 2015 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 #include "Properties.h"
     17 
     18 #include "Debug.h"
     19 
     20 #include <cutils/compiler.h>
     21 #include <cutils/log.h>
     22 #include <cutils/properties.h>
     23 
     24 #include <algorithm>
     25 #include <cstdlib>
     26 
     27 namespace android {
     28 namespace uirenderer {
     29 
     30 bool Properties::drawDeferDisabled = false;
     31 bool Properties::drawReorderDisabled = false;
     32 bool Properties::debugLayersUpdates = false;
     33 bool Properties::debugOverdraw = false;
     34 bool Properties::showDirtyRegions = false;
     35 bool Properties::skipEmptyFrames = true;
     36 bool Properties::useBufferAge = true;
     37 bool Properties::enablePartialUpdates = true;
     38 
     39 float Properties::textGamma = DEFAULT_TEXT_GAMMA;
     40 
     41 int Properties::fboCacheSize = DEFAULT_FBO_CACHE_SIZE;
     42 int Properties::gradientCacheSize = MB(DEFAULT_GRADIENT_CACHE_SIZE);
     43 int Properties::layerPoolSize = MB(DEFAULT_LAYER_CACHE_SIZE);
     44 int Properties::patchCacheSize = KB(DEFAULT_PATCH_CACHE_SIZE);
     45 int Properties::pathCacheSize = MB(DEFAULT_PATH_CACHE_SIZE);
     46 int Properties::renderBufferCacheSize = MB(DEFAULT_RENDER_BUFFER_CACHE_SIZE);
     47 int Properties::tessellationCacheSize = MB(DEFAULT_VERTEX_CACHE_SIZE);
     48 int Properties::textDropShadowCacheSize = MB(DEFAULT_DROP_SHADOW_CACHE_SIZE);
     49 int Properties::textureCacheSize = MB(DEFAULT_TEXTURE_CACHE_SIZE);
     50 
     51 float Properties::textureCacheFlushRate = DEFAULT_TEXTURE_CACHE_FLUSH_RATE;
     52 
     53 DebugLevel Properties::debugLevel = kDebugDisabled;
     54 OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default;
     55 StencilClipDebug Properties::debugStencilClip = StencilClipDebug::Hide;
     56 
     57 float Properties::overrideLightRadius = -1.0f;
     58 float Properties::overrideLightPosY = -1.0f;
     59 float Properties::overrideLightPosZ = -1.0f;
     60 float Properties::overrideAmbientRatio = -1.0f;
     61 int Properties::overrideAmbientShadowStrength = -1;
     62 int Properties::overrideSpotShadowStrength = -1;
     63 
     64 ProfileType Properties::sProfileType = ProfileType::None;
     65 bool Properties::sDisableProfileBars = false;
     66 
     67 bool Properties::waitForGpuCompletion = false;
     68 
     69 bool Properties::filterOutTestOverhead = false;
     70 
     71 static int property_get_int(const char* key, int defaultValue) {
     72     char buf[PROPERTY_VALUE_MAX] = {'\0',};
     73 
     74     if (property_get(key, buf, "") > 0) {
     75         return atoi(buf);
     76     }
     77     return defaultValue;
     78 }
     79 
     80 static float property_get_float(const char* key, float defaultValue) {
     81     char buf[PROPERTY_VALUE_MAX] = {'\0',};
     82 
     83     if (property_get(key, buf, "") > 0) {
     84         return atof(buf);
     85     }
     86     return defaultValue;
     87 }
     88 
     89 bool Properties::load() {
     90     char property[PROPERTY_VALUE_MAX];
     91     bool prevDebugLayersUpdates = debugLayersUpdates;
     92     bool prevDebugOverdraw = debugOverdraw;
     93     StencilClipDebug prevDebugStencilClip = debugStencilClip;
     94 
     95     debugOverdraw = false;
     96     if (property_get(PROPERTY_DEBUG_OVERDRAW, property, nullptr) > 0) {
     97         INIT_LOGD("  Overdraw debug enabled: %s", property);
     98         if (!strcmp(property, "show")) {
     99             debugOverdraw = true;
    100             overdrawColorSet = OverdrawColorSet::Default;
    101         } else if (!strcmp(property, "show_deuteranomaly")) {
    102             debugOverdraw = true;
    103             overdrawColorSet = OverdrawColorSet::Deuteranomaly;
    104         }
    105     }
    106 
    107     // See Properties.h for valid values
    108     if (property_get(PROPERTY_DEBUG_STENCIL_CLIP, property, nullptr) > 0) {
    109         INIT_LOGD("  Stencil clip debug enabled: %s", property);
    110         if (!strcmp(property, "hide")) {
    111             debugStencilClip = StencilClipDebug::Hide;
    112         } else if (!strcmp(property, "highlight")) {
    113             debugStencilClip = StencilClipDebug::ShowHighlight;
    114         } else if (!strcmp(property, "region")) {
    115             debugStencilClip = StencilClipDebug::ShowRegion;
    116         }
    117     } else {
    118         debugStencilClip = StencilClipDebug::Hide;
    119     }
    120 
    121     sProfileType = ProfileType::None;
    122     if (property_get(PROPERTY_PROFILE, property, "") > 0) {
    123         if (!strcmp(property, PROPERTY_PROFILE_VISUALIZE_BARS)) {
    124             sProfileType = ProfileType::Bars;
    125         } else if (!strcmp(property, "true")) {
    126             sProfileType = ProfileType::Console;
    127         }
    128     }
    129 
    130     debugLayersUpdates = property_get_bool(PROPERTY_DEBUG_LAYERS_UPDATES, false);
    131     INIT_LOGD("  Layers updates debug enabled: %d", debugLayersUpdates);
    132 
    133     drawDeferDisabled = property_get_bool(PROPERTY_DISABLE_DRAW_DEFER, false);
    134     INIT_LOGD("  Draw defer %s", drawDeferDisabled ? "disabled" : "enabled");
    135 
    136     drawReorderDisabled = property_get_bool(PROPERTY_DISABLE_DRAW_REORDER, false);
    137     INIT_LOGD("  Draw reorder %s", drawReorderDisabled ? "disabled" : "enabled");
    138 
    139     showDirtyRegions = property_get_bool(PROPERTY_DEBUG_SHOW_DIRTY_REGIONS, false);
    140 
    141     debugLevel = (DebugLevel) property_get_int(PROPERTY_DEBUG, kDebugDisabled);
    142 
    143     skipEmptyFrames = property_get_bool(PROPERTY_SKIP_EMPTY_DAMAGE, true);
    144     useBufferAge = property_get_bool(PROPERTY_USE_BUFFER_AGE, true);
    145     enablePartialUpdates = property_get_bool(PROPERTY_ENABLE_PARTIAL_UPDATES, true);
    146 
    147     textGamma = property_get_float(PROPERTY_TEXT_GAMMA, DEFAULT_TEXT_GAMMA);
    148 
    149     fboCacheSize = property_get_int(PROPERTY_FBO_CACHE_SIZE, DEFAULT_FBO_CACHE_SIZE);
    150     gradientCacheSize = MB(property_get_float(PROPERTY_GRADIENT_CACHE_SIZE, DEFAULT_GRADIENT_CACHE_SIZE));
    151     layerPoolSize = MB(property_get_float(PROPERTY_LAYER_CACHE_SIZE, DEFAULT_LAYER_CACHE_SIZE));
    152     patchCacheSize = KB(property_get_float(PROPERTY_PATCH_CACHE_SIZE, DEFAULT_PATCH_CACHE_SIZE));
    153     pathCacheSize = MB(property_get_float(PROPERTY_PATH_CACHE_SIZE, DEFAULT_PATH_CACHE_SIZE));
    154     renderBufferCacheSize = MB(property_get_float(PROPERTY_RENDER_BUFFER_CACHE_SIZE, DEFAULT_RENDER_BUFFER_CACHE_SIZE));
    155     tessellationCacheSize = MB(property_get_float(PROPERTY_VERTEX_CACHE_SIZE, DEFAULT_VERTEX_CACHE_SIZE));
    156     textDropShadowCacheSize = MB(property_get_float(PROPERTY_DROP_SHADOW_CACHE_SIZE, DEFAULT_DROP_SHADOW_CACHE_SIZE));
    157     textureCacheSize = MB(property_get_float(PROPERTY_TEXTURE_CACHE_SIZE, DEFAULT_TEXTURE_CACHE_SIZE));
    158     textureCacheFlushRate = std::max(0.0f, std::min(1.0f,
    159             property_get_float(PROPERTY_TEXTURE_CACHE_FLUSH_RATE, DEFAULT_TEXTURE_CACHE_FLUSH_RATE)));
    160 
    161     filterOutTestOverhead = property_get_bool(PROPERTY_FILTER_TEST_OVERHEAD, false);
    162 
    163     return (prevDebugLayersUpdates != debugLayersUpdates)
    164             || (prevDebugOverdraw != debugOverdraw)
    165             || (prevDebugStencilClip != debugStencilClip);
    166 }
    167 
    168 void Properties::overrideProperty(const char* name, const char* value) {
    169     if (!strcmp(name, "disableProfileBars")) {
    170         sDisableProfileBars = !strcmp(value, "true");
    171         ALOGD("profile bars %s", sDisableProfileBars ? "disabled" : "enabled");
    172         return;
    173     } else if (!strcmp(name, "ambientRatio")) {
    174         overrideAmbientRatio = std::min(std::max(atof(value), 0.0), 10.0);
    175         ALOGD("ambientRatio = %.2f", overrideAmbientRatio);
    176         return;
    177     } else if (!strcmp(name, "lightRadius")) {
    178         overrideLightRadius = std::min(std::max(atof(value), 0.0), 3000.0);
    179         ALOGD("lightRadius = %.2f", overrideLightRadius);
    180         return;
    181     } else if (!strcmp(name, "lightPosY")) {
    182         overrideLightPosY = std::min(std::max(atof(value), 0.0), 3000.0);
    183         ALOGD("lightPos Y = %.2f", overrideLightPosY);
    184         return;
    185     } else if (!strcmp(name, "lightPosZ")) {
    186         overrideLightPosZ = std::min(std::max(atof(value), 0.0), 3000.0);
    187         ALOGD("lightPos Z = %.2f", overrideLightPosZ);
    188         return;
    189     } else if (!strcmp(name, "ambientShadowStrength")) {
    190         overrideAmbientShadowStrength = atoi(value);
    191         ALOGD("ambient shadow strength = 0x%x out of 0xff", overrideAmbientShadowStrength);
    192         return;
    193     } else if (!strcmp(name, "spotShadowStrength")) {
    194         overrideSpotShadowStrength = atoi(value);
    195         ALOGD("spot shadow strength = 0x%x out of 0xff", overrideSpotShadowStrength);
    196         return;
    197     }
    198     ALOGD("failed overriding property %s to %s", name, value);
    199 }
    200 
    201 ProfileType Properties::getProfileType() {
    202     if (CC_UNLIKELY(sDisableProfileBars && sProfileType == ProfileType::Bars))
    203         return ProfileType::None;
    204     return sProfileType;
    205 }
    206 
    207 }; // namespace uirenderer
    208 }; // namespace android
    209