-
Notifications
You must be signed in to change notification settings - Fork 6k
[Impeller] round up subpass coverage when it is close to (and smaller) than root pass size. #49925
Changes from 7 commits
3434aff
edc86d3
42a37e0
19bbfad
83d5360
198b5cb
b721b56
7e537c7
29ace61
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 |
|---|---|---|
|
|
@@ -23,7 +23,9 @@ | |
| #include "impeller/entity/entity.h" | ||
| #include "impeller/entity/inline_pass_context.h" | ||
| #include "impeller/geometry/color.h" | ||
| #include "impeller/geometry/matrix.h" | ||
| #include "impeller/geometry/rect.h" | ||
| #include "impeller/geometry/size.h" | ||
| #include "impeller/renderer/command_buffer.h" | ||
|
|
||
| #ifdef IMPELLER_DEBUG | ||
|
|
@@ -485,6 +487,45 @@ bool EntityPass::Render(ContentContext& renderer, | |
| clip_coverage_stack); // clip_coverage_stack | ||
| } | ||
|
|
||
| // When a subpass size is close to, but still smaller than the root pass | ||
| // size and smaller than the bounds hint, we may scale it up to the root | ||
| // pass size. This will improve performance by improving the efficiency of | ||
| // the render target cache, as only textures with exactly the same sizes + | ||
| // descriptors can be recycled. | ||
| static ISize MaybeRoundUpTextureSize(ISize subpass_size, | ||
| ISize root_pass_size, | ||
| std::optional<Rect> bounds_limit, | ||
| const Matrix& subpass_transform) { | ||
| // If the subpass is already bigger than the root pass size, | ||
| // return the existing subpass size. | ||
| if (subpass_size.width > root_pass_size.width || | ||
| subpass_size.height > root_pass_size.height) { | ||
| return subpass_size; | ||
| } | ||
|
|
||
| // If there is a bounds limit and it is tigher than the root pass size, | ||
| // return the existing subpass size. This case could be removed if we | ||
| // conditionally inserted clips/scissor instead. | ||
| if (bounds_limit.has_value()) { | ||
| auto user_bounds_size = | ||
| bounds_limit->TransformBounds(subpass_transform).GetSize(); | ||
|
||
| if (user_bounds_size.width < root_pass_size.width || | ||
| user_bounds_size.height < root_pass_size.height) { | ||
| return subpass_size; | ||
| } | ||
| } | ||
|
|
||
| // If the subpass size is within 10% of the root pass size, round up | ||
| // to the root pass size. | ||
| if (root_pass_size.width - subpass_size.width <= | ||
| (0.1 * root_pass_size.width) && | ||
| root_pass_size.height - subpass_size.height <= | ||
| (0.1 * root_pass_size.height)) { | ||
| return root_pass_size; | ||
| } | ||
| return subpass_size; | ||
| } | ||
|
|
||
| EntityPass::EntityResult EntityPass::GetEntityForElement( | ||
| const EntityPass::Element& element, | ||
| ContentContext& renderer, | ||
|
|
@@ -618,6 +659,9 @@ EntityPass::EntityResult EntityPass::GetEntityForElement( | |
| return EntityPass::EntityResult::Skip(); | ||
| } | ||
|
|
||
| subpass_size = | ||
| MaybeRoundUpTextureSize(subpass_size, root_pass_size, | ||
| subpass->bounds_limit_, subpass->transform_); | ||
| auto subpass_target = CreateRenderTarget( | ||
| renderer, // renderer | ||
| subpass_size, // size | ||
|
|
||
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.
Ahh, one if these is 100,100, need to make the expection more specific.