From c6289fad49f5aec687994af9f722ce9ee240ccbb Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Thu, 18 Jan 2024 20:26:31 +0100 Subject: [PATCH] LibWeb: Make sure painter's context is active before executing commands In the upcoming changes, the AccelGfx context will be used for WebGL, so we can no longer assume that the WebContent process has a single global context. --- .../LibWeb/Painting/PaintingCommandExecutorGPU.cpp | 7 +++++++ .../Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h | 2 ++ Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp | 2 ++ Userland/Libraries/LibWeb/Painting/RecordingPainter.h | 2 ++ 4 files changed, 13 insertions(+) diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp index 13fd5fd57a..ac39c18118 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp @@ -14,6 +14,7 @@ PaintingCommandExecutorGPU::PaintingCommandExecutorGPU(AccelGfx::Context& contex : m_target_bitmap(bitmap) , m_context(context) { + m_context.activate(); auto canvas = AccelGfx::Canvas::create(bitmap.size()); auto painter = AccelGfx::Painter::create(m_context, canvas); m_stacking_contexts.append({ .canvas = canvas, @@ -25,6 +26,7 @@ PaintingCommandExecutorGPU::PaintingCommandExecutorGPU(AccelGfx::Context& contex PaintingCommandExecutorGPU::~PaintingCommandExecutorGPU() { + m_context.activate(); VERIFY(m_stacking_contexts.size() == 1); painter().flush(m_target_bitmap); } @@ -418,6 +420,11 @@ void PaintingCommandExecutorGPU::prepare_glyph_texture(HashMap& immutable_bitmaps) { painter().update_immutable_bitmap_texture_cache(immutable_bitmaps); diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h index 008b6412cf..4623098750 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h @@ -52,6 +52,8 @@ public: virtual bool needs_prepare_glyphs_texture() const override { return true; } void prepare_glyph_texture(HashMap> const&) override; + virtual void prepare_to_execute() override; + bool needs_update_immutable_bitmap_texture_cache() const override { return true; } void update_immutable_bitmap_texture_cache(HashMap&) override; diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp index dc3b8c6c69..8b427de3e1 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp @@ -448,6 +448,8 @@ void RecordingPainter::apply_scroll_offsets(Vector const& offsets void RecordingPainter::execute(PaintingCommandExecutor& executor) { + executor.prepare_to_execute(); + if (executor.needs_prepare_glyphs_texture()) { HashMap> unique_glyphs; for (auto& command_with_scroll_id : m_painting_commands) { diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.h b/Userland/Libraries/LibWeb/Painting/RecordingPainter.h index 5499009e23..1f6e4f5a1c 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.h +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.h @@ -486,6 +486,8 @@ public: virtual bool needs_prepare_glyphs_texture() const { return false; } virtual void prepare_glyph_texture(HashMap> const& unique_glyphs) = 0; + virtual void prepare_to_execute() { } + virtual bool needs_update_immutable_bitmap_texture_cache() const = 0; virtual void update_immutable_bitmap_texture_cache(HashMap&) = 0; };