Merge changes I2440a161,I3e478b11 into sc-dev

* changes:
  Fix initialization of snapshot SkImage instance
  Conditionally cache RenderEffect results
This commit is contained in:
Nader Jawad
2021-10-15 18:42:22 +00:00
committed by Android (Google) Code Review
4 changed files with 32 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,33 @@ 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);
sk_sp<SkImage> snapshotImage;
auto* imageFilter = layerProperties.getImageFilter();
auto recordingContext = canvas->recordingContext();
// On some GL vendor implementations, caching the result of
// getLayerSurface->makeImageSnapshot() causes a call to
// Fence::waitForever without a corresponding signal. This would
// lead to ANRs throughout the system.
// 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) {
snapshotImage = renderNode->getLayerSurface()->makeImageSnapshot();
if (imageFilter) {
auto subset = SkIRect::MakeWH(srcBounds.width(), srcBounds.height());
snapshotImage = snapshotImage->makeWithFilter(recordingContext, imageFilter,
subset, clipBounds.roundOut(),
&srcBounds, &offset);
}
} else {
const auto snapshotResult = renderNode->updateSnapshotIfRequired( const auto snapshotResult = renderNode->updateSnapshotIfRequired(
canvas->recordingContext(), recordingContext, layerProperties.getImageFilter(), clipBounds.roundOut());
layerProperties.getImageFilter(), snapshotImage = snapshotResult->snapshot;
clipBounds.roundOut()
);
sk_sp<SkImage> snapshotImage = snapshotResult->snapshot;
srcBounds = snapshotResult->outSubset; srcBounds = snapshotResult->outSubset;
offset = snapshotResult->outOffset; 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) {