Skip to content

Commit

Permalink
LibWeb: Skip large stacking context in gpu painter only if it allocates
Browse files Browse the repository at this point in the history
Skipping all stacking contexts with a size larger than 10000px in one
dimension was a mistake because it also affects pages that are simply
tall due to having a lot of content. Instead, we only need to skip if
the stacking context requires the allocation of a framebuffer that
could possibly fail.

Fixes SerenityOS#23397
  • Loading branch information
kalenikaliaksandr authored and awesomekling committed Mar 2, 2024
1 parent d8e8293 commit 1bd20a4
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,6 @@ CommandResult CommandExecutorGPU::push_stacking_context(float opacity, bool is_f
if (source_paintable_rect.is_empty())
return CommandResult::SkipStackingContext;

// If, due to layout mistakes, we encounter an excessively large rectangle here, it must be skipped to prevent
// framebuffer allocation failure.
if (source_paintable_rect.width() > 10000 || source_paintable_rect.height() > 10000) {
dbgln("FIXME: Skipping stacking context with excessively large paintable rect: {}", source_paintable_rect);
return CommandResult::SkipStackingContext;
}

m_stacking_contexts.last().stacking_context_depth++;
painter().save();
if (is_fixed_position) {
Expand All @@ -128,6 +121,13 @@ CommandResult CommandExecutorGPU::push_stacking_context(float opacity, bool is_f
final_transform.multiply(stacking_context_transform);
final_transform.multiply(inverse_origin_translation);
if (opacity < 1 || !stacking_context_transform.is_identity_or_translation()) {
// If, due to layout mistakes, we encounter an excessively large rectangle here, it must be skipped to prevent
// framebuffer allocation failure.
if (source_paintable_rect.width() > 10000 || source_paintable_rect.height() > 10000) {
dbgln("FIXME: Skipping stacking context with excessively large paintable rect: {}", source_paintable_rect);
return CommandResult::SkipStackingContext;
}

auto canvas = AccelGfx::Canvas::create(source_paintable_rect.size());
auto painter = AccelGfx::Painter::create(m_context, canvas);
painter->translate(-source_paintable_rect.location().to_type<float>());
Expand Down

0 comments on commit 1bd20a4

Please sign in to comment.