Skip to content

displayio and vectorio: move to displayio_area_union and away from _expand #4486

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

Merged
merged 2 commits into from
Mar 27, 2021

Conversation

kmatch98
Copy link

Following up on: #4432

This change removes display_area_expand since it didn't check for empty areas and moves to display_area_union which properly checks for empty areas.

Also adds one use of display_area_canon to vectorio to reduce duplicated code.

@kmatch98 kmatch98 changed the title displayio and vectorio: ove to displayio_area_union and away from _expand displayio and vectorio: move to displayio_area_union and away from _expand Mar 25, 2021
Copy link
Member

@tannewt tannewt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a good cleanup! Thank you!

@dhalbert dhalbert merged commit a13da2a into adafruit:main Mar 27, 2021
@@ -245,21 +245,6 @@ void displayio_gc_collect(void) {
}
}

void displayio_area_expand(displayio_area_t *original, const displayio_area_t *addition) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you consider or measure the effective impact of switching from 4 conditioned writes to multiple conditions followed by 4 branching unconditional writes?
Probably in this case it is okay because it is per-frame, but seemingly innocuous change can have dramatic pixel fill rate or frame latency impact in this area so I’m somewhat skeptical of doing more work than is necessary.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a great point. My main motivation was to fix an issue where when area1 was combined with an empty area (defined as empty by x1==x2==0) that it would return an area with x1=0 and x2=area1.x2. This caused unnecessary dirty rectangle redrawing.

But your point is about performance of the union command vs. the code in expand. I didn't look at any performance differences. I've never done any performance testing down at the C-level. If you give a good example of how best to do this to make the comparison, and I'll check it out.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think a test for this would be a chore. Native time functions have a 32khz resolution iirc and either call should surely take less than 31 microseconds? You could time a frame with several 1px overlapping rectangles but there’s quite a bit of noise in that aggregate signal. I’ve wrapped code up higher in the displayio draw stack to A/B test things in this way but I do not have a clear example for you to follow.
Last time I was actively adding to vectorio I wanted to make a more convenient way to use a high precision hardware timer for things like this.
I really don’t think there’s a problem with this code, I just appreciate you taking an active interest and hope you also always defend (and improve!) the pixel fill rate :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants