Fast path Region::orSelf when empty
If a Region is empty, orSelf is equivalent to just assigning from the
other Region/Rect, so we don't need to perform a whole rasterization
pass.
Test: libsurfaceflinger_unittest
Test: simpleperf measurement of SF shows workload reduction
Bug: 153112939
Change-Id: Iefa0e0177a0e85ce72e37842885d3c8b68ce6025
diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp
index bf487c4..d929cc3 100644
--- a/libs/ui/Region.cpp
+++ b/libs/ui/Region.cpp
@@ -306,6 +306,10 @@
// ----------------------------------------------------------------------------
Region& Region::orSelf(const Rect& r) {
+ if (isEmpty()) {
+ set(r);
+ return *this;
+ }
return operationSelf(r, op_or);
}
Region& Region::xorSelf(const Rect& r) {
@@ -326,6 +330,10 @@
// ----------------------------------------------------------------------------
Region& Region::orSelf(const Region& rhs) {
+ if (isEmpty()) {
+ *this = rhs;
+ return *this;
+ }
return operationSelf(rhs, op_or);
}
Region& Region::xorSelf(const Region& rhs) {