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