Flutter Engine
 
Loading...
Searching...
No Matches
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"
16
17namespace impeller {
18
21 opts.sample_count = pass.GetSampleCount();
23
24 bool has_depth_stencil_attachments =
27
28 opts.has_depth_stencil_attachments = has_depth_stencil_attachments;
31 return opts;
32}
33
35 const Entity& entity) {
37 opts.blend_mode = entity.GetBlendMode();
38 return opts;
39}
40
41std::shared_ptr<Contents> Contents::MakeAnonymous(
42 Contents::RenderProc render_proc,
43 Contents::CoverageProc coverage_proc) {
44 return AnonymousContents::Make(std::move(render_proc),
45 std::move(coverage_proc));
46}
47
48Contents::Contents() = default;
49
50Contents::~Contents() = default;
51
53 return false;
54}
55
56std::optional<Snapshot> Contents::RenderToSnapshot(
57 const ContentContext& renderer,
58 const Entity& entity,
59 const Contents::SnapshotOptions& options) const {
60 auto coverage = GetCoverage(entity);
61 if (!coverage.has_value()) {
62 return std::nullopt;
63 }
64
65 std::shared_ptr<CommandBuffer> command_buffer =
66 renderer.GetContext()->CreateCommandBuffer();
67 if (!command_buffer) {
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(options.coverage_expansion);
76
77 if (options.coverage_limit.has_value()) {
78 coverage = coverage->Intersection(*options.coverage_limit);
79 if (!coverage.has_value()) {
80 return std::nullopt;
81 }
82 }
83
84 ISize subpass_size = ISize::Ceil(coverage->GetSize());
85 fml::StatusOr<RenderTarget> render_target = renderer.MakeSubpass(
86 options.label, subpass_size, command_buffer,
87 [&contents = *this, &entity, &coverage](const ContentContext& renderer,
88 RenderPass& pass) -> bool {
89 Entity sub_entity;
90 sub_entity.SetBlendMode(BlendMode::kSrcOver);
91 sub_entity.SetTransform(
92 Matrix::MakeTranslation(Vector3(-coverage->GetOrigin())) *
93 entity.GetTransform());
94 return contents.Render(renderer, sub_entity, pass);
95 },
96 options.msaa_enabled, /*depth_stencil_enabled=*/true,
97 std::min(options.mip_count,
98 static_cast<int32_t>(subpass_size.MipCount())));
99
100 if (!render_target.ok()) {
101 return std::nullopt;
102 }
103 if (!renderer.GetContext()->EnqueueCommandBuffer(std::move(command_buffer))) {
104 return std::nullopt;
105 }
106
107 auto snapshot = Snapshot{
108 .texture = render_target.value().GetRenderTargetTexture(),
109 .transform = Matrix::MakeTranslation(coverage->GetOrigin()),
110 };
111 if (options.sampler_descriptor.has_value()) {
112 snapshot.sampler_descriptor = options.sampler_descriptor.value();
113 }
114
115 return snapshot;
116}
117
119 VALIDATION_LOG << "Contents::SetInheritedOpacity should never be called when "
120 "Contents::CanAcceptOpacity returns false.";
121}
122
123std::optional<Color> Contents::AsBackgroundColor(const Entity& entity,
124 ISize target_size) const {
125 return {};
126}
127
129 const Contents::ColorFilterProc& color_filter_proc) {
130 return false;
131}
132
133void Contents::SetCoverageHint(std::optional<Rect> coverage_hint) {
134 coverage_hint_ = coverage_hint;
135}
136
137const std::optional<Rect>& Contents::GetCoverageHint() const {
138 return coverage_hint_;
139}
140
141std::optional<Size> Contents::GetColorSourceSize() const {
142 return color_source_size_;
143};
144
146 color_source_size_ = size;
147}
148
149} // namespace impeller
const T & value() const
Definition status_or.h:77
bool ok() const
Definition status_or.h:75
static std::shared_ptr< Contents > Make(RenderProc render_proc, CoverageProc coverage_proc)
fml::StatusOr< RenderTarget > MakeSubpass(std::string_view label, ISize texture_size, const std::shared_ptr< CommandBuffer > &command_buffer, const SubpassCallback &subpass_callback, bool msaa_enabled=true, bool depth_stencil_enabled=false, int32_t mip_count=1) const
Creates a new texture of size texture_size and calls subpass_callback with a RenderPass for drawing t...
std::shared_ptr< Context > GetContext() const
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:123
virtual std::optional< Rect > GetCoverage(const Entity &entity) const =0
Get the area of the render pass that will be affected when this contents is rendered.
std::optional< Size > GetColorSourceSize() const
Return the color source's intrinsic size, if available.
Definition contents.cc:141
virtual bool ApplyColorFilter(const ColorFilterProc &color_filter_proc)
If possible, applies a color filter to this contents inputs on the CPU.
Definition contents.cc:128
const std::optional< Rect > & GetCoverageHint() const
Definition contents.cc:137
virtual bool IsOpaque(const Matrix &transform) const
Whether this Contents only emits opaque source colors from the fragment stage. This value does not ac...
Definition contents.cc:52
virtual std::optional< Snapshot > RenderToSnapshot(const ContentContext &renderer, const Entity &entity, const SnapshotOptions &options) const
Render this contents to a snapshot, respecting the entity's transform, path, clip depth,...
Definition contents.cc:56
void SetColorSourceSize(Size size)
Definition contents.cc:145
std::function< std::optional< Rect >(const Entity &entity)> CoverageProc
Definition contents.h:40
virtual void SetInheritedOpacity(Scalar opacity)
Inherit the provided opacity.
Definition contents.cc:118
static std::shared_ptr< Contents > MakeAnonymous(RenderProc render_proc, CoverageProc coverage_proc)
Definition contents.cc:41
std::function< Color(Color)> ColorFilterProc
Definition contents.h:35
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:133
std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)> RenderProc
Definition contents.h:39
BlendMode GetBlendMode() const
Definition entity.cc:101
Render passes encode render commands directed as one specific render target into an underlying comman...
Definition render_pass.h:30
SampleCount GetSampleCount() const
The sample count of the attached render target.
PixelFormat GetRenderTargetPixelFormat() const
The pixel format of the attached render target.
bool HasStencilAttachment() const
Whether the render target has an stencil attachment.
bool HasDepthAttachment() const
Whether the render target has a depth attachment.
#define FML_DCHECK(condition)
Definition logging.h:122
ISize subpass_size
The output size of the down-sampling pass.
float Scalar
Definition scalar.h:19
@ kGreaterEqual
Comparison test passes if new_value >= current_value.
ContentContextOptions OptionsFromPassAndEntity(const RenderPass &pass, const Entity &entity)
Definition contents.cc:34
ContentContextOptions OptionsFromPass(const RenderPass &pass)
Definition contents.cc:19
const std::optional< SamplerDescriptor > & sampler_descriptor
Definition contents.h:87
std::optional< Rect > coverage_limit
Definition contents.h:86
A 4x4 matrix using column-major storage.
Definition matrix.h:37
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition matrix.h:95
Represents a texture and its intended draw transform/sampler configuration.
Definition snapshot.h:24
std::shared_ptr< Texture > texture
Definition snapshot.h:25
constexpr TSize Ceil() const
Definition size.h:114
#define VALIDATION_LOG
Definition validation.h:91