D187 - "The display accepted it" and "a frame reached the screen" are different facts, and the report only carried the first
obs_display_open reported
ready|1920x1080 framebuffer once an output opened, a
framebuffer registered and a flip was accepted. On Kyty every one of
those succeeded and the window was black for the whole run. The report
asserted a working display on a platform that could not present -
the only claim in it with no measurement behind it, in
the program whose entire argument is that a return code is not
evidence.
The question that produced it
"If Kyty doesn't implement the GPU for the current generation then it is not a current-generation emulator, so we should be able to detect that at runtime - and PS5PCEM implements them, so we have a testbed for what does versus what doesn't."
Correct, and the framing is the important part: not which loader is this, which would be the per-loader accommodation this project refuses, but does this platform present. That is a behavioural question with a behavioural answer.
The mechanism
sceVideoOutGetFlipStatus reports how many frames have
been shown. Submit a flip, watch the counter. It moves or it does not,
and neither answer needs to know which loader is running.
Promoted out of the census, which required a struct layout - the thing D008 forbids inventing. Two independent implementations agree on the first field, which is the only one read:
Kyty uint64_t count; // first member
PS5PCEM count: u64, // first member, in two separate files
They disagree about most of the rest, which is left alone behind a buffer far larger than either writes. Same standard D111 set for the buffer descriptor.
Polled, not read once - and this is the part that mattered
The first version read the counter immediately after the flip and reported shadPS4 as blind, which draws the report perfectly well and whose implementation of the call is entirely correct. A flip is queued; the counter moves when a presenter picks it up. A test that calls a working display broken is worse than no test at all.
Twenty polls at five milliseconds, once per run, then never again: the question is whether the platform presents at all, and one frame settles it.
Made to fail before being believed
Kyty's flip registration was removed, deliberately, and the module rerun:
OBS|display|blind|flips are accepted and the frame count never moves
Restored, it reports presenting. A guard nobody has
watched reject something is a guard nobody knows anything about.
| loader | verdict | true? |
|---|---|---|
| shadPS4 | presenting | yes - draws the report |
| PS5PCEM | presenting | yes - draws the report |
| fpPS4 | presenting | yes - draws the report |
| Kyty (gen 4) | presenting | yes - frames reach the display, black ones |
| Kyty, flip unregistered | blind | yes - the failing case |
What it still cannot answer
Whether the frame was correct. Kyty presents black because
its renderer reads a linear buffer through its tile path, and a guest
cannot read back what was scanned out. presenting means a
frame arrived, not that it was the right one.
Status: assumed - the first field being the frame count rests on two emulators agreeing.