Unified memory is still a contract
On the M4 Pro, CPU and GPU can use unified physical memory, but their access still needs a schedule. A shared MTLBuffer gives the CPU a contents pointer and the GPU a resource binding. It does not make an overlapping CPU write and GPU read safe. If the previous frame is consuming a camera record, write the next frame into a different available range or wait for the completion that returns ownership of that range.
Private storage is intended for GPU access and does not provide a CPU contents pointer. Upload through a staging resource and a blit when that fits the workload. Shared storage is convenient for frequently updated small data and readback. Managed storage belongs to a different synchronization model on supported macOS devices; do not paste its didModifyRange/synchronize recipe onto the Apple-silicon shared path without understanding the target. Query and document the selected mode.
Use a byte budget before newBuffer. Validate count, element stride, multiplication, and the device’s maximum buffer length. A device limit is not a sensible application budget by itself. A scene can be technically allocatable and still overwhelm system memory shared with other applications. Keep resource creation failure visible and leave the last complete scene intact.
