diff --git a/samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs b/samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs index e1935361f6..ddfedfa981 100644 --- a/samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs +++ b/samples/ControlCatalog/Pages/TimeCriticalRenderPage.cs @@ -15,7 +15,8 @@ namespace ControlCatalog.Pages private TimeSpan _lastFps; private int _lastFpsFrame; private double _fps; - public bool HasNewFrame => true; + public bool HasRenderTimeCriticalContent => true; + public bool ThreadSafeHasNewFrame => true; Stopwatch _st = Stopwatch.StartNew(); private Typeface _typeface = Typeface.Default; diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 672d383fd0..ec3b3398bd 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -301,7 +301,7 @@ namespace Avalonia.Rendering } var hasCriticalRenderTimeVisualUpdates = Layers.Any(l => - l.LayerRoot is IRenderTimeCriticalVisual critical && critical.HasNewFrame); + l.LayerRoot is IRenderTimeCriticalVisual critical && critical.ThreadSafeHasNewFrame); if (hasCriticalRenderTimeVisualUpdates) { Layers.Update(scene, contextFactory()); @@ -372,7 +372,7 @@ namespace Avalonia.Rendering var renderTarget = renderLayer.Bitmap; var node = (VisualNode)scene.FindNode(layer.LayerRoot); var critical = node.Visual as IRenderTimeCriticalVisual; - if (criticalTimeRenderOnly && critical?.HasNewFrame != true) + if (criticalTimeRenderOnly && critical?.ThreadSafeHasNewFrame != true) continue; if (node != null) diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 05e9db89e5..7fc2a33272 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -300,7 +300,7 @@ namespace Avalonia.Rendering using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default(DrawingContext.PushedState)) using (context.PushTransformContainer()) { - if (visual is IRenderTimeCriticalVisual critical) + if (visual is IRenderTimeCriticalVisual critical && critical.HasRenderTimeCriticalContent) { critical.ThreadSafeRender(context, bounds.Size, scaling); info?.RenderTimeCriticalVisuals.Add(critical); @@ -337,7 +337,7 @@ namespace Avalonia.Rendering } } - public bool NeedsUpdate => _lastRenderPassInfo?.RenderTimeCriticalVisuals.Any(v => v.HasNewFrame) == true; + public bool NeedsUpdate => _lastRenderPassInfo?.RenderTimeCriticalVisuals.Any(v => v.ThreadSafeHasNewFrame) == true; public void Update(TimeSpan time) => _root.InvalidateVisual(); public void Render() { diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs index 2b241729fc..790b898a4a 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs @@ -368,7 +368,7 @@ namespace Avalonia.Rendering.SceneGraph private static bool ShouldStartLayer(IVisual visual) { - if (visual is IRenderTimeCriticalVisual) + if (visual is IRenderTimeCriticalVisual critical && critical.HasRenderTimeCriticalContent) return true; if (visual.WantsLayer) return true; diff --git a/src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs b/src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs index 9d899cbdec..b8be59bcc9 100644 --- a/src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs +++ b/src/Avalonia.Visuals/VisualTree/IRenderTimeCriticalVisual.cs @@ -4,7 +4,8 @@ namespace Avalonia.VisualTree { public interface IRenderTimeCriticalVisual { - bool HasNewFrame { get; } + bool HasRenderTimeCriticalContent { get; } + bool ThreadSafeHasNewFrame { get; } void ThreadSafeRender(DrawingContext context, Size logicalSize, double scaling); } }