Thanks guys! That's really helpful. RT-36541 filed. PulseLogger seems useful, if only I understood its output :) I set the blur animation to autocycle and pulselogger produced something like the text below. So apparently I have a lot of slow background paths - what does that mean? It also spends most of its time waiting for previous rendering, suggesting indeed that the GPU rendering can't keep up with what the javafx thread is producing.
My scene is essentially like this: I have a large ScrollPane, with a tiled background image. It contains a dashed rounded rectangle. There is a bit more UI at the top but nothing complicated: a few labels and an imageview. All this is inside a StackPane so that I can blur out the main UI and put popups over the top of it. So there's a blur of a large pixelwise but not very complex scene graph, with a handful of non-blurred set of nodes on top. PULSE: 90 [145ms:73ms] T14 (0 +1ms): CSS Pass T14 (1 +0ms): Layout Pass T14 (1 +0ms): Waiting for previous rendering T14 (1 +0ms): Copy state to render graph T12 (2 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (2 +60ms): Painted T12 (62 +10ms): Presentable.present T12 (73 +0ms): Finished Presenting Painter Counters: CacheFilter rebuilding: 1 Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 12 Nodes rendered: 46 Nodes visited during render: 48 Rendering region background image to cache: 5 PULSE: 91 [5ms:87ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +68ms): Waiting for previous rendering T14 (68 +1ms): Copy state to render graph T12 (69 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (69 +17ms): Painted T12 (86 +1ms): Presentable.present T12 (87 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 92 [85ms:46ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +4ms): Waiting for previous rendering T14 (4 +0ms): Copy state to render graph T12 (5 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (5 +34ms): Painted T12 (39 +6ms): Presentable.present T12 (46 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 93 [19ms:51ms] T14 (1 +0ms): CSS Pass T14 (1 +0ms): Layout Pass T14 (1 +26ms): Waiting for previous rendering T14 (27 +0ms): Copy state to render graph T12 (28 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (28 +22ms): Painted T12 (51 +0ms): Presentable.present T12 (51 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 94 [31ms:35ms] T14 (1 +0ms): CSS Pass T14 (1 +0ms): Layout Pass T14 (1 +20ms): Waiting for previous rendering T14 (21 +0ms): Copy state to render graph T12 (22 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (22 +12ms): Painted T12 (34 +1ms): Presentable.present T12 (35 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 95 [32ms:42ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (1 +2ms): Waiting for previous rendering T14 (3 +0ms): Copy state to render graph T12 (4 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (4 +21ms): Painted T12 (26 +16ms): Presentable.present T12 (42 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 96 [18ms:42ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +25ms): Waiting for previous rendering T14 (25 +0ms): Copy state to render graph T12 (26 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (26 +15ms): Painted T12 (41 +0ms): Presentable.present T12 (42 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 97 [35ms:27ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +7ms): Waiting for previous rendering T14 (7 +0ms): Copy state to render graph T12 (8 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (8 +15ms): Painted T12 (23 +4ms): Presentable.present T12 (27 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 98 [15ms:30ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (1 +12ms): Waiting for previous rendering T14 (13 +0ms): Copy state to render graph T12 (14 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (14 +15ms): Painted T12 (29 +1ms): Presentable.present T12 (30 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 99 [17ms:36ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +13ms): Waiting for previous rendering T14 (13 +0ms): Copy state to render graph T12 (13 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (14 +21ms): Painted T12 (35 +1ms): Presentable.present T12 (36 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42 PULSE: 100 [16ms:39ms] T14 (0 +0ms): CSS Pass T14 (0 +0ms): Layout Pass T14 (0 +20ms): Waiting for previous rendering T14 (20 +0ms): Copy state to render graph T12 (21 +0ms): Dirty Opts Computed T12 : Slow background path for null T12 : Slow background path for null T12 : Slow background path for null T12 (21 +17ms): Painted T12 (38 +1ms): Presentable.present T12 (39 +0ms): Finished Presenting Painter Counters: Cached region background image used: 7 Cached region shape image used: 4 NGRegion renderBackgrounds slow path: 3 Nodes rendered: 40 Nodes visited during render: 42