Fix aggressive caching of RenderNode snapshot
Updated ImageFilter caching logic to update the snapshot whenever the surface generation ID has changed. Fixes: 199242895 Test: Added test to RenderNodeTests Change-Id: I803dce35ba15a098f14dc02a479abf8b2fbae51f
This commit is contained in:
@@ -341,6 +341,7 @@ std::optional<RenderNode::SnapshotResult> RenderNode::updateSnapshotIfRequired(
|
||||
sk_sp<SkImage> snapshot = layerSurface->makeImageSnapshot();
|
||||
const auto subset = SkIRect::MakeWH(properties().getWidth(),
|
||||
properties().getHeight());
|
||||
uint32_t layerSurfaceGenerationId = layerSurface->generationID();
|
||||
// If we don't have an ImageFilter just return the snapshot
|
||||
if (imageFilter == nullptr) {
|
||||
mSnapshotResult.snapshot = snapshot;
|
||||
@@ -348,9 +349,10 @@ std::optional<RenderNode::SnapshotResult> RenderNode::updateSnapshotIfRequired(
|
||||
mSnapshotResult.outOffset = SkIPoint::Make(0.0f, 0.0f);
|
||||
mImageFilterClipBounds = clipBounds;
|
||||
mTargetImageFilter = nullptr;
|
||||
} else if (mSnapshotResult.snapshot == nullptr ||
|
||||
imageFilter != mTargetImageFilter.get() ||
|
||||
mImageFilterClipBounds != clipBounds) {
|
||||
mTargetImageFilterLayerSurfaceGenerationId = 0;
|
||||
} else if (mSnapshotResult.snapshot == nullptr || imageFilter != mTargetImageFilter.get() ||
|
||||
mImageFilterClipBounds != clipBounds ||
|
||||
mTargetImageFilterLayerSurfaceGenerationId != layerSurfaceGenerationId) {
|
||||
// Otherwise create a new snapshot with the given filter and snapshot
|
||||
mSnapshotResult.snapshot =
|
||||
snapshot->makeWithFilter(context,
|
||||
@@ -361,6 +363,7 @@ std::optional<RenderNode::SnapshotResult> RenderNode::updateSnapshotIfRequired(
|
||||
&mSnapshotResult.outOffset);
|
||||
mTargetImageFilter = sk_ref_sp(imageFilter);
|
||||
mImageFilterClipBounds = clipBounds;
|
||||
mTargetImageFilterLayerSurfaceGenerationId = layerSurfaceGenerationId;
|
||||
}
|
||||
|
||||
return mSnapshotResult;
|
||||
|
||||
@@ -396,6 +396,7 @@ private:
|
||||
* SkImageFilter used to create the mSnapshotResult
|
||||
*/
|
||||
sk_sp<SkImageFilter> mTargetImageFilter;
|
||||
uint32_t mTargetImageFilterLayerSurfaceGenerationId = 0;
|
||||
|
||||
/**
|
||||
* Clip bounds used to create the mSnapshotResult
|
||||
|
||||
Reference in New Issue
Block a user