mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-04 08:36:12 +00:00
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:
parent
9fb44cb057
commit
3ddacaa705
Notes:
sideshowbarker
2024-07-18 02:44:45 +09:00
Author: https://github.com/kalenikaliaksandr
Commit: 3ddacaa705
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/680
6 changed files with 42 additions and 15 deletions
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -278,7 +278,8 @@ struct PaintOptions {
|
|||
|
||||
enum class DisplayListPlayerType {
|
||||
CPU,
|
||||
Skia
|
||||
SkiaGPUIfAvailable,
|
||||
SkiaCPU,
|
||||
};
|
||||
|
||||
class PageClient : public JS::Cell {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue