-
Notifications
You must be signed in to change notification settings - Fork 6k
[Impeller] Incorporate backdrop filters in subpass coverage. #46130
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -124,10 +124,43 @@ std::optional<Rect> EntityPass::GetElementsCoverage( | |
|
|
||
| std::optional<Rect> unfiltered_coverage = | ||
| GetSubpassCoverage(subpass, std::nullopt); | ||
|
|
||
| // If the current pass elements have any coverage so far and there's a | ||
| // backdrop filter, then incorporate the backdrop filter in the | ||
| // pre-filtered coverage of the subpass. | ||
| if (result.has_value() && subpass.backdrop_filter_proc_) { | ||
| std::shared_ptr<FilterContents> backdrop_filter = | ||
| subpass.backdrop_filter_proc_(FilterInput::Make(result.value()), | ||
| subpass.xformation_, | ||
| Entity::RenderingMode::kSubpass); | ||
| if (backdrop_filter) { | ||
| auto backdrop_coverage = backdrop_filter->GetCoverage({}); | ||
| backdrop_coverage->origin += result->origin; | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this line be under the
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah this could be placed just above |
||
| if (backdrop_coverage.has_value()) { | ||
| if (unfiltered_coverage.has_value()) { | ||
| unfiltered_coverage = coverage->Union(*backdrop_coverage); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ugh, yeah, if |
||
| } else { | ||
| unfiltered_coverage = backdrop_coverage; | ||
| } | ||
| } | ||
| } else { | ||
| VALIDATION_LOG << "The EntityPass backdrop filter proc didn't return " | ||
| "a valid filter."; | ||
| } | ||
| } | ||
|
|
||
| if (!unfiltered_coverage.has_value()) { | ||
| continue; | ||
| } | ||
|
|
||
| // Additionally, subpass textures may be passed through filters, which may | ||
| // modify the coverage. | ||
| // | ||
| // Note that we currently only assume that ImageFilters (such as blurs and | ||
| // matrix transforms) may modify coverage, although it's technically | ||
| // possible ColorFilters to affect coverage as well. For example: A | ||
| // ColorMatrixFilter could output a completely transparent result, and | ||
| // we could potentially detect this case as zero coverage in the future. | ||
| std::shared_ptr<FilterContents> image_filter = | ||
| subpass.delegate_->WithImageFilter(*unfiltered_coverage, | ||
| subpass.xformation_); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is subpass.backdrop_filter_proc_ and no backdrop filter response an error state? Should we add a validation log for that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Was thinking maybe we should gracefully support nullptr results for filters that do nothing, but on second thought I think that's confusing and filters should internally elide instead (as they already do)... Added a log.