AvaloniaUI / Avalonia

Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The most popular .NET UI client technology
https://avaloniaui.net
MIT License
25.26k stars 2.19k forks source link

"Visual was invalidated during a render pass" while opening DevTools without Compositor #9275

Closed SKProCH closed 1 year ago

SKProCH commented 1 year ago

Describe the bug When we create an Avalonia 11.0.0-preview2, and don't use compositor, when DevTools opened at Visuals page InvalidOperationException was thrown.

To Reproduce Steps to reproduce the behavior:

  1. Create Avalonia app with 11.0.0-preview2 version
  2. Add
     .With(new Win32PlatformOptions
    {
        UseCompositor = false
    })

    to BuildAvaloniaApp

  3. Attach dev tools
  4. Launch app, invoke dev tools. switch to Visuals page
  5. See exception

Expected behavior No exception

Desktop (please complete the following information):

Additional context Exception details:

System.InvalidOperationException: Visual was invalidated during a render pass
   at Avalonia.Rendering.DirtyVisuals.Add(IVisual visual) in /_/src/Avalonia.Base/Rendering/DirtyVisuals.cs:line 35
   at Avalonia.Rendering.DeferredRenderer.AddDirty(IVisual visual) in /_/src/Avalonia.Base/Rendering/DeferredRenderer.cs:line 122
   at Avalonia.Visual.InvalidateVisual() in /_/src/Avalonia.Base/Visual.cs:line 330
   at Avalonia.Layout.Layoutable.InvalidateArrange() in /_/src/Avalonia.Base/Layout/Layoutable.cs:line 445
   at Avalonia.Controls.Panel.AffectsParentArrangeInvalidate[TPanel](AvaloniaPropertyChangedEventArgs e) in /_/src/Avalonia.Controls/Panel.cs:line 165
   at System.Reactive.AnonymousObserver`1.OnNextCore(T value) in /_/Rx.NET/Source/src/System.Reactive/AnonymousObserver.cs:line 67
   at System.Reactive.ObserverBase`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/ObserverBase.cs:line 34
   at System.Reactive.Subjects.Subject`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/Subjects/Subject.cs:line 147
   at Avalonia.AvaloniaProperty`1.NotifyChanged(AvaloniaPropertyChangedEventArgs`1 e) in /_/src/Avalonia.Base/AvaloniaProperty`1.cs:line 65
   at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 779
   at Avalonia.AvaloniaObject.ValueChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 551
   at Avalonia.ValueStore.NotifyValueChanged[T](AvaloniaProperty`1 property, Optional`1 oldValue, BindingValue`1 newValue, BindingPriority priority) in /_/src/Avalonia.Base/ValueStore.cs:line 354
   at Avalonia.ValueStore.SetValue[T](StyledPropertyBase`1 property, T value, BindingPriority priority) in /_/src/Avalonia.Base/ValueStore.cs:line 120
   at Avalonia.AvaloniaObject.SetValue[T](StyledPropertyBase`1 property, T value, BindingPriority priority) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 368
   at Avalonia.Controls.Canvas.SetLeft(AvaloniaObject element, Double value) in /_/src/Avalonia.Controls/Canvas.cs:line 69
   at Avalonia.Diagnostics.Views.LayoutExplorerView.<UpdateSizeGuidelines>g__SetPosition|12_2(Rectangle rect, Point start) in /_/src/Avalonia.Diagnostics/Diagnostics/Views/LayoutExplorerView.axaml.cs:line 110
   at Avalonia.Diagnostics.Views.LayoutExplorerView.<UpdateSizeGuidelines>g__UpdateGuidelines|12_0(Visual area) in /_/src/Avalonia.Diagnostics/Diagnostics/Views/LayoutExplorerView.axaml.cs:line 71
   at Avalonia.Diagnostics.Views.LayoutExplorerView.UpdateSizeGuidelines(AvaloniaPropertyChangedEventArgs e) in /_/src/Avalonia.Diagnostics/Diagnostics/Views/LayoutExplorerView.axaml.cs:line 116
   at System.Reactive.AnonymousObserver`1.OnNextCore(T value) in /_/Rx.NET/Source/src/System.Reactive/AnonymousObserver.cs:line 67
   at System.Reactive.ObserverBase`1.OnNext(T value) in /_/Rx.NET/Source/src/System.Reactive/ObserverBase.cs:line 34
   at Avalonia.Reactive.LightweightObservableBase`1.PublishNext(T value) in /_/src/Avalonia.Base/Reactive/LightweightObservableBase.cs:line 118
   at Avalonia.Reactive.AvaloniaPropertyChangedObservable.PropertyChanged(Object sender, AvaloniaPropertyChangedEventArgs e) in /_/src/Avalonia.Base/Reactive/AvaloniaPropertyChangedObservable.cs:line 42
   at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaPropertyChangedEventArgs`1 change) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 780
   at Avalonia.AvaloniaObject.RaisePropertyChanged[T](AvaloniaProperty`1 property, Optional`1 oldValue, BindingValue`1 newValue, BindingPriority priority) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 691
   at Avalonia.AvaloniaObject.SetAndRaise[T](AvaloniaProperty`1 property, T& field, T value) in /_/src/Avalonia.Base/AvaloniaObject.cs:line 721
   at Avalonia.Visual.Avalonia.VisualTree.IVisual.set_TransformedBounds(Nullable`1 value) in /_/src/Avalonia.Base/Visual.cs:line 321
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 262
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 306
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(DrawingContext context, Scene scene, VisualNode node, Rect clip, Boolean forceRecurse) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 273
   at Avalonia.Rendering.SceneGraph.SceneBuilder.Update(Scene scene, IVisual visual) in /_/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs:line 91
   at Avalonia.Rendering.DeferredRenderer.UpdateScene() in /_/src/Avalonia.Base/Rendering/DeferredRenderer.cs:line 661
   at Avalonia.Rendering.DeferredRenderer.UpdateSceneIfNeeded() in /_/src/Avalonia.Base/Rendering/DeferredRenderer.cs:line 624
   at Avalonia.Threading.JobRunner.Job.Avalonia.Threading.JobRunner.IJob.Run() in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 193
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in /_/src/Avalonia.Base/Threading/JobRunner.cs:line 38
   at Avalonia.Win32.Win32Platform.WndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) in /_/src/Windows/Avalonia.Win32/Win32Platform.cs:line 267
   at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG& lpmsg)
   at Avalonia.Win32.Win32Platform.RunLoop(CancellationToken cancellationToken) in /_/src/Windows/Avalonia.Win32/Win32Platform.cs:line 214
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Base/Threading/Dispatcher.cs:line 61
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(String[] args) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 120
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 209
   at AvaloniaCrossPlatformApplication1.Desktop.Program.Main(String[] args) in C:\Users\SKProCH\RiderProjects\AvaloniaCrossPlatformApplication1\AvaloniaCrossPlatformApplication1\AvaloniaCrossPlatformApplication1.Desktop\Program.cs:line 10
kekekeks commented 1 year ago

When diagnosing renderer-related bugs, a check was added to prevent visuals from being invalidated while renderer is actively building a scene (since it's something that shouldn't happen): https://github.com/AvaloniaUI/Avalonia/blob/ce98bffe66e92b3b68205036f0fe4dfeb2b138e8/src/Avalonia.Base/Rendering/DirtyVisuals.cs#L33-L36

It seems that devtools are doing exactly that

@grokys @Gillibald