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);
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) {

View file

@ -30,7 +30,7 @@ TraversableNavigable::TraversableNavigable(JS::NonnullGCPtr<Page> page)
{
#ifdef AK_OS_MACOS
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_skia_backend_context = Painting::DisplayListPlayerSkia::create_metal_context(*m_metal_context);
}
@ -38,7 +38,7 @@ TraversableNavigable::TraversableNavigable(JS::NonnullGCPtr<Page> page)
#ifdef USE_VULKAN
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();
if (!maybe_vulkan_context.is_error()) {
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;
record_display_list(display_list_recorder, paint_config);
auto display_list_player_type = page().client().display_list_player_type();
if (display_list_player_type == DisplayListPlayerType::Skia) {
switch (page().client().display_list_player_type()) {
case DisplayListPlayerType::SkiaGPUIfAvailable: {
#ifdef AK_OS_MACOS
if (m_metal_context && m_skia_backend_context && is<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
// Fallback to CPU backend if GPU is not available
Painting::DisplayListPlayerSkia player(target.bitmap());
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());
display_list.execute(player);
break;
}
default:
VERIFY_NOT_REACHED();
}
}

View file

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

View file

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

View file

@ -27,13 +27,13 @@
namespace WebContent {
static bool s_use_skia_painter = false;
static PageClient::UseSkiaPainter s_use_skia_painter = PageClient::UseSkiaPainter::No;
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)
@ -732,9 +732,16 @@ void PageClient::did_get_js_console_messages(i32 start_index, Vector<ByteString>
Web::DisplayListPlayerType PageClient::display_list_player_type() const
{
if (s_use_skia_painter)
return Web::DisplayListPlayerType::Skia;
return Web::DisplayListPlayerType::CPU;
switch (s_use_skia_painter) {
case UseSkiaPainter::No:
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)

View file

@ -27,7 +27,12 @@ public:
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 bool is_ready_to_paint() const override;