[PR #5024] Move ConPTY to use til::bitmap #26085

Open
opened 2026-01-31 09:13:49 +00:00 by claunia · 0 comments
Owner

Original Pull Request: https://github.com/microsoft/terminal/pull/5024

State: closed
Merged: Yes


Summary of the Pull Request

Moves the ConPTY drawing mechanism (VtRenderer) to use the fine-grained til::bitmap individual-dirty-bit tracking mechanism instead of coarse-grained rectangle unions to improve drawing performance by dramatically reducing the total area redrawn.

PR Checklist

Detailed Description of the Pull Request / Additional comments

  • Converted GetDirtyArea() interface from IRenderEngine to use a vector of til::rectangle instead of the SMALL_RECT to banhammer inclusive rectangles.
  • VtEngine now holds and operates on the til::bitmap for invalidation regions. All invalidation operation functions that used to be embedded inside VtEngine are deleted in favor of using the ones in til::bitmap.
  • Updated VtEngine tracing to use new til::bitmap on trace and the new to_string() methods detailed below.
  • Comparison operators for til::bitmap and complementary tests.
  • Fixed an issue where the dirty rectangle shortcut in til::bitmap was set to 0,0,0,0 by default which means that |= on it with each set() operation was stretching the rectangle from 0,0. Now it's a std::optional so it has no value after just being cleared and will build from whatever the first invalidated rectangle is. Complementary tests added.
  • Optional run caching for til::bitmap in the runs() method since both VT and DX renderers will likely want to generate the set of runs at the beginning of a frame and refer to them over and over through that frame. Saves the iteration and creation and caches inside til::bitmap where the chance of invalidation of the underlying data is known best. It is still possible to iterate manually with begin() and end() from the outside without caching, if desired. Complementary tests added.
  • WEX templates added for til::bitmap and used in tests.
  • translate() method for til::bitmap which will slide the dirty points in the direction specified by a til::point and optionally back-fill the uncovered area as dirty. Complementary tests added.
  • Moves all string generation for til types size, point, rectangle, and some into a to_string method on each object such that it can be used in both ETW tracing scenarios AND in the TAEF templates uniformly. Adds a similar method for bitmap.
  • Add tagging to _bitmap_const_iterator such that it appears as a valid Input Iterator to STL collections and can be used in a std::vector constructor as a range. Adds and cleans up operators on this iterator to match the theoretical requirements for an Input Iterator. Complementary tests added.
  • Add loose operators to til which will allow some basic math operations (+, -, *, /) between til::size and til::point and vice versa. Complementary tests added. Complementary tests added.
  • Adds operators to til::rectangle to allow scaling with basic math operations (+, -, *) versus til::size and translation with basic math operations (+, -) against til::point. Complementary tests added.
  • In-place variants of some operations added to assorted til objects. Complementary tests added.
  • Update VT tests to compare invalidation against the new map structure instead of raw rectangles where possible.

Validation Steps Performed

  • Wrote additional til Unit Tests for all additional operators and functions added to the project to support this operation
  • Updated the existing VT renderer tests
  • Ran perf check
**Original Pull Request:** https://github.com/microsoft/terminal/pull/5024 **State:** closed **Merged:** Yes --- ## Summary of the Pull Request Moves the ConPTY drawing mechanism (`VtRenderer`) to use the fine-grained `til::bitmap` individual-dirty-bit tracking mechanism instead of coarse-grained rectangle unions to improve drawing performance by dramatically reducing the total area redrawn. ## PR Checklist * [x] Part of #778 and #1064 * [x] I work here * [x] Tests added and updated. * [x] I'm a core contributor ## Detailed Description of the Pull Request / Additional comments - Converted `GetDirtyArea()` interface from `IRenderEngine` to use a vector of `til::rectangle` instead of the `SMALL_RECT` to banhammer inclusive rectangles. - `VtEngine` now holds and operates on the `til::bitmap` for invalidation regions. All invalidation operation functions that used to be embedded inside `VtEngine` are deleted in favor of using the ones in `til::bitmap`. - Updated `VtEngine` tracing to use new `til::bitmap` on trace and the new `to_string()` methods detailed below. - Comparison operators for `til::bitmap` and complementary tests. - Fixed an issue where the dirty rectangle shortcut in `til::bitmap` was set to 0,0,0,0 by default which means that `|=` on it with each `set()` operation was stretching the rectangle from 0,0. Now it's a `std::optional` so it has no value after just being cleared and will build from whatever the first invalidated rectangle is. Complementary tests added. - Optional run caching for `til::bitmap` in the `runs()` method since both VT and DX renderers will likely want to generate the set of runs at the beginning of a frame and refer to them over and over through that frame. Saves the iteration and creation and caches inside `til::bitmap` where the chance of invalidation of the underlying data is known best. It is still possible to iterate manually with `begin()` and `end()` from the outside without caching, if desired. Complementary tests added. - WEX templates added for `til::bitmap` and used in tests. - `translate()` method for `til::bitmap` which will slide the dirty points in the direction specified by a `til::point` and optionally back-fill the uncovered area as dirty. Complementary tests added. - Moves all string generation for `til` types `size`, `point`, `rectangle`, and `some` into a `to_string` method on each object such that it can be used in both ETW tracing scenarios AND in the TAEF templates uniformly. Adds a similar method for `bitmap`. - Add tagging to `_bitmap_const_iterator` such that it appears as a valid **Input Iterator** to STL collections and can be used in a `std::vector` constructor as a range. Adds and cleans up operators on this iterator to match the theoretical requirements for an **Input Iterator**. Complementary tests added. - Add loose operators to `til` which will allow some basic math operations (+, -, *, /) between `til::size` and `til::point` and vice versa. Complementary tests added. Complementary tests added. - Adds operators to `til::rectangle` to allow scaling with basic math operations (+, -, *) versus `til::size` and translation with basic math operations (+, -) against `til::point`. Complementary tests added. - In-place variants of some operations added to assorted `til` objects. Complementary tests added. - Update VT tests to compare invalidation against the new map structure instead of raw rectangles where possible. ## Validation Steps Performed - Wrote additional til Unit Tests for all additional operators and functions added to the project to support this operation - Updated the existing VT renderer tests - Ran perf check
claunia added the pull-request label 2026-01-31 09:13:49 +00:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#26085