-
Notifications
You must be signed in to change notification settings - Fork 8.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
"Chunked" soft fonts are no longer working correctly #16079
Comments
I think I know what the problem is. The new "cork" algorithm causes the VT renderer to flush when the end of the output buffer is reached. This assumes that the VT output is in a ground state, but that's not the case when we're processing a DCS sequence and are in the middle of passing it through to the conpty client. So what's happening is we're flushing a mode ?25 cursor update in the middle of the DCS stream, and that ends the stream early (you can see this in the debug tap). In theory this could potentially affect all soft fonts, but I think it's more easily triggered by the "chunked" examples I have because they have a line break after each chunk, and the cmd shell's |
I can't figure out how this worked before... VtEngine is still bound into the ~60 "FPS" rendering loop, so why didn't this still randomly happen previously? |
I assumed there was a lock of some sort that prevented the |
This changeset fixes an issue caused by #15991 where "chunked" escape sequences would get corrupted. The fix is to simply not flush eagerly anymore. I tried my best to keep the input lag reduction from #15991, but unfortunately this isn't possible for console APIs. Closes #16079 ## Validation Steps Performed * `type ascii.com` produces soft font ASCII characters ✅
This changeset fixes an issue caused by #15991 where "chunked" escape sequences would get corrupted. The fix is to simply not flush eagerly anymore. I tried my best to keep the input lag reduction from #15991, but unfortunately this isn't possible for console APIs. Closes #16079 ## Validation Steps Performed * `type ascii.com` produces soft font ASCII characters ✅ (cherry picked from commit bdf2f6f) Service-Card-Id: 91283205 Service-Version: 1.19
Edit: I see now (and remember). The problem is not that we flush with the state machine is not in ground state, but rather that My hope was I can remedy #16769 by doing this, but that doesn't work because it's in ground state during newlines: void VtIo::CorkRenderer(SCREEN_INFORMATION& screenInfo, bool corked) const noexcept
{
if (!corked && screenInfo.GetStateMachine().IsGroundState())
{
LOG_IF_FAILED(ServiceLocator::LocateGlobals().pRender->PaintFrame());
}
_pVtRenderEngine->Cork(corked);
} Edit 2: It's not that |
I've found that #16079 was never properly addressed (it still randomly occurred after even after PR #16349), which later led to the issues described in #16769 (nushell flickering due to too many flushes). The crux of the fix is that this brings back the `_noFlushOnEnd` flag that was removed in PR #15991. This is then combined with a change to the cork API: An `uncork` on `VtEngine` now only flushes if `_Flush` got called while it was corked in the first place. `_noFlushOnEnd` prevents us from flushing in between two "unknown" VT sequences (like soft fonts or FTCS) which prevents them from being corrupted. The corking prevents the remaining cases of flushing too often. Long-term, a proper fix would be to pass through VT unmodified. Closes #16769
I've found that #16079 was never properly addressed (it still randomly occurred after even after PR #16349), which later led to the issues described in #16769 (nushell flickering due to too many flushes). The crux of the fix is that this brings back the `_noFlushOnEnd` flag that was removed in PR #15991. This is then combined with a change to the cork API: An `uncork` on `VtEngine` now only flushes if `_Flush` got called while it was corked in the first place. `_noFlushOnEnd` prevents us from flushing in between two "unknown" VT sequences (like soft fonts or FTCS) which prevents them from being corrupted. The corking prevents the remaining cases of flushing too often. Long-term, a proper fix would be to pass through VT unmodified. Closes #16769 (cherry picked from commit 1ede023) Service-Card-Id: 91965217 Service-Version: 1.20
I've found that #16079 was never properly addressed (it still randomly occurred after even after PR #16349), which later led to the issues described in #16769 (nushell flickering due to too many flushes). The crux of the fix is that this brings back the `_noFlushOnEnd` flag that was removed in PR #15991. This is then combined with a change to the cork API: An `uncork` on `VtEngine` now only flushes if `_Flush` got called while it was corked in the first place. `_noFlushOnEnd` prevents us from flushing in between two "unknown" VT sequences (like soft fonts or FTCS) which prevents them from being corrupted. The corking prevents the remaining cases of flushing too often. Long-term, a proper fix would be to pass through VT unmodified. Closes #16769 (cherry picked from commit 1ede023) Service-Card-Id: 91965216 Service-Version: 1.19
Windows Terminal version
1.19.2682.0
Windows build number
10.0.19045.3448
Other Software
No response
Steps to reproduce
TYPE
the soft font file downloaded in step 1.Expected Behavior
The next prompt that is output should be rendered with that low-res VT220 font, looking something like this:
Actual Behavior
It appears that some of the characters are only partially downloaded, and some haven't been downloaded at all, so I'm seeing this:
If you look at the contents of the font file, you'll see that it's defined as a series of
DECDLD
sequences, so it's downloading 24 sets of 4 characters, rather than a single 94 character set. I think that's part of the reason for the failure, because fonts that aren't chunked like that don't seem to have the problem.I also noticed that it only happens in a cmd shell, but not in PowerShell or a WSL bash shell. My guess is that the other shells are buffering their output in a way that hides the problem. It's also possible there is a timing factor, but the cmd shell failure is easily reproducible for me.
And as far as I can tell, the problem was introduced in PR #15991. The commit prior to 41f7ed7 was working as expected.
The text was updated successfully, but these errors were encountered: