Flutter Engine
 
Loading...
Searching...
No Matches
impeller::InlinePassContext Class Reference

#include <inline_pass_context.h>

Public Member Functions

 InlinePassContext (const ContentContext &renderer, EntityPassTarget &pass_target)
 
 ~InlinePassContext ()
 
bool IsValid () const
 
bool IsActive () const
 
std::shared_ptr< TextureGetTexture ()
 
bool EndPass (bool is_onscreen=false)
 
EntityPassTargetGetPassTarget () const
 
uint32_t GetPassCount () const
 
const std::shared_ptr< RenderPass > & GetRenderPass ()
 

Detailed Description

Definition at line 17 of file inline_pass_context.h.

Constructor & Destructor Documentation

◆ InlinePassContext()

impeller::InlinePassContext::InlinePassContext ( const ContentContext renderer,
EntityPassTarget pass_target 
)

Definition at line 20 of file inline_pass_context.cc.

22 : renderer_(renderer), pass_target_(pass_target) {}

◆ ~InlinePassContext()

impeller::InlinePassContext::~InlinePassContext ( )

Definition at line 24 of file inline_pass_context.cc.

24 {
25 EndPass();
26}
bool EndPass(bool is_onscreen=false)

References EndPass().

Member Function Documentation

◆ EndPass()

bool impeller::InlinePassContext::EndPass ( bool  is_onscreen = false)

Definition at line 43 of file inline_pass_context.cc.

43 {
44 if (!IsActive()) {
45 return true;
46 }
47 FML_DCHECK(command_buffer_);
48
49 if (!pass_->EncodeCommands()) {
50 VALIDATION_LOG << "Failed to encode and submit command buffer while ending "
51 "render pass.";
52 return false;
53 }
54
55 const std::shared_ptr<Texture>& target_texture =
57 if (target_texture->GetMipCount() > 1) {
59 command_buffer_, renderer_.GetContext(), target_texture);
60 if (!mip_status.ok()) {
61 return false;
62 }
63 }
64
65 pass_ = nullptr;
66 if (is_onscreen) {
67 return renderer_.GetContext()->SubmitOnscreen(std::move(command_buffer_));
68 } else {
69 return renderer_.GetContext()->EnqueueCommandBuffer(
70 std::move(command_buffer_));
71 }
72}
bool ok() const
Definition status.h:71
std::shared_ptr< Context > GetContext() const
EntityPassTarget & GetPassTarget() const
std::shared_ptr< Texture > GetRenderTargetTexture() const
#define FML_DCHECK(condition)
Definition logging.h:122
fml::Status AddMipmapGeneration(const std::shared_ptr< CommandBuffer > &command_buffer, const std::shared_ptr< Context > &context, const std::shared_ptr< Texture > &texture)
Adds a blit command to the render pass.
#define VALIDATION_LOG
Definition validation.h:91

References impeller::AddMipmapGeneration(), FML_DCHECK, impeller::ContentContext::GetContext(), GetPassTarget(), impeller::EntityPassTarget::GetRenderTarget(), impeller::RenderTarget::GetRenderTargetTexture(), IsActive(), fml::Status::ok(), and VALIDATION_LOG.

Referenced by ~InlinePassContext().

◆ GetPassCount()

uint32_t impeller::InlinePassContext::GetPassCount ( ) const

Definition at line 154 of file inline_pass_context.cc.

154 {
155 return pass_count_;
156}

◆ GetPassTarget()

EntityPassTarget & impeller::InlinePassContext::GetPassTarget ( ) const

Definition at line 74 of file inline_pass_context.cc.

74 {
75 return pass_target_;
76}

Referenced by EndPass().

◆ GetRenderPass()

const std::shared_ptr< RenderPass > & impeller::InlinePassContext::GetRenderPass ( )

Create a new render pass if one isn't active. This path will run the first time this method is called, but it'll also run if the pass has been previously ended via EndPass.

Definition at line 78 of file inline_pass_context.cc.

78 {
79 if (IsActive()) {
80 return pass_;
81 }
82
83 /// Create a new render pass if one isn't active. This path will run the first
84 /// time this method is called, but it'll also run if the pass has been
85 /// previously ended via `EndPass`.
86
87 command_buffer_ = renderer_.GetContext()->CreateCommandBuffer();
88 if (!command_buffer_) {
89 VALIDATION_LOG << "Could not create command buffer.";
90 return pass_;
91 }
92
93 command_buffer_->SetLabel("EntityPass Command Buffer");
94
95 {
96 // If the pass target has a resolve texture, then we're using MSAA.
97 bool is_msaa =
99 nullptr;
100 if (pass_count_ > 0 && is_msaa) {
101 pass_target_.Flip(renderer_);
102 }
103 }
104
105 // Find the color attachment a second time, since the target may have just
106 // flipped.
107 ColorAttachment color0 = pass_target_.GetRenderTarget().GetColorAttachment(0);
108 bool is_msaa = color0.resolve_texture != nullptr;
109
110 if (pass_count_ > 0) {
111 color0.load_action = is_msaa ? LoadAction::kClear : LoadAction::kLoad;
112 } else {
113 color0.load_action = LoadAction::kClear;
114 }
115
116 color0.store_action =
118
119 auto depth = pass_target_.GetRenderTarget().GetDepthAttachment();
120 if (!depth.has_value()) {
121 VALIDATION_LOG << "Depth attachment unexpectedly missing from the "
122 "EntityPass render target.";
123 return pass_;
124 }
125 depth->load_action = LoadAction::kClear;
126 depth->store_action = StoreAction::kDontCare;
127 pass_target_.target_.SetDepthAttachment(depth.value());
128
129 auto stencil = pass_target_.GetRenderTarget().GetStencilAttachment();
130 if (!depth.has_value() || !stencil.has_value()) {
131 VALIDATION_LOG << "Stencil/Depth attachment unexpectedly missing from the "
132 "EntityPass render target.";
133 return pass_;
134 }
135 stencil->load_action = LoadAction::kClear;
136 stencil->store_action = StoreAction::kDontCare;
137 depth->load_action = LoadAction::kClear;
138 depth->store_action = StoreAction::kDontCare;
139 pass_target_.target_.SetDepthAttachment(depth);
140 pass_target_.target_.SetStencilAttachment(stencil.value());
141 pass_target_.target_.SetColorAttachment(color0, 0);
142
143 pass_ = command_buffer_->CreateRenderPass(pass_target_.GetRenderTarget());
144 if (!pass_) {
145 VALIDATION_LOG << "Could not create render pass.";
146 return pass_;
147 }
148 pass_->SetLabel("EntityPass Render Pass");
149
150 ++pass_count_;
151 return pass_;
152}
std::shared_ptr< Texture > Flip(const ContentContext &renderer)
Flips the backdrop and returns a readable texture that can be bound/sampled to restore the previous p...
ColorAttachment GetColorAttachment(size_t index) const
Get the color attachment at [index].
RenderTarget & SetColorAttachment(const ColorAttachment &attachment, size_t index)
RenderTarget & SetDepthAttachment(std::optional< DepthAttachment > attachment)
RenderTarget & SetStencilAttachment(std::optional< StencilAttachment > attachment)
const std::optional< DepthAttachment > & GetDepthAttachment() const
const std::optional< StencilAttachment > & GetStencilAttachment() const
std::shared_ptr< Texture > resolve_texture
Definition formats.h:658

References impeller::EntityPassTarget::Flip(), impeller::RenderTarget::GetColorAttachment(), impeller::ContentContext::GetContext(), impeller::RenderTarget::GetDepthAttachment(), impeller::EntityPassTarget::GetRenderTarget(), impeller::RenderTarget::GetStencilAttachment(), IsActive(), impeller::kClear, impeller::kDontCare, impeller::kLoad, impeller::kMultisampleResolve, impeller::kStore, impeller::Attachment::load_action, impeller::Attachment::resolve_texture, impeller::RenderTarget::SetColorAttachment(), impeller::RenderTarget::SetDepthAttachment(), impeller::RenderTarget::SetStencilAttachment(), impeller::Attachment::store_action, and VALIDATION_LOG.

◆ GetTexture()

std::shared_ptr< Texture > impeller::InlinePassContext::GetTexture ( )

◆ IsActive()

bool impeller::InlinePassContext::IsActive ( ) const

Definition at line 32 of file inline_pass_context.cc.

32 {
33 return pass_ != nullptr;
34}

Referenced by EndPass(), and GetRenderPass().

◆ IsValid()

bool impeller::InlinePassContext::IsValid ( ) const

Definition at line 28 of file inline_pass_context.cc.

28 {
29 return pass_target_.IsValid();
30}

References impeller::EntityPassTarget::IsValid().

Referenced by impeller::Canvas::GetLocalCoverageLimit(), and GetTexture().


The documentation for this class was generated from the following files: