( events: CompositorEventController, effectConfig: RuntimeEffectConfig, outputName: string, snapshots: WaylandLayerSnapshot[], )
| 2429 | if (uniformPatches !== null && uniformPatches.length > 0) { |
| 2430 | return { |
| 2431 | treeUpdate: "uniforms", |
| 2432 | uniformPatches, |
| 2433 | transform: entry.cache.lastTransform, |
| 2434 | managedWindow: entry.cache.lastManagedWindow, |
| 2435 | windowEffects: evaluateWindowEffects(effectConfig, windowId, entry), |
| 2436 | dirtyNodeIds: Array.from( |
| 2437 | new Set(uniformPatches.map((patch) => patch.nodeId)), |
| 2438 | ), |
| 2439 | nextPollInMs: hasWindowAnimations(windowId) ? 0 : peekNextPollDelay(), |
| 2440 | }; |
| 2441 | } |
| 2442 | } |
| 2443 | const reevaluateNodeIds = |
| 2444 | dirtyUniformBindingKeys.length > 0 |
| 2445 | ? Array.from( |
| 2446 | new Set([ |
| 2447 | ...dirtyNodeIds, |
| 2448 | ...entry.cache.shaderUniformBindings |
| 2449 | .filter((binding) => |
| 2450 | dirtyUniformBindingKeys.includes(binding.key) |
| 2451 | ) |
| 2452 | .map((binding) => binding.nodeId), |
| 2453 | ]), |
| 2454 | ) |
| 2455 | : dirtyNodeIds; |
| 2456 | // A full window dirty can coincide with node-scoped dirty marks from |
| 2457 | // derived signals. Passing those node ids to reevaluate() selects the |
| 2458 | // serialized-tree patch path, which deliberately does not recreate the |
| 2459 | // composition root or its ManagedWindow props. State transitions such as |
| 2460 | // unminimize would then leave the old idle/opacity static state behind and |
| 2461 | // disappear again once the visual animation completed. |
| 2462 | const reevaluated = forceFullReevaluation |
| 2463 | ? entry.cache.reevaluate() |
| 2464 | : entry.cache.reevaluate(reevaluateNodeIds); |
no test coverage detected