Loading libs/hwui/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -570,6 +570,7 @@ cc_defaults { "renderthread/DrawFrameTask.cpp", "renderthread/EglManager.cpp", "renderthread/ReliableSurface.cpp", "renderthread/RenderEffectCapabilityQuery.cpp", "renderthread/VulkanManager.cpp", "renderthread/VulkanSurface.cpp", "renderthread/RenderProxy.cpp", Loading Loading @@ -696,6 +697,7 @@ cc_test { "tests/unit/MatrixTests.cpp", "tests/unit/OpBufferTests.cpp", "tests/unit/PathInterpolatorTests.cpp", "tests/unit/RenderEffectCapabilityQueryTests.cpp", "tests/unit/RenderNodeDrawableTests.cpp", "tests/unit/RenderNodeTests.cpp", "tests/unit/RenderPropertiesTests.cpp", Loading libs/hwui/Properties.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -50,7 +50,8 @@ bool Properties::showDirtyRegions = false; bool Properties::skipEmptyFrames = true; bool Properties::useBufferAge = true; bool Properties::enablePartialUpdates = true; bool Properties::enableRenderEffectCache = false; // Default true unless otherwise specified in RenderThread Configuration bool Properties::enableRenderEffectCache = true; DebugLevel Properties::debugLevel = kDebugDisabled; OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default; Loading libs/hwui/renderthread/EglManager.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "Frame.h" #include "Properties.h" #include "RenderEffectCapabilityQuery.h" #include "utils/Color.h" #include "utils/StringUtils.h" Loading Loading @@ -148,7 +149,11 @@ void EglManager::initialize() { mHasWideColorGamutSupport = EglExtensions.glColorSpace && hasWideColorSpaceExtension; auto* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); Properties::enableRenderEffectCache = (strcmp(vendor, "Qualcomm") != 0); auto* version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); Properties::enableRenderEffectCache = supportsRenderEffectCache( vendor, version); ALOGV("RenderEffectCache supported %d on driver version %s", Properties::enableRenderEffectCache, version); } EGLConfig EglManager::load8BitsConfig(EGLDisplay display, EglManager::SwapBehavior swapBehavior) { Loading libs/hwui/renderthread/RenderEffectCapabilityQuery.cpp 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <stdio.h> #include <string.h> #include <utils/Log.h> bool supportsRenderEffectCache(const char* vendor, const char* version) { if (strcmp(vendor, "Qualcomm") != 0) { return true; } int major; int minor; int driverMajor; int driverMinor; int n = sscanf(version,"OpenGL ES %d.%d V@%d.%d", &major, &minor, &driverMajor, &driverMinor); // Ensure we have parsed the vendor string properly and we have either // a newer major driver version, or the minor version is rev'ed // Based on b/198227600#comment5 it appears that the corresponding fix // is in driver version 571.0 return n == 4 && driverMajor >= 571; } No newline at end of file libs/hwui/renderthread/RenderEffectCapabilityQuery.h 0 → 100644 +35 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once /** * Verify if the provided vendor and version supports RenderEffect caching * behavior. * * Certain Open GL Driver implementations run into blocking scenarios * with Fence::waitForever without a corresponding signal to unblock * This happens during attempts to cache SkImage instances across frames * especially in circumstances using RenderEffect/SkImageFilter internally. * So detect the corresponding GL Vendor and driver version to determine if * caching SkImage instances across frames is supported. * See b/197263715 & b/193145089 * @param vendor Vendor of the GL driver * @param version Version of the GL driver from the given vendor * @return True if a RenderEffect result can be cached across frames, * false otherwise */ bool supportsRenderEffectCache(const char* vendor, const char* version); Loading
libs/hwui/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -570,6 +570,7 @@ cc_defaults { "renderthread/DrawFrameTask.cpp", "renderthread/EglManager.cpp", "renderthread/ReliableSurface.cpp", "renderthread/RenderEffectCapabilityQuery.cpp", "renderthread/VulkanManager.cpp", "renderthread/VulkanSurface.cpp", "renderthread/RenderProxy.cpp", Loading Loading @@ -696,6 +697,7 @@ cc_test { "tests/unit/MatrixTests.cpp", "tests/unit/OpBufferTests.cpp", "tests/unit/PathInterpolatorTests.cpp", "tests/unit/RenderEffectCapabilityQueryTests.cpp", "tests/unit/RenderNodeDrawableTests.cpp", "tests/unit/RenderNodeTests.cpp", "tests/unit/RenderPropertiesTests.cpp", Loading
libs/hwui/Properties.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -50,7 +50,8 @@ bool Properties::showDirtyRegions = false; bool Properties::skipEmptyFrames = true; bool Properties::useBufferAge = true; bool Properties::enablePartialUpdates = true; bool Properties::enableRenderEffectCache = false; // Default true unless otherwise specified in RenderThread Configuration bool Properties::enableRenderEffectCache = true; DebugLevel Properties::debugLevel = kDebugDisabled; OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default; Loading
libs/hwui/renderthread/EglManager.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "Frame.h" #include "Properties.h" #include "RenderEffectCapabilityQuery.h" #include "utils/Color.h" #include "utils/StringUtils.h" Loading Loading @@ -148,7 +149,11 @@ void EglManager::initialize() { mHasWideColorGamutSupport = EglExtensions.glColorSpace && hasWideColorSpaceExtension; auto* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); Properties::enableRenderEffectCache = (strcmp(vendor, "Qualcomm") != 0); auto* version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); Properties::enableRenderEffectCache = supportsRenderEffectCache( vendor, version); ALOGV("RenderEffectCache supported %d on driver version %s", Properties::enableRenderEffectCache, version); } EGLConfig EglManager::load8BitsConfig(EGLDisplay display, EglManager::SwapBehavior swapBehavior) { Loading
libs/hwui/renderthread/RenderEffectCapabilityQuery.cpp 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <stdio.h> #include <string.h> #include <utils/Log.h> bool supportsRenderEffectCache(const char* vendor, const char* version) { if (strcmp(vendor, "Qualcomm") != 0) { return true; } int major; int minor; int driverMajor; int driverMinor; int n = sscanf(version,"OpenGL ES %d.%d V@%d.%d", &major, &minor, &driverMajor, &driverMinor); // Ensure we have parsed the vendor string properly and we have either // a newer major driver version, or the minor version is rev'ed // Based on b/198227600#comment5 it appears that the corresponding fix // is in driver version 571.0 return n == 4 && driverMajor >= 571; } No newline at end of file
libs/hwui/renderthread/RenderEffectCapabilityQuery.h 0 → 100644 +35 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once /** * Verify if the provided vendor and version supports RenderEffect caching * behavior. * * Certain Open GL Driver implementations run into blocking scenarios * with Fence::waitForever without a corresponding signal to unblock * This happens during attempts to cache SkImage instances across frames * especially in circumstances using RenderEffect/SkImageFilter internally. * So detect the corresponding GL Vendor and driver version to determine if * caching SkImage instances across frames is supported. * See b/197263715 & b/193145089 * @param vendor Vendor of the GL driver * @param version Version of the GL driver from the given vendor * @return True if a RenderEffect result can be cached across frames, * false otherwise */ bool supportsRenderEffectCache(const char* vendor, const char* version);