Conditionally cache RenderEffect results am: 10f05d8f00

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15873776

Change-Id: Iecd2f6e453a4e0cf9e56ad9b4c24126ae23ed39a
This commit is contained in:
Nader Jawad
2021-10-15 18:56:21 +00:00
committed by Automerger Merge Worker
4 changed files with 33 additions and 8 deletions

View File

@@ -50,6 +50,7 @@ bool Properties::showDirtyRegions = false;
bool Properties::skipEmptyFrames = true; bool Properties::skipEmptyFrames = true;
bool Properties::useBufferAge = true; bool Properties::useBufferAge = true;
bool Properties::enablePartialUpdates = true; bool Properties::enablePartialUpdates = true;
bool Properties::enableRenderEffectCache = false;
DebugLevel Properties::debugLevel = kDebugDisabled; DebugLevel Properties::debugLevel = kDebugDisabled;
OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default; OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default;

View File

@@ -224,6 +224,7 @@ public:
static bool skipEmptyFrames; static bool skipEmptyFrames;
static bool useBufferAge; static bool useBufferAge;
static bool enablePartialUpdates; static bool enablePartialUpdates;
static bool enableRenderEffectCache;
// TODO: Move somewhere else? // TODO: Move somewhere else?
static constexpr float textGamma = 1.45f; static constexpr float textGamma = 1.45f;

View File

@@ -231,14 +231,34 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const {
SkASSERT(properties.effectiveLayerType() == LayerType::RenderLayer); SkASSERT(properties.effectiveLayerType() == LayerType::RenderLayer);
SkPaint paint; SkPaint paint;
layerNeedsPaint(layerProperties, alphaMultiplier, &paint); layerNeedsPaint(layerProperties, alphaMultiplier, &paint);
const auto snapshotResult = renderNode->updateSnapshotIfRequired( sk_sp<SkImage> snapshotImage;
canvas->recordingContext(), auto* imageFilter = layerProperties.getImageFilter();
layerProperties.getImageFilter(), auto recordingContext = canvas->recordingContext();
clipBounds.roundOut() // On some GL vendor implementations, caching the result of
); // getLayerSurface->makeImageSnapshot() causes a call to
sk_sp<SkImage> snapshotImage = snapshotResult->snapshot; // Fence::waitForever without a corresponding signal. This would
srcBounds = snapshotResult->outSubset; // lead to ANRs throughout the system.
offset = snapshotResult->outOffset; // Instead only cache the SkImage created with the SkImageFilter
// for supported devices. Otherwise just create a new SkImage with
// the corresponding SkImageFilter each time.
// See b/193145089 and b/197263715
if (!Properties::enableRenderEffectCache) {
if (imageFilter) {
auto subset = SkIRect::MakeWH(srcBounds.width(), srcBounds.height());
snapshotImage = snapshotImage->makeWithFilter(recordingContext, imageFilter,
subset, clipBounds.roundOut(),
&srcBounds, &offset);
} else {
snapshotImage = renderNode->getLayerSurface()->makeImageSnapshot();
}
} else {
const auto snapshotResult = renderNode->updateSnapshotIfRequired(
recordingContext, layerProperties.getImageFilter(), clipBounds.roundOut());
snapshotImage = snapshotResult->snapshot;
srcBounds = snapshotResult->outSubset;
offset = snapshotResult->outOffset;
}
const auto dstBounds = SkIRect::MakeXYWH(offset.x(), const auto dstBounds = SkIRect::MakeXYWH(offset.x(),
offset.y(), offset.y(),
srcBounds.width(), srcBounds.width(),

View File

@@ -146,6 +146,9 @@ void EglManager::initialize() {
LOG_ALWAYS_FATAL("Unsupported wide color space."); LOG_ALWAYS_FATAL("Unsupported wide color space.");
} }
mHasWideColorGamutSupport = EglExtensions.glColorSpace && hasWideColorSpaceExtension; mHasWideColorGamutSupport = EglExtensions.glColorSpace && hasWideColorSpaceExtension;
auto* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
Properties::enableRenderEffectCache = (strcmp(vendor, "Qualcomm") != 0);
} }
EGLConfig EglManager::load8BitsConfig(EGLDisplay display, EglManager::SwapBehavior swapBehavior) { EGLConfig EglManager::load8BitsConfig(EGLDisplay display, EglManager::SwapBehavior swapBehavior) {