Files
sx/examples
agra 2ff24e29cc platform: snap keyboard inset (lockstep deferred to Metal renderer)
Walked back the manual-interpolation + CABasicAnimation+presentationLayer
attempts at lockstep keyboard inset. Both leave a visible frame of lag
because the lockstep problem is structural, not implementation-detail:

  - GL renderbuffer content is baked at presentRenderbuffer() time.
  - The CoreAnimation compositor can interpolate the *position* of a
    CALayer per-vsync but cannot reach into our renderbuffer's pixels.
  - The GPU pipeline (CADisplayLink → command build → present →
    compositor → display) is 2-3 frames deep on iOS GLES, so even
    `targetTimestamp`-based prediction is one to two frames short.

The architectural escape that doesn't move the GL view (rejected for
edge cases) is to give CoreAnimation a renderable handle it can sync
on. That means **Metal**:

  - CAMetalLayer + MTLDrawable.presentAtTime(_:) caps the pipeline at
    exactly one frame.
  - With targetTimestamp prediction + curve-accurate keyboard math,
    our drawable lands at the same vsync as UIKit's keyboard.
  - Renderer modernization (Metal/Vulkan/WebGPU per platform) was on
    the roadmap anyway; lockstep is the forcing function.

This commit keeps the keyboard observer + show/hide_keyboard wiring
intact and SNAPS keyboard_height when the observer fires. Behavior:
the chess board doesn't shift during the keyboard animation; it shifts
in one step when the observer fires. Less smooth than the broken
attempt but honest.

Plan for the Metal port (next):

  - library/modules/gpu/{metal,vulkan,webgpu}.sx + a `GPU` protocol
    analogous to Platform.
  - Port modules/ui/renderer.sx shaders from GLSL to MSL.
  - SxGLView becomes SxMetalView; CAEAGLLayer becomes CAMetalLayer.
  - Lockstep falls out of MTLDrawable.presentAtTime(targetTimestamp).
2026-05-17 17:46:17 +03:00
..
2026-03-06 10:46:28 +02:00
2026-02-09 18:07:41 +02:00
2026-02-09 18:07:41 +02:00
2026-02-14 13:17:22 +02:00
2026-02-09 18:07:41 +02:00
2026-02-09 18:07:41 +02:00
2026-02-09 18:07:41 +02:00
2026-02-09 18:07:41 +02:00
2026-02-09 18:07:41 +02:00
2026-02-24 15:10:02 +02:00
2026-03-03 09:35:50 +02:00
2026-02-24 17:37:52 +02:00
2026-02-24 15:10:02 +02:00
2026-02-11 14:22:25 +02:00
2026-02-09 18:07:41 +02:00
2026-02-24 17:37:52 +02:00
2026-02-14 13:17:22 +02:00
2026-02-09 18:07:41 +02:00
...
2026-02-11 13:03:04 +02:00
2026-02-17 16:57:12 +02:00
2026-02-17 16:57:12 +02:00
2026-02-14 14:52:39 +02:00
2026-02-24 17:37:52 +02:00
2026-02-16 01:13:34 +02:00
2026-02-24 06:20:38 +02:00
2026-02-11 01:05:21 +02:00
2026-02-22 22:16:30 +02:00
2026-02-11 20:41:43 +02:00
ir
2026-02-26 02:25:02 +02:00
2026-02-12 12:27:35 +02:00
2026-02-14 13:17:22 +02:00
2026-02-14 14:52:39 +02:00
2026-02-24 13:37:27 +02:00
2026-02-22 22:16:30 +02:00
2026-02-22 17:24:04 +02:00
2026-02-22 17:24:04 +02:00
2026-02-22 17:24:04 +02:00
2026-02-24 17:37:52 +02:00
2026-02-25 15:51:22 +02:00
sm
2026-03-02 21:00:55 +02:00
2026-03-04 17:12:56 +02:00
2026-03-04 17:12:56 +02:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-05-17 13:19:08 +03:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00
2026-03-05 16:20:36 +02:00