@@ -238,15 +238,18 @@ void EntityPass::AddSubpassInline(std::unique_ptr<EntityPass> pass) {
238238 pass->advanced_blend_reads_from_pass_texture_ ;
239239}
240240
241- static const constexpr RenderTarget::AttachmentConfig kDefaultStencilConfig =
242- RenderTarget::AttachmentConfig{
243- .storage_mode = StorageMode::kDeviceTransient ,
244- .load_action = LoadAction::kDontCare ,
245- .store_action = StoreAction::kDontCare ,
246- };
241+ static RenderTarget::AttachmentConfig GetDefaultStencilConfig (bool readable) {
242+ return RenderTarget::AttachmentConfig{
243+ .storage_mode = readable ? StorageMode::kDevicePrivate
244+ : StorageMode::kDeviceTransient ,
245+ .load_action = LoadAction::kDontCare ,
246+ .store_action = StoreAction::kDontCare ,
247+ };
248+ }
247249
248250static EntityPassTarget CreateRenderTarget (ContentContext& renderer,
249251 ISize size,
252+ bool readable,
250253 const Color& clear_color) {
251254 auto context = renderer.GetContext ();
252255
@@ -267,8 +270,8 @@ static EntityPassTarget CreateRenderTarget(ContentContext& renderer,
267270 .resolve_storage_mode = StorageMode::kDevicePrivate ,
268271 .load_action = LoadAction::kDontCare ,
269272 .store_action = StoreAction::kMultisampleResolve ,
270- .clear_color = clear_color}, // color_attachment_config
271- kDefaultStencilConfig // stencil_attachment_config
273+ .clear_color = clear_color}, // color_attachment_config
274+ GetDefaultStencilConfig (readable) // stencil_attachment_config
272275 );
273276 } else {
274277 target = RenderTarget::CreateOffscreen (
@@ -281,8 +284,8 @@ static EntityPassTarget CreateRenderTarget(ContentContext& renderer,
281284 .load_action = LoadAction::kDontCare ,
282285 .store_action = StoreAction::kDontCare ,
283286 .clear_color = clear_color,
284- }, // color_attachment_config
285- kDefaultStencilConfig // stencil_attachment_config
287+ }, // color_attachment_config
288+ GetDefaultStencilConfig (readable) // stencil_attachment_config
286289 );
287290 }
288291
@@ -340,7 +343,7 @@ bool EntityPass::Render(ContentContext& renderer,
340343 // there's no need to set up a stencil attachment on the root render target.
341344 if (reads_from_onscreen_backdrop) {
342345 auto offscreen_target = CreateRenderTarget (
343- renderer, root_render_target.GetRenderTargetSize (),
346+ renderer, root_render_target.GetRenderTargetSize (), true ,
344347 GetClearColorOrDefault (render_target.GetRenderTargetSize ()));
345348
346349 if (!OnRender (renderer, // renderer
@@ -442,7 +445,8 @@ bool EntityPass::Render(ContentContext& renderer,
442445 *renderer.GetContext (), *renderer.GetRenderTargetCache (),
443446 color0.texture ->GetSize (),
444447 renderer.GetContext ()->GetCapabilities ()->SupportsOffscreenMSAA (),
445- " ImpellerOnscreen" , kDefaultStencilConfig );
448+ " ImpellerOnscreen" ,
449+ GetDefaultStencilConfig (reads_from_onscreen_backdrop));
446450 }
447451
448452 // Set up the clear color of the root pass.
@@ -479,10 +483,10 @@ EntityPass::EntityResult EntityPass::GetEntityForElement(
479483 // --------------------------------------------------------------------------
480484 // / Setup entity element.
481485 // /
486+
482487 if (const auto & entity = std::get_if<Entity>(&element)) {
483488 Entity element_entity = entity->Clone ();
484489 element_entity.SetCapture (capture.CreateChild (" Entity" ));
485-
486490 if (!global_pass_position.IsZero ()) {
487491 // If the pass image is going to be rendered with a non-zero position,
488492 // apply the negative translation to entity copies before rendering them
@@ -497,9 +501,11 @@ EntityPass::EntityResult EntityPass::GetEntityForElement(
497501 // --------------------------------------------------------------------------
498502 // / Setup subpass element.
499503 // /
500- if (const auto & subpass_ptr =
501- std::get_if<std::unique_ptr<EntityPass>>(&element)) {
504+
505+ else if (const auto & subpass_ptr =
506+ std::get_if<std::unique_ptr<EntityPass>>(&element)) {
502507 auto subpass = subpass_ptr->get ();
508+
503509 if (subpass->delegate_ ->CanElide ()) {
504510 return EntityPass::EntityResult::Skip ();
505511 }
@@ -602,6 +608,7 @@ EntityPass::EntityResult EntityPass::GetEntityForElement(
602608 auto subpass_target = CreateRenderTarget (
603609 renderer, // renderer
604610 subpass_size, // size
611+ subpass->GetTotalPassReads (renderer) > 0 , // readable
605612 subpass->GetClearColorOrDefault (subpass_size)); // clear_color
606613
607614 if (!subpass_target.IsValid ()) {
@@ -675,6 +682,7 @@ EntityPass::EntityResult EntityPass::GetEntityForElement(
675682
676683 return EntityPass::EntityResult::Success (std::move (element_entity));
677684 }
685+
678686 FML_UNREACHABLE ();
679687}
680688
@@ -699,15 +707,6 @@ bool EntityPass::RenderElement(Entity& element_entity,
699707 // blit the non-MSAA resolve texture of the previous pass to MSAA textures
700708 // (let alone a transient one).
701709 if (result.backdrop_texture ) {
702- // Restore any clips that were recorded before the backdrop filter was
703- // applied.
704- auto & replay_entities = clip_replay_->GetReplayEntities ();
705- for (const auto & entity : replay_entities) {
706- if (!entity.Render (renderer, *result.pass )) {
707- VALIDATION_LOG << " Failed to render entity for clip restore." ;
708- }
709- }
710-
711710 auto size_rect = Rect::MakeSize (result.pass ->GetRenderTargetSize ());
712711 auto msaa_backdrop_contents = TextureContents::MakeRect (size_rect);
713712 msaa_backdrop_contents->SetStencilEnabled (false );
@@ -815,7 +814,6 @@ bool EntityPass::RenderElement(Entity& element_entity,
815814#endif
816815
817816 element_entity.SetClipDepth (element_entity.GetClipDepth () - clip_depth_floor);
818- clip_replay_->RecordEntity (element_entity, clip_coverage.type );
819817 if (!element_entity.Render (renderer, *result.pass )) {
820818 VALIDATION_LOG << " Failed to render entity." ;
821819 return false ;
@@ -1167,24 +1165,4 @@ void EntityPass::SetEnableOffscreenCheckerboard(bool enabled) {
11671165 enable_offscreen_debug_checkerboard_ = enabled;
11681166}
11691167
1170- EntityPassClipRecorder::EntityPassClipRecorder () {}
1171-
1172- void EntityPassClipRecorder::RecordEntity (const Entity& entity,
1173- Contents::ClipCoverage::Type type) {
1174- switch (type) {
1175- case Contents::ClipCoverage::Type::kNoChange :
1176- return ;
1177- case Contents::ClipCoverage::Type::kAppend :
1178- rendered_clip_entities_.push_back (entity.Clone ());
1179- break ;
1180- case Contents::ClipCoverage::Type::kRestore :
1181- rendered_clip_entities_.pop_back ();
1182- break ;
1183- }
1184- }
1185-
1186- const std::vector<Entity>& EntityPassClipRecorder::GetReplayEntities () const {
1187- return rendered_clip_entities_;
1188- }
1189-
11901168} // namespace impeller
0 commit comments