Goals:
- support vsynced double and triple buffering
- zero buffer copies
User space execution flow:
- acquire buffer handle (can block if none is available yet)
- map buffer into virtual memory region
- draw into buffer
- unmap buffer
- queue buffer for display