mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-06 17:48:37 +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);
|
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) {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue