Flutter Impeller
impeller::TiledTextureContents Class Referencefinal

#include <tiled_texture_contents.h>

Inheritance diagram for impeller::TiledTextureContents:
impeller::ColorSourceContents impeller::Contents

Public Types

using ColorFilterProc = std::function< std::shared_ptr< ColorFilterContents >(FilterInput::Ref)>
 
- Public Types inherited from impeller::Contents
using ColorFilterProc = std::function< Color(Color)>
 
using RenderProc = std::function< bool(const ContentContext &renderer, const Entity &entity, RenderPass &pass)>
 
using CoverageProc = std::function< std::optional< Rect >(const Entity &entity)>
 

Public Member Functions

 TiledTextureContents ()
 
 ~TiledTextureContents () override
 
bool IsOpaque () const override
 Whether this Contents only emits opaque source colors from the fragment stage. This value does not account for any entity properties (e.g. the blend mode), clips/visibility culling, or inherited opacity. More...
 
bool Render (const ContentContext &renderer, const Entity &entity, RenderPass &pass) const override
 
void SetTexture (std::shared_ptr< Texture > texture)
 
void SetTileModes (Entity::TileMode x_tile_mode, Entity::TileMode y_tile_mode)
 
void SetSamplerDescriptor (SamplerDescriptor desc)
 
void SetColorFilter (ColorFilterProc color_filter)
 Set a color filter to apply directly to this tiled texture. More...
 
std::optional< SnapshotRenderToSnapshot (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, int32_t mip_count=1, const std::string &label="Tiled Texture Snapshot") const override
 Render this contents to a snapshot, respecting the entity's transform, path, clip depth, and blend mode. The result texture size is always the size of GetCoverage(entity). More...
 
- Public Member Functions inherited from impeller::ColorSourceContents
 ColorSourceContents ()
 
 ~ColorSourceContents () override
 
void SetGeometry (std::shared_ptr< Geometry > geometry)
 Set the geometry that this contents will use to render. More...
 
const std::shared_ptr< Geometry > & GetGeometry () const
 Get the geometry that this contents will use to render. More...
 
void SetEffectTransform (Matrix matrix)
 Set the effect transform for this color source. More...
 
const MatrixGetInverseEffectTransform () const
 Set the inverted effect transform for this color source. More...
 
void SetOpacityFactor (Scalar opacity)
 Set the opacity factor for this color source. More...
 
Scalar GetOpacityFactor () const
 Get the opacity factor for this color source. More...
 
virtual bool IsSolidColor () const
 
std::optional< RectGetCoverage (const Entity &entity) const override
 Get the area of the render pass that will be affected when this contents is rendered. More...
 
bool CanInheritOpacity (const Entity &entity) const override
 Whether or not this contents can accept the opacity peephole optimization. More...
 
void SetInheritedOpacity (Scalar opacity) override
 Inherit the provided opacity. More...
 
- Public Member Functions inherited from impeller::Contents
 Contents ()
 
virtual ~Contents ()
 
virtual void PopulateGlyphAtlas (const std::shared_ptr< LazyGlyphAtlas > &lazy_glyph_atlas, Scalar scale)
 Add any text data to the specified lazy atlas. The scale parameter must be used again later when drawing the text. More...
 
void SetCoverageHint (std::optional< Rect > coverage_hint)
 Hint that specifies the coverage area of this Contents that will actually be used during rendering. This is for optimization purposes only and can not be relied on as a clip. May optionally affect the result of GetCoverage(). More...
 
const std::optional< Rect > & GetCoverageHint () const
 
virtual ClipCoverage GetClipCoverage (const Entity &entity, const std::optional< Rect > &current_clip_coverage) const
 Given the current pass space bounding rectangle of the clip buffer, return the expected clip coverage after this draw call. This should only be implemented for contents that may write to the clip buffer. More...
 
virtual bool ShouldRender (const Entity &entity, const std::optional< Rect > clip_coverage) const
 
std::optional< SizeGetColorSourceSize () const
 Return the color source's intrinsic size, if available. More...
 
void SetColorSourceSize (Size size)
 
virtual std::optional< ColorAsBackgroundColor (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 the "Source" color that will be used for the Entity's blend operation. More...
 
virtual const FilterContentsAsFilter () const
 Cast to a filter. Returns nullptr if this Contents is not a filter. More...
 
virtual bool ApplyColorFilter (const ColorFilterProc &color_filter_proc)
 If possible, applies a color filter to this contents inputs on the CPU. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from impeller::Contents
static std::shared_ptr< ContentsMakeAnonymous (RenderProc render_proc, CoverageProc coverage_proc)
 
- Protected Types inherited from impeller::ColorSourceContents
using BindFragmentCallback = std::function< bool(RenderPass &pass)>
 
using PipelineBuilderMethod = std::shared_ptr< Pipeline< PipelineDescriptor > >(impeller::ContentContext::*)(ContentContextOptions) const
 
using PipelineBuilderCallback = std::function< std::shared_ptr< Pipeline< PipelineDescriptor > >(ContentContextOptions)>
 
using CreateGeometryCallback = std::function< GeometryResult(const ContentContext &renderer, const Entity &entity, RenderPass &pass, const Geometry &geom)>
 
- Protected Member Functions inherited from impeller::ColorSourceContents
template<typename VertexShaderT >
bool DrawGeometry (const ContentContext &renderer, const Entity &entity, RenderPass &pass, const PipelineBuilderCallback &pipeline_callback, typename VertexShaderT::FrameInfo frame_info, const BindFragmentCallback &bind_fragment_callback, bool force_stencil=false, const CreateGeometryCallback &create_geom_callback=DefaultCreateGeometryCallback) const
 
- Static Protected Member Functions inherited from impeller::ColorSourceContents
static GeometryResult DefaultCreateGeometryCallback (const ContentContext &renderer, const Entity &entity, RenderPass &pass, const Geometry &geom)
 

Detailed Description

Definition at line 21 of file tiled_texture_contents.h.

Member Typedef Documentation

◆ ColorFilterProc

Definition at line 28 of file tiled_texture_contents.h.

Constructor & Destructor Documentation

◆ TiledTextureContents()

impeller::TiledTextureContents::TiledTextureContents ( )
default

◆ ~TiledTextureContents()

impeller::TiledTextureContents::~TiledTextureContents ( )
overridedefault

Member Function Documentation

◆ IsOpaque()

bool impeller::TiledTextureContents::IsOpaque ( ) const
overridevirtual

Whether this Contents only emits opaque source colors from the fragment stage. This value does not account for any entity properties (e.g. the blend mode), clips/visibility culling, or inherited opacity.

Reimplemented from impeller::Contents.

Definition at line 99 of file tiled_texture_contents.cc.

99  {
100  if (GetOpacityFactor() < 1 || x_tile_mode_ == Entity::TileMode::kDecal ||
101  y_tile_mode_ == Entity::TileMode::kDecal) {
102  return false;
103  }
104  if (color_filter_) {
105  return false;
106  }
107  return texture_->IsOpaque();
108 }

References impeller::ColorSourceContents::GetOpacityFactor(), and impeller::Entity::kDecal.

Referenced by impeller::testing::TEST_P().

◆ Render()

bool impeller::TiledTextureContents::Render ( const ContentContext renderer,
const Entity entity,
RenderPass pass 
) const
overridevirtual

Implements impeller::Contents.

Definition at line 110 of file tiled_texture_contents.cc.

112  {
113  if (texture_ == nullptr) {
114  return true;
115  }
116 
117  using VS = TextureUvFillVertexShader;
118  using FS = TiledTextureFillFragmentShader;
119  using FSExternal = TiledTextureFillExternalFragmentShader;
120 
121  const auto texture_size = texture_->GetSize();
122  if (texture_size.IsEmpty()) {
123  return true;
124  }
125 
126  bool is_external_texture =
127  texture_->GetTextureDescriptor().type == TextureType::kTextureExternalOES;
128 
129  VS::FrameInfo frame_info;
130  frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
131  frame_info.uv_transform =
132  Rect::MakeSize(texture_size).GetNormalizingTransform() *
134 
135  PipelineBuilderMethod pipeline_method;
136 
137 #ifdef IMPELLER_ENABLE_OPENGLES
138  if (is_external_texture) {
139  pipeline_method = &ContentContext::GetTiledTextureExternalPipeline;
140  } else {
141  pipeline_method = &ContentContext::GetTiledTexturePipeline;
142  }
143 #else
144  pipeline_method = &ContentContext::GetTiledTexturePipeline;
145 #endif // IMPELLER_ENABLE_OPENGLES
146 
147  PipelineBuilderCallback pipeline_callback =
148  [&renderer, &pipeline_method](ContentContextOptions options) {
149  return (renderer.*pipeline_method)(options);
150  };
151  return ColorSourceContents::DrawGeometry<VS>(
152  renderer, entity, pass, pipeline_callback, frame_info,
153  [this, &renderer, &is_external_texture, &entity](RenderPass& pass) {
154  auto& host_buffer = renderer.GetTransientsBuffer();
155 
156  pass.SetCommandLabel("TextureFill");
157 
158  if (is_external_texture) {
159  FSExternal::FragInfo frag_info;
160  frag_info.x_tile_mode = static_cast<Scalar>(x_tile_mode_);
161  frag_info.y_tile_mode = static_cast<Scalar>(y_tile_mode_);
162  frag_info.alpha =
163  GetOpacityFactor() * GetGeometry()->ComputeAlphaCoverage(entity);
164  FSExternal::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
165  } else {
166  FS::FragInfo frag_info;
167  frag_info.x_tile_mode = static_cast<Scalar>(x_tile_mode_);
168  frag_info.y_tile_mode = static_cast<Scalar>(y_tile_mode_);
169  frag_info.alpha =
170  GetOpacityFactor() * GetGeometry()->ComputeAlphaCoverage(entity);
171  FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
172  }
173 
174  if (is_external_texture) {
175  SamplerDescriptor sampler_desc;
176  // OES_EGL_image_external states that only CLAMP_TO_EDGE is valid, so
177  // we emulate all other tile modes here by remapping the texture
178  // coordinates.
179  sampler_desc.width_address_mode = SamplerAddressMode::kClampToEdge;
180  sampler_desc.height_address_mode = SamplerAddressMode::kClampToEdge;
181 
182  // Also, external textures cannot be bound to color filters, so ignore
183  // this case for now.
184  FML_DCHECK(!color_filter_) << "Color filters are not currently "
185  "supported for external textures.";
186 
187  FSExternal::BindSAMPLEREXTERNALOESTextureSampler(
188  pass, texture_,
189  renderer.GetContext()->GetSamplerLibrary()->GetSampler(
190  sampler_desc));
191  } else {
192  if (color_filter_) {
193  auto filtered_texture = CreateFilterTexture(renderer);
194  if (!filtered_texture) {
195  return false;
196  }
197  FS::BindTextureSampler(
198  pass, filtered_texture,
199  renderer.GetContext()->GetSamplerLibrary()->GetSampler(
200  CreateSamplerDescriptor(renderer.GetDeviceCapabilities())));
201  } else {
202  FS::BindTextureSampler(
203  pass, texture_,
204  renderer.GetContext()->GetSamplerLibrary()->GetSampler(
205  CreateSamplerDescriptor(renderer.GetDeviceCapabilities())));
206  }
207  }
208 
209  return true;
210  });
211 }

References impeller::ContentContext::GetContext(), impeller::ContentContext::GetDeviceCapabilities(), impeller::ColorSourceContents::GetGeometry(), impeller::ColorSourceContents::GetInverseEffectTransform(), impeller::TRect< T >::GetNormalizingTransform(), impeller::ColorSourceContents::GetOpacityFactor(), impeller::ContentContext::GetTiledTexturePipeline(), impeller::ContentContext::GetTransientsBuffer(), impeller::SamplerDescriptor::height_address_mode, impeller::kClampToEdge, impeller::kTextureExternalOES, impeller::TRect< Scalar >::MakeSize(), impeller::RenderPass::SetCommandLabel(), and impeller::SamplerDescriptor::width_address_mode.

Referenced by impeller::SceneContents::Render(), and impeller::testing::TEST_P().

◆ RenderToSnapshot()

std::optional< Snapshot > impeller::TiledTextureContents::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,
int32_t  mip_count = 1,
const std::string &  label = "Tiled Texture Snapshot" 
) const
overridevirtual

Render this contents to a snapshot, respecting the entity's transform, path, clip depth, and blend mode. The result texture size is always the size of GetCoverage(entity).

Reimplemented from impeller::Contents.

Definition at line 213 of file tiled_texture_contents.cc.

220  {
221  std::optional<Rect> geometry_coverage = GetGeometry()->GetCoverage({});
222  if (GetInverseEffectTransform().IsIdentity() &&
223  GetGeometry()->IsAxisAlignedRect() &&
224  (!geometry_coverage.has_value() ||
225  Rect::MakeSize(texture_->GetSize())
226  .Contains(geometry_coverage.value()))) {
227  auto coverage = GetCoverage(entity);
228  if (!coverage.has_value()) {
229  return std::nullopt;
230  }
231  auto scale = Vector2(coverage->GetSize() / Size(texture_->GetSize()));
232 
233  return Snapshot{
234  .texture = texture_,
235  .transform = Matrix::MakeTranslation(coverage->GetOrigin()) *
237  .sampler_descriptor = sampler_descriptor.value_or(sampler_descriptor_),
238  .opacity = GetOpacityFactor(),
239  };
240  }
241 
243  renderer, // renderer
244  entity, // entity
245  std::nullopt, // coverage_limit
246  sampler_descriptor.value_or(sampler_descriptor_), // sampler_descriptor
247  true, // msaa_enabled
248  /*mip_count=*/1,
249  label); // label
250 }

References impeller::TRect< T >::Contains(), impeller::ColorSourceContents::GetCoverage(), impeller::ColorSourceContents::GetGeometry(), impeller::ColorSourceContents::GetInverseEffectTransform(), impeller::ColorSourceContents::GetOpacityFactor(), impeller::Matrix::MakeScale(), impeller::TRect< Scalar >::MakeSize(), impeller::Matrix::MakeTranslation(), impeller::Contents::RenderToSnapshot(), scale, and impeller::Snapshot::texture.

◆ SetColorFilter()

void impeller::TiledTextureContents::SetColorFilter ( ColorFilterProc  color_filter)

Set a color filter to apply directly to this tiled texture.

Parameters
color_filterWhen applying a color filter to a tiled texture, we can reduce the size and number of the subpasses required and the shader workload by applying the filter to the untiled image and absorbing the opacity before tiling it into the final location.

This may not be a performance improvement if the image is tiled into a much smaller size that its original texture size.

Definition at line 54 of file tiled_texture_contents.cc.

54  {
55  color_filter_ = std::move(color_filter);
56 }

◆ SetSamplerDescriptor()

void impeller::TiledTextureContents::SetSamplerDescriptor ( SamplerDescriptor  desc)

Definition at line 50 of file tiled_texture_contents.cc.

50  {
51  sampler_descriptor_ = std::move(desc);
52 }

◆ SetTexture()

void impeller::TiledTextureContents::SetTexture ( std::shared_ptr< Texture texture)

Definition at line 40 of file tiled_texture_contents.cc.

40  {
41  texture_ = std::move(texture);
42 }

Referenced by impeller::SceneContents::Render(), and impeller::testing::TEST_P().

◆ SetTileModes()

void impeller::TiledTextureContents::SetTileModes ( Entity::TileMode  x_tile_mode,
Entity::TileMode  y_tile_mode 
)

Definition at line 44 of file tiled_texture_contents.cc.

45  {
46  x_tile_mode_ = x_tile_mode;
47  y_tile_mode_ = y_tile_mode;
48 }

The documentation for this class was generated from the following files:
impeller::TextureType::kTextureExternalOES
@ kTextureExternalOES
impeller::ColorSourceContents::PipelineBuilderCallback
std::function< std::shared_ptr< Pipeline< PipelineDescriptor > >(ContentContextOptions)> PipelineBuilderCallback
Definition: color_source_contents.h:114
impeller::ColorSourceContents::GetOpacityFactor
Scalar GetOpacityFactor() const
Get the opacity factor for this color source.
Definition: color_source_contents.cc:28
impeller::Scalar
float Scalar
Definition: scalar.h:18
impeller::Entity::TileMode::kDecal
@ kDecal
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, int32_t mip_count=1, const std::string &label="Snapshot") const
Render this contents to a snapshot, respecting the entity's transform, path, clip depth,...
Definition: contents.cc:63
impeller::Vector2
Point Vector2
Definition: point.h:326
impeller::TRect::GetNormalizingTransform
constexpr Matrix GetNormalizingTransform() const
Constructs a Matrix that will map all points in the coordinate space of the rectangle into a new norm...
Definition: rect.h:482
impeller::ColorSourceContents::GetGeometry
const std::shared_ptr< Geometry > & GetGeometry() const
Get the geometry that this contents will use to render.
Definition: color_source_contents.cc:20
impeller::ContentContext::GetTiledTexturePipeline
std::shared_ptr< Pipeline< PipelineDescriptor > > GetTiledTexturePipeline(ContentContextOptions opts) const
Definition: content_context.h:461
impeller::SamplerAddressMode::kClampToEdge
@ kClampToEdge
impeller::Size
TSize< Scalar > Size
Definition: size.h:137
impeller::Matrix::MakeTranslation
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
impeller::VS
SolidFillVertexShader VS
Definition: stroke_path_geometry.cc:16
impeller::TRect::Contains
constexpr bool Contains(const TPoint< Type > &p) const
Returns true iff the provided point |p| is inside the half-open interior of this rectangle.
Definition: rect.h:221
impeller::ColorSourceContents::PipelineBuilderMethod
std::shared_ptr< Pipeline< PipelineDescriptor > >(impeller::ContentContext::*)(ContentContextOptions) const PipelineBuilderMethod
Definition: color_source_contents.h:111
impeller::ColorSourceContents::GetCoverage
std::optional< Rect > GetCoverage(const Entity &entity) const override
Get the area of the render pass that will be affected when this contents is rendered.
Definition: color_source_contents.cc:44
impeller::TRect< Scalar >::MakeSize
constexpr static TRect MakeSize(const TSize< U > &size)
Definition: rect.h:146
scale
const Scalar scale
Definition: stroke_path_geometry.cc:308
impeller::Matrix::MakeScale
static constexpr Matrix MakeScale(const Vector3 &s)
Definition: matrix.h:104
impeller::ColorSourceContents::GetInverseEffectTransform
const Matrix & GetInverseEffectTransform() const
Set the inverted effect transform for this color source.
Definition: color_source_contents.cc:36