7 #include "fml/logging.h"
11 #include "impeller/entity/texture_fill.vert.h"
12 #include "impeller/entity/tiled_texture_fill.frag.h"
13 #include "impeller/entity/tiled_texture_fill_external.frag.h"
44 texture_ = std::move(texture);
49 x_tile_mode_ = x_tile_mode;
50 y_tile_mode_ = y_tile_mode;
54 sampler_descriptor_ = std::move(desc);
58 color_filter_ = std::move(color_filter);
61 std::shared_ptr<Texture> TiledTextureContents::CreateFilterTexture(
67 auto snapshot = color_filter_contents->RenderToSnapshot(
73 "TiledTextureContents Snapshot");
74 if (snapshot.has_value()) {
75 return snapshot.value().texture;
80 SamplerDescriptor TiledTextureContents::CreateSamplerDescriptor(
81 const Capabilities& capabilities)
const {
82 SamplerDescriptor descriptor = sampler_descriptor_;
85 if (width_mode.has_value()) {
86 descriptor.width_address_mode = width_mode.value();
88 if (height_mode.has_value()) {
89 descriptor.height_address_mode = height_mode.value();
94 bool TiledTextureContents::UsesEmulatedTileMode(
95 const Capabilities& capabilities)
const {
109 return texture_->IsOpaque();
115 if (texture_ ==
nullptr) {
119 using VS = TextureFillVertexShader;
120 using FS = TiledTextureFillFragmentShader;
121 using FSExternal = TiledTextureFillExternalFragmentShader;
123 const auto texture_size = texture_->GetSize();
124 if (texture_size.IsEmpty()) {
128 bool is_external_texture =
133 auto geometry_result =
GetGeometry()->GetPositionUVBuffer(
136 bool uses_emulated_tile_mode =
139 VS::FrameInfo frame_info;
140 frame_info.mvp = geometry_result.transform;
141 frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
145 if (uses_emulated_tile_mode) {
154 if (geometry_result.prevent_overdraw) {
158 options.primitive_type = geometry_result.type;
160 #ifdef IMPELLER_ENABLE_OPENGLES
161 if (is_external_texture) {
162 cmd.
pipeline = renderer.GetTiledTextureExternalPipeline(options);
164 cmd.
pipeline = uses_emulated_tile_mode
169 cmd.
pipeline = uses_emulated_tile_mode
172 #endif // IMPELLER_ENABLE_OPENGLES
174 cmd.
BindVertices(std::move(geometry_result.vertex_buffer));
175 VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
177 if (is_external_texture) {
178 FSExternal::FragInfo frag_info;
179 frag_info.x_tile_mode =
static_cast<Scalar>(x_tile_mode_);
180 frag_info.y_tile_mode =
static_cast<Scalar>(y_tile_mode_);
181 FSExternal::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
182 }
else if (uses_emulated_tile_mode) {
183 FS::FragInfo frag_info;
184 frag_info.x_tile_mode =
static_cast<Scalar>(x_tile_mode_);
185 frag_info.y_tile_mode =
static_cast<Scalar>(y_tile_mode_);
186 FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
189 if (is_external_texture) {
198 FML_DCHECK(!color_filter_)
199 <<
"Color filters are not currently supported for external textures.";
201 FSExternal::BindSAMPLEREXTERNALOESTextureSampler(
203 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
206 auto filtered_texture = CreateFilterTexture(renderer);
207 if (!filtered_texture) {
210 FS::BindTextureSampler(
211 cmd, filtered_texture,
212 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
215 FS::BindTextureSampler(
217 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
226 if (geometry_result.prevent_overdraw) {
229 return restore.Render(renderer, entity, pass);
237 std::optional<Rect> coverage_limit,
238 const std::optional<SamplerDescriptor>& sampler_descriptor,
240 const std::string& label)
const {
244 if (!coverage.has_value()) {
247 auto scale =
Vector2(coverage->GetSize() /
Size(texture_->GetSize()));
253 .sampler_descriptor = sampler_descriptor.value_or(sampler_descriptor_),
262 sampler_descriptor.value_or(sampler_descriptor_),