Ladybird+LibWeb+WebContent: Always use Skia CPU backend in tests mode

Enforce the use of the CPU backend in test mode to ensure that ref-tests
produce consistent results across different computers, as this
consistency cannot be achieved with the GPU backend.
This commit is contained in:
Aliaksandr Kalenik 2024-07-17 14:13:32 +03:00 committed by Alexander Kalenik
commit 3ddacaa705
Notes: sideshowbarker 2024-07-18 02:44:45 +09:00
6 changed files with 42 additions and 15 deletions

View file

@ -135,7 +135,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
Web::set_chrome_process_executable_path(executable_path); Web::set_chrome_process_executable_path(executable_path);
if (use_skia_painter) { if (use_skia_painter) {
WebContent::PageClient::set_use_skia_painter(); // Always use the CPU backend for layout tests, as the GPU backend is not deterministic
WebContent::PageClient::set_use_skia_painter(is_layout_test_mode ? WebContent::PageClient::UseSkiaPainter::CPUBackend : WebContent::PageClient::UseSkiaPainter::GPUBackendIfAvailable);
} }
if (enable_http_cache) { if (enable_http_cache) {

View file

@ -30,7 +30,7 @@ TraversableNavigable::TraversableNavigable(JS::NonnullGCPtr<Page> page)
{ {
#ifdef AK_OS_MACOS #ifdef AK_OS_MACOS
auto display_list_player_type = page->client().display_list_player_type(); auto display_list_player_type = page->client().display_list_player_type();
if (display_list_player_type == DisplayListPlayerType::Skia) { if (display_list_player_type == DisplayListPlayerType::SkiaGPUIfAvailable) {
m_metal_context = Core::get_metal_context(); m_metal_context = Core::get_metal_context();
m_skia_backend_context = Painting::DisplayListPlayerSkia::create_metal_context(*m_metal_context); m_skia_backend_context = Painting::DisplayListPlayerSkia::create_metal_context(*m_metal_context);
} }
@ -38,7 +38,7 @@ TraversableNavigable::TraversableNavigable(JS::NonnullGCPtr<Page> page)
#ifdef USE_VULKAN #ifdef USE_VULKAN
auto display_list_player_type = page->client().display_list_player_type(); auto display_list_player_type = page->client().display_list_player_type();
if (display_list_player_type == DisplayListPlayerType::Skia) { if (display_list_player_type == DisplayListPlayerType::SkiaGPUIfAvailable) {
auto maybe_vulkan_context = Core::create_vulkan_context(); auto maybe_vulkan_context = Core::create_vulkan_context();
if (!maybe_vulkan_context.is_error()) { if (!maybe_vulkan_context.is_error()) {
auto vulkan_context = maybe_vulkan_context.release_value(); auto vulkan_context = maybe_vulkan_context.release_value();
@ -1203,8 +1203,8 @@ void TraversableNavigable::paint(DevicePixelRect const& content_rect, Painting::
paint_config.has_focus = paint_options.has_focus; paint_config.has_focus = paint_options.has_focus;
record_display_list(display_list_recorder, paint_config); record_display_list(display_list_recorder, paint_config);
auto display_list_player_type = page().client().display_list_player_type(); switch (page().client().display_list_player_type()) {
if (display_list_player_type == DisplayListPlayerType::Skia) { case DisplayListPlayerType::SkiaGPUIfAvailable: {
#ifdef AK_OS_MACOS #ifdef AK_OS_MACOS
if (m_metal_context && m_skia_backend_context && is<Painting::IOSurfaceBackingStore>(target)) { if (m_metal_context && m_skia_backend_context && is<Painting::IOSurfaceBackingStore>(target)) {
auto& iosurface_backing_store = static_cast<Painting::IOSurfaceBackingStore&>(target); auto& iosurface_backing_store = static_cast<Painting::IOSurfaceBackingStore&>(target);
@ -1223,11 +1223,23 @@ void TraversableNavigable::paint(DevicePixelRect const& content_rect, Painting::
} }
#endif #endif
// Fallback to CPU backend if GPU is not available
Painting::DisplayListPlayerSkia player(target.bitmap()); Painting::DisplayListPlayerSkia player(target.bitmap());
display_list.execute(player); display_list.execute(player);
} else { break;
}
case DisplayListPlayerType::SkiaCPU: {
Painting::DisplayListPlayerSkia player(target.bitmap());
display_list.execute(player);
break;
}
case DisplayListPlayerType::CPU: {
Painting::DisplayListPlayerCPU player(target.bitmap()); Painting::DisplayListPlayerCPU player(target.bitmap());
display_list.execute(player); display_list.execute(player);
break;
}
default:
VERIFY_NOT_REACHED();
} }
} }

View file

@ -278,7 +278,8 @@ struct PaintOptions {
enum class DisplayListPlayerType { enum class DisplayListPlayerType {
CPU, CPU,
Skia SkiaGPUIfAvailable,
SkiaCPU,
}; };
class PageClient : public JS::Cell { class PageClient : public JS::Cell {

View file

@ -105,7 +105,8 @@ RefPtr<Gfx::Bitmap> SVGDecodedImageData::render(Gfx::IntSize size) const
display_list.execute(executor); display_list.execute(executor);
break; break;
} }
case DisplayListPlayerType::Skia: { case DisplayListPlayerType::SkiaGPUIfAvailable:
case DisplayListPlayerType::SkiaCPU: {
Painting::DisplayListPlayerSkia executor { *bitmap }; Painting::DisplayListPlayerSkia executor { *bitmap };
display_list.execute(executor); display_list.execute(executor);
break; break;

View file

@ -27,13 +27,13 @@
namespace WebContent { namespace WebContent {
static bool s_use_skia_painter = false; static PageClient::UseSkiaPainter s_use_skia_painter = PageClient::UseSkiaPainter::No;
JS_DEFINE_ALLOCATOR(PageClient); JS_DEFINE_ALLOCATOR(PageClient);
void PageClient::set_use_skia_painter() void PageClient::set_use_skia_painter(UseSkiaPainter use_skia_painter)
{ {
s_use_skia_painter = true; s_use_skia_painter = use_skia_painter;
} }
JS::NonnullGCPtr<PageClient> PageClient::create(JS::VM& vm, PageHost& page_host, u64 id) JS::NonnullGCPtr<PageClient> PageClient::create(JS::VM& vm, PageHost& page_host, u64 id)
@ -732,9 +732,16 @@ void PageClient::did_get_js_console_messages(i32 start_index, Vector<ByteString>
Web::DisplayListPlayerType PageClient::display_list_player_type() const Web::DisplayListPlayerType PageClient::display_list_player_type() const
{ {
if (s_use_skia_painter) switch (s_use_skia_painter) {
return Web::DisplayListPlayerType::Skia; case UseSkiaPainter::No:
return Web::DisplayListPlayerType::CPU; return Web::DisplayListPlayerType::CPU;
case UseSkiaPainter::GPUBackendIfAvailable:
return Web::DisplayListPlayerType::SkiaGPUIfAvailable;
case UseSkiaPainter::CPUBackend:
return Web::DisplayListPlayerType::SkiaCPU;
default:
VERIFY_NOT_REACHED();
}
} }
void PageClient::queue_screenshot_task(Optional<i32> node_id) void PageClient::queue_screenshot_task(Optional<i32> node_id)

View file

@ -27,7 +27,12 @@ public:
virtual ~PageClient() override; virtual ~PageClient() override;
static void set_use_skia_painter(); enum class UseSkiaPainter {
No,
CPUBackend,
GPUBackendIfAvailable,
};
static void set_use_skia_painter(UseSkiaPainter);
virtual void schedule_repaint() override; virtual void schedule_repaint() override;
virtual bool is_ready_to_paint() const override; virtual bool is_ready_to_paint() const override;