Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 086645d8 authored by Nader Jawad's avatar Nader Jawad
Browse files

Update RenderEffectCache capability query

Updated logic to determine if RenderEffectCache
is supported to very both the vendor name as well
as the corresponding driver version.

Bug: 193145089
Test: Added test to EglManagerTests + RenderEffectCapabilityQueryTests
Change-Id: Ia0fd66c40790b94566f495d2c4128c4988d406b6
parent 78359a1d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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",
@@ -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",
+2 −1
Original line number Diff line number Diff line
@@ -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;
+6 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@

#include "Frame.h"
#include "Properties.h"
#include "RenderEffectCapabilityQuery.h"
#include "utils/Color.h"
#include "utils/StringUtils.h"

@@ -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) {
+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
+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