Ferrum development journal · Part 10 of 19
Working on Presentation and Controller Input
Presentation timing and controller discovery needed tests outside a simple offscreen run. The Mac has its own window and input rules to account for.
Once a program can draw, the next thing you notice is whether its window keeps updating and whether your input reaches it. Those are user-facing behaviors, but they depend on the details of how the translated guest interacts with the Mac's display and input systems.
The presentation work in this period explored a display-linked update loop and a layer-backed view. The goal was to keep the on-screen path moving without changing the meaning of the guest's drawing operations. Offscreen comparisons were useful for catching regressions, but an offscreen test can't tell us everything about a window managed by macOS.
Controllers had a similar split between detection and actual use. Finding a device in an enumeration doesn't prove that button presses will arrive during a game session. The September 12 change enabled GameController background-event monitoring, which the driver had not been setting. The work also added a detector that looked across multiple input layers so a failure could be attributed more precisely.
For a player, the desired behavior is simple: connect a controller, focus the application as needed, and have the controls work. During development, we still need to distinguish the device being present, the input events being delivered, and the application responding. Rumble, different connection types, focus changes, and a physical-controller matrix remain their own checks.
The same caution applies to presentation. A counter can say frames are being presented while the contents of the window have stopped changing. The following development chapter uncovered exactly that kind of problem, and corrected an earlier explanation for an apparent freeze.
So I wouldn't turn this period into a claim of finished controller support or guaranteed smooth presentation. It added mechanisms and better diagnostics for behaviors that have to be tested on screen and with real devices, as part of an actual application session.
Ferrum development journal
View the journalLive19 entries so far·Updated New (19 entries updated in the last 14 days)
- Part 1Bringing FEX to macOS: The First Windows Program
- Part 2From Return Values to Pixels and Sound
- Part 3Building More of the Windows Runtime
- Part 4Following a Game Through Its Opening Video
- Part 5Installers, Saves, Fonts, and the Parts Around the Game
- Part 6Game Progress and Measuring the Right Thing
- Part 7Building the 32-Bit Graphics Path
- Part 8Making Memory, Files, and Graphics State Agree
- Part 9DirectX 12, Shader Caches, and the Steam Startup Work
- Part 10Working on Presentation and Controller Input
- Part 11A Launcher and a Freeze That Wasn't the Presenter
- Part 12Portal Reaches a Command Stream, With the Frame Still Ahead
- Part 13Correcting the Ferrum Progress Report
- Part 14Recovering the Project and Resuming Real Tests
- Part 15Making Memory Protection and Lifetime Tests More Useful
- Part 16Getting Wine's Real 32-Bit Startup to Run
- Part 17Making the Launcher Own Its Storage and Processes
- Part 18A Real Archive Roundtrip and Better File Behavior
- Part 19Asynchronous I/O and the Bytes a Cancelled Write Keeps