Here’s the WIP patch I came up with for wayland_server to improve efficiency with Iceweasel; however the invalidation code doesn’t work quite right:
From 7264d6e283cccc5003321552d96f90ef9ad2782f Mon Sep 17 00:00:00 2001
From: waddlesplash <waddlesplash@gmail.com>
Date: Tue, 10 Dec 2024 15:30:51 -0500
Subject: [PATCH] WIP (doesn't work right): efficiency improvements.
---
HaikuCompositor.cpp | 15 ++++++++++-----
HaikuSubcompositor.cpp | 5 ++++-
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/HaikuCompositor.cpp b/HaikuCompositor.cpp
index 3ea87db..f1ec212 100644
--- a/HaikuCompositor.cpp
+++ b/HaikuCompositor.cpp
@@ -134,7 +134,6 @@ WaylandView::WaylandView(HaikuSurface *surface):
BView(BRect(), "WaylandView", B_FOLLOW_NONE, B_WILL_DRAW | B_TRANSPARENT_BACKGROUND),
fSurface(surface)
{
- SetDrawingMode(B_OP_ALPHA);
SetViewColor(B_TRANSPARENT_COLOR);
}
@@ -276,10 +275,16 @@ void HaikuSurface::Invalidate()
return;
}
auto viewLocked = AppKitPtrs::LockedPtr(fView);
- if (fSubsurface != NULL) {
- viewLocked->Invalidate();
- } else {
- viewLocked->Invalidate(&fDirty);
+ viewLocked->Invalidate(&fDirty);
+ for (HaikuSubsurface *subsurface = SurfaceList().First(); subsurface != NULL; subsurface = SurfaceList().GetNext(subsurface)) {
+ HaikuSurface* surface = subsurface->Surface();
+ BView* subsurfaceView = surface->View();
+ BRegion subsurfaceFrame = subsurfaceView->Frame();
+ BRegion subsurfaceDirty = fDirty;
+ subsurfaceDirty.IntersectWith(&subsurfaceFrame);
+ subsurfaceDirty.OffsetBy(-subsurfaceView->LeftTop());
+ surface->fDirty.Include(&subsurfaceDirty);
+ surface->Invalidate();
}
fDirty.MakeEmpty();
}
diff --git a/HaikuSubcompositor.cpp b/HaikuSubcompositor.cpp
index 9b34e01..c60dce5 100644
--- a/HaikuSubcompositor.cpp
+++ b/HaikuSubcompositor.cpp
@@ -87,9 +87,12 @@ HaikuSubsurface *HaikuSubsurface::Create(struct wl_client *client, uint32_t vers
subsurface->fParent = HaikuSurface::FromResource(parent);
subsurface->fParent->SurfaceList().Insert(subsurface);
haikuSurface->SetHook(new SubsurfaceHook());
-
+
BView *parentView = subsurface->fParent->View();
if (parentView) {
+ parentView->SetDrawingMode(B_OP_ALPHA);
+ parentView->SetViewColor(B_TRANSPARENT_COLOR);
+
haikuSurface->AttachView(parentView);
haikuSurface->AttachViewsToEarlierSubsurfaces();
}
--
2.45.2