10 #include "impeller/entity/texture_fill.frag.h"
11 #include "impeller/entity/texture_fill.vert.h"
12 #include "impeller/entity/tiled_texture_fill.frag.h"
45 texture_ = std::move(texture);
50 x_tile_mode_ = x_tile_mode;
51 y_tile_mode_ = y_tile_mode;
55 sampler_descriptor_ = std::move(desc);
59 color_filter_ = std::move(color_filter);
62 std::shared_ptr<Texture> TiledTextureContents::CreateFilterTexture(
68 auto snapshot = color_filter_contents->RenderToSnapshot(
74 "TiledTextureContents Snapshot");
75 if (snapshot.has_value()) {
76 return snapshot.value().texture;
81 SamplerDescriptor TiledTextureContents::CreateDescriptor(
82 const Capabilities& capabilities)
const {
83 SamplerDescriptor descriptor = sampler_descriptor_;
86 if (width_mode.has_value()) {
87 descriptor.width_address_mode = width_mode.value();
89 if (height_mode.has_value()) {
90 descriptor.height_address_mode = height_mode.value();
95 bool TiledTextureContents::UsesEmulatedTileMode(
96 const Capabilities& capabilities)
const {
110 return texture_->IsOpaque();
116 if (texture_ ==
nullptr) {
120 using VS = TextureFillVertexShader;
121 using FS = TiledTextureFillFragmentShader;
123 const auto texture_size = texture_->GetSize();
124 if (texture_size.IsEmpty()) {
130 auto geometry_result =
GetGeometry()->GetPositionUVBuffer(
133 bool uses_emulated_tile_mode =
136 VS::FrameInfo frame_info;
137 frame_info.mvp = geometry_result.transform;
138 frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale();
142 if (uses_emulated_tile_mode) {
151 if (geometry_result.prevent_overdraw) {
155 options.primitive_type = geometry_result.type;
156 cmd.
pipeline = uses_emulated_tile_mode
161 VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
163 if (uses_emulated_tile_mode) {
164 FS::FragInfo frag_info;
165 frag_info.x_tile_mode =
static_cast<Scalar>(x_tile_mode_);
166 frag_info.y_tile_mode =
static_cast<Scalar>(y_tile_mode_);
167 FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
171 auto filtered_texture = CreateFilterTexture(renderer);
172 if (!filtered_texture) {
175 FS::BindTextureSampler(
176 cmd, filtered_texture,
177 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
180 FS::BindTextureSampler(
182 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(
190 if (geometry_result.prevent_overdraw) {
193 return restore.Render(renderer, entity, pass);
201 std::optional<Rect> coverage_limit,
202 const std::optional<SamplerDescriptor>& sampler_descriptor,
204 const std::string& label)
const {
209 .sampler_descriptor = sampler_descriptor.value_or(sampler_descriptor_),
218 sampler_descriptor.value_or(sampler_descriptor_),