Implement compositing layers for transforms, opacity, will-change
Add a layer tree that renders subtrees to intermediate Metal textures for
correct group compositing of opacity, will-change, fixed-position, and
scrollable elements.
CSS properties:
- Add `opacity` (0.0-1.0, clamped) to ComputedStyle, LayoutBox
- Add `will-change` (transform, opacity) to ComputedStyle, LayoutBox
- Parse both properties from CSS declarations
Display list:
- Add PushLayer/PopLayer paint commands wrapping elements that need
compositing isolation
- Detect layer-needing elements: opacity < 1.0, will-change hints,
position: fixed, scrollable overflow containers
Metal GPU renderer:
- Render-to-texture for layers with opacity < 1.0: create offscreen
BGRA render target, render layer contents, composite back with opacity
- Layers with opacity=1.0 are pass-through (no intermediate texture)
- Handle nested layers via a layer state stack
- Coordinate offset tracking for layer-local rendering
- Graceful fallback if render target creation fails
Platform (Metal FFI):
- Device::new_render_target_texture() with ShaderRead | RenderTarget usage
- make_load_pass_descriptor() for resuming rendering to existing targets
Software renderer:
- Buffer-swap compositing for opacity layers
- Alpha-blend layer buffer back with group opacity on PopLayer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>