Merge "VRR: Use appId to replace uid mapping" into main
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index 300ac2e..05e2ddf 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -2788,16 +2788,16 @@
return statusTFromBinderStatus(status);
}
-status_t SurfaceComposerClient::updateSmallAreaDetection(std::vector<int32_t>& uids,
+status_t SurfaceComposerClient::updateSmallAreaDetection(std::vector<int32_t>& appIds,
std::vector<float>& thresholds) {
binder::Status status =
- ComposerServiceAIDL::getComposerService()->updateSmallAreaDetection(uids, thresholds);
+ ComposerServiceAIDL::getComposerService()->updateSmallAreaDetection(appIds, thresholds);
return statusTFromBinderStatus(status);
}
-status_t SurfaceComposerClient::setSmallAreaDetectionThreshold(uid_t uid, float threshold) {
+status_t SurfaceComposerClient::setSmallAreaDetectionThreshold(int32_t appId, float threshold) {
binder::Status status =
- ComposerServiceAIDL::getComposerService()->setSmallAreaDetectionThreshold(uid,
+ ComposerServiceAIDL::getComposerService()->setSmallAreaDetectionThreshold(appId,
threshold);
return statusTFromBinderStatus(status);
}
diff --git a/libs/gui/aidl/android/gui/ISurfaceComposer.aidl b/libs/gui/aidl/android/gui/ISurfaceComposer.aidl
index 507e086..a7cf5dd 100644
--- a/libs/gui/aidl/android/gui/ISurfaceComposer.aidl
+++ b/libs/gui/aidl/android/gui/ISurfaceComposer.aidl
@@ -480,14 +480,14 @@
*/
void setOverrideFrameRate(int uid, float frameRate);
- oneway void updateSmallAreaDetection(in int[] uids, in float[] thresholds);
+ oneway void updateSmallAreaDetection(in int[] appIds, in float[] thresholds);
/**
- * Set the small area detection threshold for a specified uid by SmallAreaDetectionController.
- * Passing the threshold and uid to SurfaceFlinger to update the uid-threshold mapping
+ * Set the small area detection threshold for a specified appId by SmallAreaDetectionController.
+ * Passing the threshold and appId to SurfaceFlinger to update the appId-threshold mapping
* in the scheduler.
*/
- oneway void setSmallAreaDetectionThreshold(int uid, float threshold);
+ oneway void setSmallAreaDetectionThreshold(int appId, float threshold);
/**
* Enables or disables the frame rate overlay in the top left corner.
diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h
index bc63c41..54c3aa7 100644
--- a/libs/gui/include/gui/SurfaceComposerClient.h
+++ b/libs/gui/include/gui/SurfaceComposerClient.h
@@ -203,15 +203,15 @@
// by GameManager.
static status_t setOverrideFrameRate(uid_t uid, float frameRate);
- // Update the small area detection whole uid-threshold mappings by same size uid and threshold
- // vector.
+ // Update the small area detection whole appId-threshold mappings by same size appId and
+ // threshold vector.
// Ref:setSmallAreaDetectionThreshold.
- static status_t updateSmallAreaDetection(std::vector<int32_t>& uids,
+ static status_t updateSmallAreaDetection(std::vector<int32_t>& appIds,
std::vector<float>& thresholds);
- // Sets the small area detection threshold to particular apps (uid). Passing value 0 means
+ // Sets the small area detection threshold to particular apps (appId). Passing value 0 means
// to disable small area detection to the app.
- static status_t setSmallAreaDetectionThreshold(uid_t uid, float threshold);
+ static status_t setSmallAreaDetectionThreshold(int32_t appId, float threshold);
// Switches on/off Auto Low Latency Mode on the connected display. This should only be
// called if the connected display supports Auto Low Latency Mode as reported by
diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp
index 9eee699..e7b1232 100644
--- a/libs/gui/tests/Surface_test.cpp
+++ b/libs/gui/tests/Surface_test.cpp
@@ -999,12 +999,12 @@
binder::Status scheduleCommit() override { return binder::Status::ok(); }
- binder::Status updateSmallAreaDetection(const std::vector<int32_t>& /*uids*/,
+ binder::Status updateSmallAreaDetection(const std::vector<int32_t>& /*appIds*/,
const std::vector<float>& /*thresholds*/) {
return binder::Status::ok();
}
- binder::Status setSmallAreaDetectionThreshold(int32_t /*uid*/, float /*threshold*/) {
+ binder::Status setSmallAreaDetectionThreshold(int32_t /*appId*/, float /*threshold*/) {
return binder::Status::ok();
}
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index da87e8e..d4ad53b 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -206,6 +206,7 @@
mOwnerUid = args.ownerUid;
mOwnerPid = args.ownerPid;
+ mOwnerAppId = mOwnerUid % PER_USER_RANGE;
mPremultipliedAlpha = !(args.flags & ISurfaceComposerClient::eNonPremultiplied);
mPotentialCursor = args.flags & ISurfaceComposerClient::eCursorWindow;
@@ -4431,7 +4432,7 @@
// If the damage region is a small dirty, this could give the hint for the layer history that
// it could suppress the heuristic rate when calculating.
- mSmallDirty = mFlinger->mScheduler->isSmallDirtyArea(mOwnerUid,
+ mSmallDirty = mFlinger->mScheduler->isSmallDirtyArea(mOwnerAppId,
bounds.getWidth() * bounds.getHeight());
}
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index 1b99255..f67da2a 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -837,6 +837,8 @@
pid_t getOwnerPid() { return mOwnerPid; }
+ int32_t getOwnerAppId() { return mOwnerAppId; }
+
// This layer is not a clone, but it's the parent to the cloned hierarchy. The
// variable mClonedChild represents the top layer that will be cloned so this
// layer will be the parent of mClonedChild.
@@ -1062,6 +1064,8 @@
// If created from a system process, the value can be passed in.
pid_t mOwnerPid;
+ int32_t mOwnerAppId;
+
// Keeps track of the time SF latched the last buffer from this layer.
// Used in buffer stuffing analysis in FrameTimeline.
nsecs_t mLastLatchTime = 0;
@@ -1071,6 +1075,10 @@
sp<Fence> mLastClientCompositionFence;
bool mClearClientCompositionFenceOnLayerDisplayed = false;
private:
+ // Range of uids allocated for a user.
+ // This value is taken from android.os.UserHandle#PER_USER_RANGE.
+ static constexpr int32_t PER_USER_RANGE = 100000;
+
friend class SlotGenerationTest;
friend class TransactionFrameTracerTest;
friend class TransactionSurfaceFrameTest;
diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp
index 5115c42..5b36a5e 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.cpp
+++ b/services/surfaceflinger/Scheduler/Scheduler.cpp
@@ -1198,18 +1198,19 @@
}
void Scheduler::updateSmallAreaDetection(
- std::vector<std::pair<uid_t, float>>& uidThresholdMappings) {
+ std::vector<std::pair<int32_t, float>>& uidThresholdMappings) {
mSmallAreaDetectionAllowMappings.update(uidThresholdMappings);
}
-void Scheduler::setSmallAreaDetectionThreshold(uid_t uid, float threshold) {
- mSmallAreaDetectionAllowMappings.setThesholdForUid(uid, threshold);
+void Scheduler::setSmallAreaDetectionThreshold(int32_t appId, float threshold) {
+ mSmallAreaDetectionAllowMappings.setThesholdForAppId(appId, threshold);
}
-bool Scheduler::isSmallDirtyArea(uid_t uid, uint32_t dirtyArea) {
- std::optional<float> oThreshold = mSmallAreaDetectionAllowMappings.getThresholdForUid(uid);
- if (oThreshold) return mLayerHistory.isSmallDirtyArea(dirtyArea, oThreshold.value());
-
+bool Scheduler::isSmallDirtyArea(int32_t appId, uint32_t dirtyArea) {
+ std::optional<float> oThreshold = mSmallAreaDetectionAllowMappings.getThresholdForAppId(appId);
+ if (oThreshold) {
+ return mLayerHistory.isSmallDirtyArea(dirtyArea, oThreshold.value());
+ }
return false;
}
diff --git a/services/surfaceflinger/Scheduler/Scheduler.h b/services/surfaceflinger/Scheduler/Scheduler.h
index 3441318..b0520a6 100644
--- a/services/surfaceflinger/Scheduler/Scheduler.h
+++ b/services/surfaceflinger/Scheduler/Scheduler.h
@@ -293,12 +293,12 @@
void setGameModeRefreshRateForUid(FrameRateOverride);
- void updateSmallAreaDetection(std::vector<std::pair<uid_t, float>>& uidThresholdMappings);
+ void updateSmallAreaDetection(std::vector<std::pair<int32_t, float>>& uidThresholdMappings);
- void setSmallAreaDetectionThreshold(uid_t uid, float threshold);
+ void setSmallAreaDetectionThreshold(int32_t appId, float threshold);
// Returns true if the dirty area is less than threshold.
- bool isSmallDirtyArea(uid_t uid, uint32_t dirtyArea);
+ bool isSmallDirtyArea(int32_t appId, uint32_t dirtyArea);
// Retrieves the overridden refresh rate for a given uid.
std::optional<Fps> getFrameRateOverride(uid_t) const EXCLUDES(mDisplayLock);
diff --git a/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.cpp b/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.cpp
index 95cd5d1..38c6da4 100644
--- a/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.cpp
+++ b/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.cpp
@@ -19,26 +19,26 @@
namespace android::scheduler {
void SmallAreaDetectionAllowMappings::update(
- std::vector<std::pair<uid_t, float>>& uidThresholdMappings) {
+ std::vector<std::pair<int32_t, float>>& appIdThresholdMappings) {
std::lock_guard lock(mLock);
mMap.clear();
- for (std::pair<uid_t, float> row : uidThresholdMappings) {
+ for (std::pair<int32_t, float> row : appIdThresholdMappings) {
if (!isValidThreshold(row.second)) continue;
mMap.emplace(row.first, row.second);
}
}
-void SmallAreaDetectionAllowMappings::setThesholdForUid(uid_t uid, float threshold) {
+void SmallAreaDetectionAllowMappings::setThesholdForAppId(int32_t appId, float threshold) {
if (!isValidThreshold(threshold)) return;
std::lock_guard lock(mLock);
- mMap.emplace(uid, threshold);
+ mMap.emplace(appId, threshold);
}
-std::optional<float> SmallAreaDetectionAllowMappings::getThresholdForUid(uid_t uid) {
+std::optional<float> SmallAreaDetectionAllowMappings::getThresholdForAppId(int32_t appId) {
std::lock_guard lock(mLock);
- const auto iter = mMap.find(uid);
+ const auto iter = mMap.find(appId);
if (iter != mMap.end()) {
return iter->second;
}
diff --git a/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.h b/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.h
index cbab690..e10301c 100644
--- a/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.h
+++ b/services/surfaceflinger/Scheduler/SmallAreaDetectionAllowMappings.h
@@ -24,16 +24,16 @@
namespace android::scheduler {
class SmallAreaDetectionAllowMappings {
- using UidThresholdMap = std::unordered_map<uid_t, float>;
+ using AppIdThresholdMap = std::unordered_map<int32_t, float>;
public:
- void update(std::vector<std::pair<uid_t, float>>& uidThresholdMappings);
- void setThesholdForUid(uid_t uid, float threshold) EXCLUDES(mLock);
- std::optional<float> getThresholdForUid(uid_t uid) EXCLUDES(mLock);
+ void update(std::vector<std::pair<int32_t, float>>& appIdThresholdMappings);
+ void setThesholdForAppId(int32_t appId, float threshold) EXCLUDES(mLock);
+ std::optional<float> getThresholdForAppId(int32_t uid) EXCLUDES(mLock);
private:
static bool isValidThreshold(float threshold) { return threshold >= 0.0f && threshold <= 1.0f; }
mutable std::mutex mLock;
- UidThresholdMap mMap GUARDED_BY(mLock);
+ AppIdThresholdMap mMap GUARDED_BY(mLock);
};
} // namespace android::scheduler
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index a796a72..caee95b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -8340,13 +8340,13 @@
}
status_t SurfaceFlinger::updateSmallAreaDetection(
- std::vector<std::pair<uid_t, float>>& uidThresholdMappings) {
- mScheduler->updateSmallAreaDetection(uidThresholdMappings);
+ std::vector<std::pair<int32_t, float>>& appIdThresholdMappings) {
+ mScheduler->updateSmallAreaDetection(appIdThresholdMappings);
return NO_ERROR;
}
-status_t SurfaceFlinger::setSmallAreaDetectionThreshold(uid_t uid, float threshold) {
- mScheduler->setSmallAreaDetectionThreshold(uid, threshold);
+status_t SurfaceFlinger::setSmallAreaDetectionThreshold(int32_t appId, float threshold) {
+ mScheduler->setSmallAreaDetectionThreshold(appId, threshold);
return NO_ERROR;
}
@@ -9718,18 +9718,18 @@
return binder::Status::ok();
}
-binder::Status SurfaceComposerAIDL::updateSmallAreaDetection(const std::vector<int32_t>& uids,
+binder::Status SurfaceComposerAIDL::updateSmallAreaDetection(const std::vector<int32_t>& appIds,
const std::vector<float>& thresholds) {
status_t status;
const int c_uid = IPCThreadState::self()->getCallingUid();
if (c_uid == AID_ROOT || c_uid == AID_SYSTEM) {
- if (uids.size() != thresholds.size()) return binderStatusFromStatusT(BAD_VALUE);
+ if (appIds.size() != thresholds.size()) return binderStatusFromStatusT(BAD_VALUE);
- std::vector<std::pair<uid_t, float>> mappings;
- const size_t size = uids.size();
+ std::vector<std::pair<int32_t, float>> mappings;
+ const size_t size = appIds.size();
mappings.reserve(size);
for (int i = 0; i < size; i++) {
- auto row = std::make_pair(static_cast<uid_t>(uids[i]), thresholds[i]);
+ auto row = std::make_pair(appIds[i], thresholds[i]);
mappings.push_back(row);
}
status = mFlinger->updateSmallAreaDetection(mappings);
@@ -9740,11 +9740,11 @@
return binderStatusFromStatusT(status);
}
-binder::Status SurfaceComposerAIDL::setSmallAreaDetectionThreshold(int32_t uid, float threshold) {
+binder::Status SurfaceComposerAIDL::setSmallAreaDetectionThreshold(int32_t appId, float threshold) {
status_t status;
const int c_uid = IPCThreadState::self()->getCallingUid();
if (c_uid == AID_ROOT || c_uid == AID_SYSTEM) {
- status = mFlinger->setSmallAreaDetectionThreshold(uid, threshold);
+ status = mFlinger->setSmallAreaDetectionThreshold(appId, threshold);
} else {
ALOGE("setSmallAreaDetectionThreshold() permission denied for uid: %d", c_uid);
status = PERMISSION_DENIED;
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index cbea312..65114e4 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -606,9 +606,9 @@
status_t setOverrideFrameRate(uid_t uid, float frameRate);
- status_t updateSmallAreaDetection(std::vector<std::pair<uid_t, float>>& uidThresholdMappings);
+ status_t updateSmallAreaDetection(std::vector<std::pair<int32_t, float>>& uidThresholdMappings);
- status_t setSmallAreaDetectionThreshold(uid_t uid, float threshold);
+ status_t setSmallAreaDetectionThreshold(int32_t appId, float threshold);
int getGpuContextPriority();
@@ -1572,9 +1572,9 @@
binder::Status setDebugFlash(int delay) override;
binder::Status scheduleComposite() override;
binder::Status scheduleCommit() override;
- binder::Status updateSmallAreaDetection(const std::vector<int32_t>& uids,
+ binder::Status updateSmallAreaDetection(const std::vector<int32_t>& appIds,
const std::vector<float>& thresholds) override;
- binder::Status setSmallAreaDetectionThreshold(int32_t uid, float threshold) override;
+ binder::Status setSmallAreaDetectionThreshold(int32_t appId, float threshold) override;
binder::Status getGpuContextPriority(int32_t* outPriority) override;
binder::Status getMaxAcquiredBufferCount(int32_t* buffers) override;
binder::Status addWindowInfosListener(const sp<gui::IWindowInfosListener>& windowInfosListener,
diff --git a/services/surfaceflinger/tests/unittests/SmallAreaDetectionAllowMappingsTest.cpp b/services/surfaceflinger/tests/unittests/SmallAreaDetectionAllowMappingsTest.cpp
index b910485..05f9eed 100644
--- a/services/surfaceflinger/tests/unittests/SmallAreaDetectionAllowMappingsTest.cpp
+++ b/services/surfaceflinger/tests/unittests/SmallAreaDetectionAllowMappingsTest.cpp
@@ -23,38 +23,34 @@
namespace android::scheduler {
-class SmallAreaDetectionMappingsAllowTest : public testing::Test {
+class SmallAreaDetectionAllowMappingsTest : public testing::Test {
protected:
SmallAreaDetectionAllowMappings mMappings;
+ static constexpr int32_t kAppId1 = 10100;
+ static constexpr int32_t kAppId2 = 10101;
+ static constexpr float kThreshold1 = 0.05f;
+ static constexpr float kThreshold2 = 0.07f;
};
namespace {
-TEST_F(SmallAreaDetectionMappingsAllowTest, testUpdate) {
- const uid_t uid1 = 10100;
- const uid_t uid2 = 10101;
- const float threshold1 = 0.05f;
- const float threshold2 = 0.07f;
- std::vector<std::pair<uid_t, float>> mappings;
+TEST_F(SmallAreaDetectionAllowMappingsTest, testUpdate) {
+ std::vector<std::pair<int32_t, float>> mappings;
mappings.reserve(2);
- mappings.push_back(std::make_pair(uid1, threshold1));
- mappings.push_back(std::make_pair(uid2, threshold2));
+ mappings.push_back(std::make_pair(kAppId1, kThreshold1));
+ mappings.push_back(std::make_pair(kAppId2, kThreshold2));
mMappings.update(mappings);
- ASSERT_EQ(mMappings.getThresholdForUid(uid1).value(), threshold1);
- ASSERT_EQ(mMappings.getThresholdForUid(uid2).value(), threshold2);
+ ASSERT_EQ(mMappings.getThresholdForAppId(kAppId1).value(), kThreshold1);
+ ASSERT_EQ(mMappings.getThresholdForAppId(kAppId2).value(), kThreshold2);
}
-TEST_F(SmallAreaDetectionMappingsAllowTest, testSetThesholdForUid) {
- const uid_t uid = 10111;
- const float threshold = 0.05f;
-
- mMappings.setThesholdForUid(uid, threshold);
- ASSERT_EQ(mMappings.getThresholdForUid(uid), threshold);
+TEST_F(SmallAreaDetectionAllowMappingsTest, testSetThesholdForAppId) {
+ mMappings.setThesholdForAppId(kAppId1, kThreshold1);
+ ASSERT_EQ(mMappings.getThresholdForAppId(kAppId1), kThreshold1);
}
-TEST_F(SmallAreaDetectionMappingsAllowTest, testUidNotInTheMappings) {
- const uid_t uid = 10222;
- ASSERT_EQ(mMappings.getThresholdForUid(uid), std::nullopt);
+TEST_F(SmallAreaDetectionAllowMappingsTest, testAppIdNotInTheMappings) {
+ ASSERT_EQ(mMappings.getThresholdForAppId(kAppId1), std::nullopt);
}
} // namespace