Flutter Impeller
contents.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 #include <optional>
7 
8 #include "fml/logging.h"
11 #include "impeller/core/formats.h"
17 
18 namespace impeller {
19 
26  pass.GetRenderTarget().GetStencilAttachment().has_value();
27  return opts;
28 }
29 
31  const Entity& entity) {
33  opts.blend_mode = entity.GetBlendMode();
34  return opts;
35 }
36 
37 std::shared_ptr<Contents> Contents::MakeAnonymous(
38  Contents::RenderProc render_proc,
39  Contents::CoverageProc coverage_proc) {
40  return AnonymousContents::Make(std::move(render_proc),
41  std::move(coverage_proc));
42 }
43 
44 Contents::Contents() = default;
45 
46 Contents::~Contents() = default;
47 
48 bool Contents::IsOpaque() const {
49  return false;
50 }
51 
53  const Entity& entity,
54  const std::optional<Rect>& current_stencil_coverage) const {
56  .coverage = current_stencil_coverage};
57 }
58 
59 std::optional<Snapshot> Contents::RenderToSnapshot(
60  const ContentContext& renderer,
61  const Entity& entity,
62  std::optional<Rect> coverage_limit,
63  const std::optional<SamplerDescriptor>& sampler_descriptor,
64  bool msaa_enabled,
65  const std::string& label) const {
66  auto coverage = GetCoverage(entity);
67  if (!coverage.has_value()) {
68  return std::nullopt;
69  }
70 
71  // Pad Contents snapshots with 1 pixel borders to ensure correct sampling
72  // behavior. Not doing so results in a coverage leak for filters that support
73  // customizing the input sampling mode. Snapshots of contents should be
74  // theoretically treated as infinite size just like layers.
75  coverage = coverage->Expand(1);
76 
77  if (coverage_limit.has_value()) {
78  coverage = coverage->Intersection(*coverage_limit);
79  if (!coverage.has_value()) {
80  return std::nullopt;
81  }
82  }
83 
84  auto texture = renderer.MakeSubpass(
85  label, ISize::Ceil(coverage->size),
86  [&contents = *this, &entity, &coverage](const ContentContext& renderer,
87  RenderPass& pass) -> bool {
88  Entity sub_entity;
89  sub_entity.SetBlendMode(BlendMode::kSourceOver);
90  sub_entity.SetTransformation(
91  Matrix::MakeTranslation(Vector3(-coverage->origin)) *
92  entity.GetTransformation());
93  return contents.Render(renderer, sub_entity, pass);
94  },
95  msaa_enabled);
96 
97  if (!texture) {
98  return std::nullopt;
99  }
100 
101  auto snapshot = Snapshot{
102  .texture = texture,
103  .transform = Matrix::MakeTranslation(coverage->origin),
104  };
105  if (sampler_descriptor.has_value()) {
106  snapshot.sampler_descriptor = sampler_descriptor.value();
107  }
108 
109  return snapshot;
110 }
111 
112 bool Contents::CanInheritOpacity(const Entity& entity) const {
113  return false;
114 }
115 
117  VALIDATION_LOG << "Contents::SetInheritedOpacity should never be called when "
118  "Contents::CanAcceptOpacity returns false.";
119 }
120 
121 std::optional<Color> Contents::AsBackgroundColor(const Entity& entity,
122  ISize target_size) const {
123  return {};
124 }
125 
127  return nullptr;
128 }
129 
131  const Contents::ColorFilterProc& color_filter_proc) {
132  return false;
133 }
134 
135 bool Contents::ShouldRender(const Entity& entity,
136  const std::optional<Rect>& stencil_coverage) const {
137  if (!stencil_coverage.has_value()) {
138  return false;
139  }
140 
141  auto coverage = GetCoverage(entity);
142  if (!coverage.has_value()) {
143  return false;
144  }
145  if (coverage == Rect::MakeMaximum()) {
146  return true;
147  }
148  return stencil_coverage->IntersectsWithRect(coverage.value());
149 }
150 
151 void Contents::SetCoverageHint(std::optional<Rect> coverage_hint) {
152  coverage_hint_ = coverage_hint;
153 }
154 
155 const std::optional<Rect>& Contents::GetCoverageHint() const {
156  return coverage_hint_;
157 }
158 
159 std::optional<Size> Contents::GetColorSourceSize() const {
160  return color_source_size_;
161 };
162 
164  color_source_size_ = size;
165 }
166 
167 } // namespace impeller
impeller::Contents::GetColorSourceSize
std::optional< Size > GetColorSourceSize() const
Return the color source's intrinsic size, if available.
Definition: contents.cc:159
impeller::OptionsFromPass
ContentContextOptions OptionsFromPass(const RenderPass &pass)
Definition: contents.cc:20
impeller::RenderPass::GetRenderTarget
const RenderTarget & GetRenderTarget() const
Definition: render_pass.cc:26
contents.h
impeller::Scalar
float Scalar
Definition: scalar.h:15
impeller::Contents::SetCoverageHint
void SetCoverageHint(std::optional< Rect > coverage_hint)
Hint that specifies the coverage area of this Contents that will actually be used during rendering....
Definition: contents.cc:151
impeller::Contents::AsBackgroundColor
virtual std::optional< Color > AsBackgroundColor(const Entity &entity, ISize target_size) const
Returns a color if this Contents will flood the given target_size with a color. This output color is ...
Definition: contents.cc:121
texture_contents.h
impeller::Contents::SetColorSourceSize
void SetColorSourceSize(Size size)
Definition: contents.cc:163
impeller::Contents::CanInheritOpacity
virtual bool CanInheritOpacity(const Entity &entity) const
Whether or not this contents can accept the opacity peephole optimization.
Definition: contents.cc:112
impeller::Contents::Contents
Contents()
formats.h
impeller::Contents::GetCoverage
virtual std::optional< Rect > GetCoverage(const Entity &entity) const =0
Get the screen space bounding rectangle that this contents affects.
impeller::TSize< int64_t >::Ceil
constexpr TSize Ceil() const
Definition: size.h:91
impeller::RenderTarget::GetRenderTargetPixelFormat
PixelFormat GetRenderTargetPixelFormat() const
Definition: render_target.cc:164
impeller::ContentContextOptions::blend_mode
BlendMode blend_mode
Definition: content_context.h:304
impeller::Contents::StencilCoverage::Type::kNoChange
@ kNoChange
impeller::Matrix::MakeTranslation
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:94
validation.h
impeller::Entity
Definition: entity.h:21
impeller::OptionsFromPassAndEntity
ContentContextOptions OptionsFromPassAndEntity(const RenderPass &pass, const Entity &entity)
Definition: contents.cc:30
impeller::Contents::GetCoverageHint
const std::optional< Rect > & GetCoverageHint() const
Definition: contents.cc:155
impeller::TSize< int64_t >
impeller::ContentContext::MakeSubpass
std::shared_ptr< Texture > MakeSubpass(const std::string &label, ISize texture_size, const SubpassCallback &subpass_callback, bool msaa_enabled=true) const
Creates a new texture of size texture_size and calls subpass_callback with a RenderPass for drawing t...
Definition: content_context.cc:373
impeller::ContentContextOptions::color_attachment_pixel_format
PixelFormat color_attachment_pixel_format
Definition: content_context.h:308
render_pass.h
impeller::Contents::StencilCoverage
Definition: contents.h:39
impeller::Contents::~Contents
virtual ~Contents()
impeller::Contents::ColorFilterProc
std::function< Color(Color)> ColorFilterProc
Definition: contents.h:37
impeller::Snapshot
Represents a texture and its intended draw transform/sampler configuration.
Definition: snapshot.h:24
impeller::ContentContextOptions::has_stencil_attachment
bool has_stencil_attachment
Definition: content_context.h:309
strings.h
anonymous_contents.h
impeller::Entity::GetBlendMode
BlendMode GetBlendMode() const
Definition: entity.cc:101
impeller::RenderPass
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition: render_pass.h:27
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:60
command_buffer.h
content_context.h
impeller::Contents::RenderProc
std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)> RenderProc
Definition: contents.h:48
impeller::ContentContextOptions::sample_count
SampleCount sample_count
Definition: content_context.h:303
impeller::TRect< Scalar >::MakeMaximum
constexpr static TRect MakeMaximum()
Definition: rect.h:75
impeller::Contents::SetInheritedOpacity
virtual void SetInheritedOpacity(Scalar opacity)
Inherit the provided opacity.
Definition: contents.cc:116
impeller::Contents::StencilCoverage::type
Type type
Definition: contents.h:42
impeller::Contents::MakeAnonymous
static std::shared_ptr< Contents > MakeAnonymous(RenderProc render_proc, CoverageProc coverage_proc)
Definition: contents.cc:37
impeller::Contents::ApplyColorFilter
virtual bool ApplyColorFilter(const ColorFilterProc &color_filter_proc)
If possible, applies a color filter to this contents inputs on the CPU.
Definition: contents.cc:130
impeller::Contents::CoverageProc
std::function< std::optional< Rect >(const Entity &entity)> CoverageProc
Definition: contents.h:49
impeller::Snapshot::texture
std::shared_ptr< Texture > texture
Definition: snapshot.h:25
impeller::RenderTarget::GetStencilAttachment
const std::optional< StencilAttachment > & GetStencilAttachment() const
Definition: render_target.cc:218
impeller::Contents::IsOpaque
virtual bool IsOpaque() const
Whether this Contents only emits opaque source colors from the fragment stage. This value does not ac...
Definition: contents.cc:48
impeller::ContentContextOptions
Definition: content_context.h:302
impeller::RenderTarget::GetSampleCount
SampleCount GetSampleCount() const
Definition: render_target.cc:126
impeller
Definition: aiks_context.cc:10
impeller::ContentContext
Definition: content_context.h:344
impeller::Contents::AsFilter
virtual const FilterContents * AsFilter() const
Cast to a filter. Returns nullptr if this Contents is not a filter.
Definition: contents.cc:126
impeller::Contents::GetStencilCoverage
virtual StencilCoverage GetStencilCoverage(const Entity &entity, const std::optional< Rect > &current_stencil_coverage) const
Given the current screen space bounding rectangle of the stencil, return the expected stencil coverag...
Definition: contents.cc:52
impeller::AnonymousContents::Make
static std::shared_ptr< Contents > Make(RenderProc render_proc, CoverageProc coverage_proc)
Definition: anonymous_contents.cc:11
impeller::FilterContents
Definition: filter_contents.h:19
impeller::Contents::RenderToSnapshot
virtual std::optional< Snapshot > RenderToSnapshot(const ContentContext &renderer, const Entity &entity, std::optional< Rect > coverage_limit=std::nullopt, const std::optional< SamplerDescriptor > &sampler_descriptor=std::nullopt, bool msaa_enabled=true, const std::string &label="Snapshot") const
Render this contents to a snapshot, respecting the entity's transform, path, stencil depth,...
Definition: contents.cc:59
impeller::Contents::ShouldRender
virtual bool ShouldRender(const Entity &entity, const std::optional< Rect > &stencil_coverage) const
Definition: contents.cc:135