Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit fe6f22c

Browse files
Revert "[Impeller] reuse texture if size and type matches (#37527)" (#37727)
This reverts commit 9500d8c.
1 parent 49b52db commit fe6f22c

File tree

2 files changed

+18
-65
lines changed

2 files changed

+18
-65
lines changed

impeller/typographer/backends/skia/text_render_context_skia.cc

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -297,40 +297,34 @@ static std::shared_ptr<SkBitmap> CreateAtlasBitmap(const GlyphAtlas& atlas,
297297
return bitmap;
298298
}
299299

300-
static std::shared_ptr<Texture> CreateGlyphTextureAtlas(
300+
static std::shared_ptr<Texture> UploadGlyphTextureAtlas(
301301
const std::shared_ptr<Allocator>& allocator,
302+
std::shared_ptr<SkBitmap> bitmap,
302303
const ISize& atlas_size,
303304
PixelFormat format) {
304305
TRACE_EVENT0("impeller", __FUNCTION__);
305306
if (!allocator) {
306307
return nullptr;
307308
}
308309

310+
FML_DCHECK(bitmap != nullptr);
311+
const auto& pixmap = bitmap->pixmap();
312+
309313
TextureDescriptor texture_descriptor;
310314
texture_descriptor.storage_mode = StorageMode::kHostVisible;
311315
texture_descriptor.format = format;
312316
texture_descriptor.size = atlas_size;
313317

318+
if (pixmap.rowBytes() * pixmap.height() !=
319+
texture_descriptor.GetByteSizeOfBaseMipLevel()) {
320+
return nullptr;
321+
}
322+
314323
auto texture = allocator->CreateTexture(texture_descriptor);
315324
if (!texture || !texture->IsValid()) {
316325
return nullptr;
317326
}
318327
texture->SetLabel("GlyphAtlas");
319-
return texture;
320-
}
321-
322-
bool UploadGlyphTextureAtlas(const std::shared_ptr<Texture>& texture,
323-
std::shared_ptr<SkBitmap> bitmap) {
324-
TRACE_EVENT0("impeller", __FUNCTION__);
325-
326-
FML_DCHECK(bitmap != nullptr);
327-
const auto& pixmap = bitmap->pixmap();
328-
329-
auto texture_descriptor = texture->GetTextureDescriptor();
330-
if (pixmap.rowBytes() * pixmap.height() !=
331-
texture_descriptor.GetByteSizeOfBaseMipLevel()) {
332-
return false;
333-
}
334328

335329
auto mapping = std::make_shared<fml::NonOwnedMapping>(
336330
reinterpret_cast<const uint8_t*>(bitmap->getAddr(0, 0)), // data
@@ -339,9 +333,9 @@ bool UploadGlyphTextureAtlas(const std::shared_ptr<Texture>& texture,
339333
);
340334

341335
if (!texture->SetContents(mapping)) {
342-
return false;
336+
return nullptr;
343337
}
344-
return true;
338+
return texture;
345339
}
346340

347341
std::shared_ptr<GlyphAtlas> TextRenderContextSkia::CreateGlyphAtlas(
@@ -427,29 +421,16 @@ std::shared_ptr<GlyphAtlas> TextRenderContextSkia::CreateGlyphAtlas(
427421
format = PixelFormat::kR8G8B8A8UNormInt;
428422
break;
429423
}
424+
auto texture = UploadGlyphTextureAtlas(GetContext()->GetResourceAllocator(),
425+
bitmap, atlas_size, format);
426+
if (!texture) {
427+
return nullptr;
428+
}
430429

431430
// ---------------------------------------------------------------------------
432431
// Step 8: Record the texture in the glyph atlas.
433-
//
434-
// If the last_texture is the same size and type, reuse this instead of
435-
// creating a new texture.
436432
// ---------------------------------------------------------------------------
437-
auto old_texture = last_atlas->GetTexture();
438-
if (old_texture != nullptr &&
439-
old_texture->GetTextureDescriptor().size == atlas_size &&
440-
old_texture->GetTextureDescriptor().format == format) {
441-
if (!UploadGlyphTextureAtlas(old_texture, bitmap)) {
442-
return nullptr;
443-
}
444-
glyph_atlas->SetTexture(std::move(old_texture));
445-
} else {
446-
auto texture = CreateGlyphTextureAtlas(GetContext()->GetResourceAllocator(),
447-
atlas_size, format);
448-
if (!texture || !UploadGlyphTextureAtlas(texture, bitmap)) {
449-
return nullptr;
450-
}
451-
glyph_atlas->SetTexture(std::move(texture));
452-
}
433+
glyph_atlas->SetTexture(std::move(texture));
453434

454435
return glyph_atlas;
455436
}

impeller/typographer/typographer_unittests.cc

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -137,34 +137,6 @@ TEST_P(TypographerTest, GlyphAtlasIsRecycledIfUnchanged) {
137137
ASSERT_EQ(atlas_context->GetGlyphAtlas(), atlas);
138138
}
139139

140-
TEST_P(TypographerTest, GlyphAtlasTextureIsRecycledIfUnchanged) {
141-
auto context = TextRenderContext::Create(GetContext());
142-
auto atlas_context = std::make_shared<GlyphAtlasContext>();
143-
ASSERT_TRUE(context && context->IsValid());
144-
SkFont sk_font;
145-
auto blob = SkTextBlob::MakeFromString("spooky skellingtons", sk_font);
146-
ASSERT_TRUE(blob);
147-
auto atlas =
148-
context->CreateGlyphAtlas(GlyphAtlas::Type::kAlphaBitmap, atlas_context,
149-
TextFrameFromTextBlob(blob));
150-
ASSERT_NE(atlas, nullptr);
151-
ASSERT_NE(atlas->GetTexture(), nullptr);
152-
ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
153-
154-
auto* first_texture = atlas->GetTexture().get();
155-
156-
// now create a new glyph atlas with a nearly identical blob.
157-
158-
auto blob2 = SkTextBlob::MakeFromString("spooky skellington2", sk_font);
159-
auto next_atlas =
160-
context->CreateGlyphAtlas(GlyphAtlas::Type::kAlphaBitmap, atlas_context,
161-
TextFrameFromTextBlob(blob2));
162-
ASSERT_NE(atlas, next_atlas);
163-
auto* second_texture = next_atlas->GetTexture().get();
164-
165-
ASSERT_EQ(second_texture, first_texture);
166-
}
167-
168140
TEST_P(TypographerTest, GlyphAtlasWithLotsOfdUniqueGlyphSize) {
169141
auto context = TextRenderContext::Create(GetContext());
170142
auto atlas_context = std::make_shared<GlyphAtlasContext>();

0 commit comments

Comments
 (0)