7 #include "fml/logging.h"
9 #include "impeller/entity/texture_fill.vert.h"
10 #include "impeller/entity/tiled_texture_fill.frag.h"
11 #include "impeller/entity/tiled_texture_fill_external.frag.h"
42 texture_ = std::move(texture);
47 x_tile_mode_ = x_tile_mode;
48 y_tile_mode_ = y_tile_mode;
52 sampler_descriptor_ = std::move(desc);
56 color_filter_ = std::move(color_filter);
59 std::shared_ptr<Texture> TiledTextureContents::CreateFilterTexture(
65 auto snapshot = color_filter_contents->RenderToSnapshot(
72 "TiledTextureContents Snapshot");
73 if (snapshot.has_value()) {
74 return snapshot.value().texture;
79 SamplerDescriptor TiledTextureContents::CreateSamplerDescriptor(
80 const Capabilities& capabilities)
const {
81 SamplerDescriptor descriptor = sampler_descriptor_;
84 if (width_mode.has_value()) {
85 descriptor.width_address_mode = width_mode.value();
87 if (height_mode.has_value()) {
88 descriptor.height_address_mode = height_mode.value();
93 bool TiledTextureContents::UsesEmulatedTileMode(
94 const Capabilities& capabilities)
const {
108 return texture_->IsOpaque();
114 if (texture_ ==
nullptr) {
118 using VS = TextureFillVertexShader;
119 using FS = TiledTextureFillFragmentShader;
120 using FSExternal = TiledTextureFillExternalFragmentShader;
122 const auto texture_size = texture_->GetSize();
123 if (texture_size.IsEmpty()) {
127 bool is_external_texture =
130 bool uses_emulated_tile_mode =
133 VS::FrameInfo frame_info;
134 frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
139 #ifdef IMPELLER_ENABLE_OPENGLES
140 if (is_external_texture) {
141 pipeline_method = &ContentContext::GetTiledTextureExternalPipeline;
143 pipeline_method = uses_emulated_tile_mode
148 pipeline_method = uses_emulated_tile_mode
151 #endif // IMPELLER_ENABLE_OPENGLES
155 return (renderer.*pipeline_method)(options);
157 return ColorSourceContents::DrawGeometry<VS>(
158 renderer, entity, pass, pipeline_callback, frame_info,
159 [
this, &renderer, &is_external_texture,
163 if (uses_emulated_tile_mode) {
169 if (is_external_texture) {
170 FSExternal::FragInfo frag_info;
171 frag_info.x_tile_mode =
static_cast<Scalar>(x_tile_mode_);
172 frag_info.y_tile_mode =
static_cast<Scalar>(y_tile_mode_);
173 FSExternal::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
174 }
else if (uses_emulated_tile_mode) {
175 FS::FragInfo frag_info;
176 frag_info.x_tile_mode =
static_cast<Scalar>(x_tile_mode_);
177 frag_info.y_tile_mode =
static_cast<Scalar>(y_tile_mode_);
178 FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info));
181 if (is_external_texture) {
191 FML_DCHECK(!color_filter_) <<
"Color filters are not currently "
192 "supported for external textures.";
194 FSExternal::BindSAMPLEREXTERNALOESTextureSampler(
196 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
200 auto filtered_texture = CreateFilterTexture(renderer);
201 if (!filtered_texture) {
204 FS::BindTextureSampler(
205 pass, filtered_texture,
206 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
209 FS::BindTextureSampler(
211 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
226 std::optional<Rect> coverage_limit,
227 const std::optional<SamplerDescriptor>& sampler_descriptor,
230 const std::string& label)
const {
231 std::optional<Rect> geometry_coverage =
GetGeometry()->GetCoverage({});
234 (!geometry_coverage.has_value() ||
236 .
Contains(geometry_coverage.value()))) {
238 if (!coverage.has_value()) {
247 .sampler_descriptor = sampler_descriptor.value_or(sampler_descriptor_),
256 sampler_descriptor.value_or(sampler_descriptor_),