summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-14 01:21:01 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-10-14 01:21:01 +0000
commitfa42dfc53a5bda461e2260a0c6e3bb5cdda03bba (patch)
tree869453969b3358f6754019a606c36f8f9b29bc9e
parente026422f182af09ff26d61d433d9cd4c5a2f88fb (diff)
parent7ad6a3536fda4779b4b6fa49d53afa3571aa5c68 (diff)
downloadbase-fa42dfc53a5bda461e2260a0c6e3bb5cdda03bba.tar.gz
Snap for 10949315 from 7ad6a3536fda4779b4b6fa49d53afa3571aa5c68 to udc-qpr1-release
Change-Id: I31b2511c7dc7c792c0f5fdfe48217b9db809e122
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java2
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp13
-rw-r--r--libs/hwui/renderthread/CanvasContext.h2
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.cpp44
-rw-r--r--libs/hwui/renderthread/HintSessionWrapper.h11
-rw-r--r--libs/hwui/tests/unit/HintSessionWrapperTests.cpp140
-rw-r--r--services/core/java/com/android/server/pm/TEST_MAPPING10
7 files changed, 30 insertions, 192 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
index 32cc6f8cebc0..4897c4ee7dd6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
@@ -342,6 +342,8 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler,
// Keyguard handler cannot handle it, process through original mixed
mActiveTransitions.remove(keyguardMixed);
}
+ } else if (mPipHandler != null) {
+ mPipHandler.syncPipSurfaceState(info, startTransaction, finishTransaction);
}
}
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 310e39e1d0a2..f5b3ca602469 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -123,7 +123,7 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode*
, mProfiler(mJankTracker.frames(), thread.timeLord().frameIntervalNanos())
, mContentDrawBounds(0, 0, 0, 0)
, mRenderPipeline(std::move(renderPipeline))
- , mHintSessionWrapper(std::make_shared<HintSessionWrapper>(uiThreadId, renderThreadId)) {
+ , mHintSessionWrapper(uiThreadId, renderThreadId) {
mRenderThread.cacheManager().registerCanvasContext(this);
rootRenderNode->makeRoot();
mRenderNodes.emplace_back(rootRenderNode);
@@ -160,7 +160,6 @@ void CanvasContext::destroy() {
destroyHardwareResources();
mAnimationContext->destroy();
mRenderThread.cacheManager().onContextStopped(this);
- mHintSessionWrapper->delayedDestroy(mRenderThread, 2_s, mHintSessionWrapper);
}
static void setBufferCount(ANativeWindow* window) {
@@ -740,7 +739,7 @@ void CanvasContext::draw(bool solelyTextureViewUpdates) {
int64_t frameDeadline = mCurrentFrameInfo->get(FrameInfoIndex::FrameDeadline);
int64_t dequeueBufferDuration = mCurrentFrameInfo->get(FrameInfoIndex::DequeueBufferDuration);
- mHintSessionWrapper->updateTargetWorkDuration(frameDeadline - intendedVsync);
+ mHintSessionWrapper.updateTargetWorkDuration(frameDeadline - intendedVsync);
if (didDraw) {
int64_t frameStartTime = mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime);
@@ -748,7 +747,7 @@ void CanvasContext::draw(bool solelyTextureViewUpdates) {
int64_t actualDuration = frameDuration -
(std::min(syncDelayDuration, mLastDequeueBufferDuration)) -
dequeueBufferDuration - idleDuration;
- mHintSessionWrapper->reportActualWorkDuration(actualDuration);
+ mHintSessionWrapper.reportActualWorkDuration(actualDuration);
}
mLastDequeueBufferDuration = dequeueBufferDuration;
@@ -1082,11 +1081,11 @@ void CanvasContext::prepareSurfaceControlForWebview() {
}
void CanvasContext::sendLoadResetHint() {
- mHintSessionWrapper->sendLoadResetHint();
+ mHintSessionWrapper.sendLoadResetHint();
}
void CanvasContext::sendLoadIncreaseHint() {
- mHintSessionWrapper->sendLoadIncreaseHint();
+ mHintSessionWrapper.sendLoadIncreaseHint();
}
void CanvasContext::setSyncDelayDuration(nsecs_t duration) {
@@ -1094,7 +1093,7 @@ void CanvasContext::setSyncDelayDuration(nsecs_t duration) {
}
void CanvasContext::startHintSession() {
- mHintSessionWrapper->init();
+ mHintSessionWrapper.init();
}
bool CanvasContext::shouldDither() {
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 10a4afb23d35..32ac5af94c14 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -359,7 +359,7 @@ private:
std::function<bool(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
std::function<void()> mPrepareSurfaceControlForWebviewCallback;
- std::shared_ptr<HintSessionWrapper> mHintSessionWrapper;
+ HintSessionWrapper mHintSessionWrapper;
nsecs_t mLastDequeueBufferDuration = 0;
nsecs_t mSyncDelayDuration = 0;
nsecs_t mIdleDuration = 0;
diff --git a/libs/hwui/renderthread/HintSessionWrapper.cpp b/libs/hwui/renderthread/HintSessionWrapper.cpp
index 565da52de940..b34da5153a72 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.cpp
+++ b/libs/hwui/renderthread/HintSessionWrapper.cpp
@@ -24,7 +24,6 @@
#include <vector>
#include "../Properties.h"
-#include "RenderThread.h"
#include "thread/CommonPool.h"
using namespace std::chrono_literals;
@@ -63,26 +62,24 @@ HintSessionWrapper::~HintSessionWrapper() {
}
void HintSessionWrapper::destroy() {
- if (mHintSessionFuture.has_value()) {
- mHintSession = mHintSessionFuture->get();
- mHintSessionFuture = std::nullopt;
+ if (mHintSessionFuture.valid()) {
+ mHintSession = mHintSessionFuture.get();
}
if (mHintSession) {
mBinding->closeSession(mHintSession);
mSessionValid = true;
mHintSession = nullptr;
}
- mResetsSinceLastReport = 0;
}
bool HintSessionWrapper::init() {
if (mHintSession != nullptr) return true;
+
// If we're waiting for the session
- if (mHintSessionFuture.has_value()) {
+ if (mHintSessionFuture.valid()) {
// If the session is here
- if (mHintSessionFuture->wait_for(0s) == std::future_status::ready) {
- mHintSession = mHintSessionFuture->get();
- mHintSessionFuture = std::nullopt;
+ if (mHintSessionFuture.wait_for(0s) == std::future_status::ready) {
+ mHintSession = mHintSessionFuture.get();
if (mHintSession != nullptr) {
mSessionValid = true;
return true;
@@ -112,10 +109,10 @@ bool HintSessionWrapper::init() {
// Use a placeholder target value to initialize,
// this will always be replaced elsewhere before it gets used
- int64_t targetDurationNanos =
- mLastTargetWorkDuration == 0 ? kDefaultTargetDuration : mLastTargetWorkDuration;
+ int64_t defaultTargetDurationNanos = 16666667;
mHintSessionFuture = CommonPool::async([=, this, tids = std::move(tids)] {
- return mBinding->createSession(manager, tids.data(), tids.size(), targetDurationNanos);
+ return mBinding->createSession(manager, tids.data(), tids.size(),
+ defaultTargetDurationNanos);
});
return false;
}
@@ -139,7 +136,6 @@ void HintSessionWrapper::reportActualWorkDuration(long actualDurationNanos) {
actualDurationNanos < kSanityCheckUpperBound) {
mBinding->reportActualWorkDuration(mHintSession, actualDurationNanos);
}
- mLastFrameNotification = systemTime();
}
void HintSessionWrapper::sendLoadResetHint() {
@@ -157,28 +153,6 @@ void HintSessionWrapper::sendLoadResetHint() {
void HintSessionWrapper::sendLoadIncreaseHint() {
if (!init()) return;
mBinding->sendHint(mHintSession, static_cast<int32_t>(SessionHint::CPU_LOAD_UP));
- mLastFrameNotification = systemTime();
-}
-
-bool HintSessionWrapper::alive() {
- return mHintSession != nullptr;
-}
-
-nsecs_t HintSessionWrapper::getLastUpdate() {
- return mLastFrameNotification;
-}
-
-// Requires passing in its shared_ptr since it shouldn't own a shared_ptr to itself
-void HintSessionWrapper::delayedDestroy(RenderThread& rt, nsecs_t delay,
- std::shared_ptr<HintSessionWrapper> wrapperPtr) {
- nsecs_t lastUpdate = wrapperPtr->getLastUpdate();
- rt.queue().postDelayed(delay, [lastUpdate = lastUpdate, wrapper = wrapperPtr]() mutable {
- if (wrapper->getLastUpdate() == lastUpdate) {
- wrapper->destroy();
- }
- // Ensure the shared_ptr is killed at the end of the method
- wrapper = nullptr;
- });
}
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/HintSessionWrapper.h b/libs/hwui/renderthread/HintSessionWrapper.h
index 41891cd80a42..f8b876e28d51 100644
--- a/libs/hwui/renderthread/HintSessionWrapper.h
+++ b/libs/hwui/renderthread/HintSessionWrapper.h
@@ -19,7 +19,6 @@
#include <android/performance_hint.h>
#include <future>
-#include <optional>
#include "utils/TimeUtils.h"
@@ -28,8 +27,6 @@ namespace uirenderer {
namespace renderthread {
-class RenderThread;
-
class HintSessionWrapper {
public:
friend class HintSessionWrapperTests;
@@ -43,15 +40,10 @@ public:
void sendLoadIncreaseHint();
bool init();
void destroy();
- bool alive();
- nsecs_t getLastUpdate();
- void delayedDestroy(renderthread::RenderThread& rt, nsecs_t delay,
- std::shared_ptr<HintSessionWrapper> wrapperPtr);
private:
APerformanceHintSession* mHintSession = nullptr;
- // This needs to work concurrently for testing
- std::optional<std::shared_future<APerformanceHintSession*>> mHintSessionFuture;
+ std::future<APerformanceHintSession*> mHintSessionFuture;
int mResetsSinceLastReport = 0;
nsecs_t mLastFrameNotification = 0;
@@ -65,7 +57,6 @@ private:
static constexpr nsecs_t kResetHintTimeout = 100_ms;
static constexpr int64_t kSanityCheckLowerBound = 100_us;
static constexpr int64_t kSanityCheckUpperBound = 10_s;
- static constexpr int64_t kDefaultTargetDuration = 16666667;
// Allows easier stub when testing
class HintSessionBinding {
diff --git a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
index 5a10f4f959aa..623be1e3f3f3 100644
--- a/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
+++ b/libs/hwui/tests/unit/HintSessionWrapperTests.cpp
@@ -23,11 +23,9 @@
#include <chrono>
#include "Properties.h"
-#include "tests/common/TestUtils.h"
using namespace testing;
using namespace std::chrono_literals;
-using namespace android::uirenderer::renderthread;
APerformanceHintManager* managerPtr = reinterpret_cast<APerformanceHintManager*>(123);
APerformanceHintSession* sessionPtr = reinterpret_cast<APerformanceHintSession*>(456);
@@ -44,9 +42,6 @@ public:
protected:
std::shared_ptr<HintSessionWrapper> mWrapper;
- std::promise<int> blockDestroyCallUntil;
- std::promise<int> waitForDestroyFinished;
-
class MockHintSessionBinding : public HintSessionWrapper::HintSessionBinding {
public:
void init() override;
@@ -58,17 +53,11 @@ protected:
MOCK_METHOD(void, fakeUpdateTargetWorkDuration, (APerformanceHintSession*, int64_t));
MOCK_METHOD(void, fakeReportActualWorkDuration, (APerformanceHintSession*, int64_t));
MOCK_METHOD(void, fakeSendHint, (APerformanceHintSession*, int32_t));
- // Needs to be on the binding so it can be accessed from static methods
- std::promise<int> allowCreationToFinish;
};
// Must be static so it can have function pointers we can point to with static methods
static std::shared_ptr<MockHintSessionBinding> sMockBinding;
- static void allowCreationToFinish() { sMockBinding->allowCreationToFinish.set_value(1); }
- void allowDelayedDestructionToStart() { blockDestroyCallUntil.set_value(1); }
- void waitForDelayedDestructionToFinish() { waitForDestroyFinished.get_future().wait(); }
-
// Must be static so we can point to them as normal fn pointers with HintSessionBinding
static APerformanceHintManager* stubGetManager() { return sMockBinding->fakeGetManager(); };
static APerformanceHintSession* stubCreateSession(APerformanceHintManager* manager,
@@ -76,12 +65,6 @@ protected:
int64_t initialTarget) {
return sMockBinding->fakeCreateSession(manager, ids, idsSize, initialTarget);
}
- static APerformanceHintSession* stubManagedCreateSession(APerformanceHintManager* manager,
- const int32_t* ids, size_t idsSize,
- int64_t initialTarget) {
- sMockBinding->allowCreationToFinish.get_future().wait();
- return sMockBinding->fakeCreateSession(manager, ids, idsSize, initialTarget);
- }
static APerformanceHintSession* stubSlowCreateSession(APerformanceHintManager* manager,
const int32_t* ids, size_t idsSize,
int64_t initialTarget) {
@@ -102,21 +85,7 @@ protected:
static void stubSendHint(APerformanceHintSession* session, int32_t hintId) {
sMockBinding->fakeSendHint(session, hintId);
};
- void waitForWrapperReady() {
- if (mWrapper->mHintSessionFuture.has_value()) {
- mWrapper->mHintSessionFuture->wait();
- }
- }
- void scheduleDelayedDestroyManaged() {
- TestUtils::runOnRenderThread([&](renderthread::RenderThread& rt) {
- // Guaranteed to be scheduled first, allows destruction to start
- rt.queue().postDelayed(0_ms, [&] { blockDestroyCallUntil.get_future().wait(); });
- // Guaranteed to be scheduled second, destroys the session
- mWrapper->delayedDestroy(rt, 1_ms, mWrapper);
- // This is guaranteed to be queued after the destroy, signals that destruction is done
- rt.queue().postDelayed(1_ms, [&] { waitForDestroyFinished.set_value(1); });
- });
- }
+ void waitForWrapperReady() { mWrapper->mHintSessionFuture.wait(); }
};
std::shared_ptr<HintSessionWrapperTests::MockHintSessionBinding>
@@ -144,7 +113,6 @@ void HintSessionWrapperTests::MockHintSessionBinding::init() {
}
void HintSessionWrapperTests::TearDown() {
- // Ensure that anything running on RT is completely finished
mWrapper = nullptr;
sMockBinding = nullptr;
}
@@ -154,7 +122,6 @@ TEST_F(HintSessionWrapperTests, destructorClosesBackgroundSession) {
sMockBinding->createSession = stubSlowCreateSession;
mWrapper->init();
mWrapper = nullptr;
- Mock::VerifyAndClearExpectations(sMockBinding.get());
}
TEST_F(HintSessionWrapperTests, sessionInitializesCorrectly) {
@@ -181,107 +148,4 @@ TEST_F(HintSessionWrapperTests, loadResetHintsSendCorrectly) {
mWrapper->sendLoadResetHint();
}
-TEST_F(HintSessionWrapperTests, delayedDeletionWorksCorrectlyAndOnlyClosesOnce) {
- EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- mWrapper->init();
- waitForWrapperReady();
- // Init a second time just to ensure the wrapper grabs the promise value
- mWrapper->init();
-
- EXPECT_EQ(mWrapper->alive(), true);
-
- // Schedule delayed destruction, allow it to run, and check when it's done
- scheduleDelayedDestroyManaged();
- allowDelayedDestructionToStart();
- waitForDelayedDestructionToFinish();
-
- // Ensure it closed within the timeframe of the test
- Mock::VerifyAndClearExpectations(sMockBinding.get());
- EXPECT_EQ(mWrapper->alive(), false);
- // If we then delete the wrapper, it shouldn't close the session again
- EXPECT_CALL(*sMockBinding, fakeCloseSession(_)).Times(0);
- mWrapper = nullptr;
-}
-
-TEST_F(HintSessionWrapperTests, delayedDeletionResolvesBeforeAsyncCreationFinishes) {
- // Here we test whether queueing delayedDestroy works while creation is still happening, if
- // creation happens after
- EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- sMockBinding->createSession = &stubManagedCreateSession;
-
- // Start creating the session and destroying it at the same time
- mWrapper->init();
- scheduleDelayedDestroyManaged();
-
- // Allow destruction to happen first
- allowDelayedDestructionToStart();
-
- // Make sure destruction has had time to happen
- std::this_thread::sleep_for(50ms);
-
- // Then, allow creation to finish after delayed destroy runs
- allowCreationToFinish();
-
- // Wait for destruction to finish
- waitForDelayedDestructionToFinish();
-
- // Ensure it closed within the timeframe of the test
- Mock::VerifyAndClearExpectations(sMockBinding.get());
- EXPECT_EQ(mWrapper->alive(), false);
-}
-
-TEST_F(HintSessionWrapperTests, delayedDeletionResolvesAfterAsyncCreationFinishes) {
- // Here we test whether queueing delayedDestroy works while creation is still happening, if
- // creation happens before
- EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(1);
- sMockBinding->createSession = &stubManagedCreateSession;
-
- // Start creating the session and destroying it at the same time
- mWrapper->init();
- scheduleDelayedDestroyManaged();
-
- // Allow creation to happen first
- allowCreationToFinish();
-
- // Make sure creation has had time to happen
- waitForWrapperReady();
-
- // Then allow destruction to happen after creation is done
- allowDelayedDestructionToStart();
-
- // Wait for it to finish
- waitForDelayedDestructionToFinish();
-
- // Ensure it closed within the timeframe of the test
- Mock::VerifyAndClearExpectations(sMockBinding.get());
- EXPECT_EQ(mWrapper->alive(), false);
-}
-
-TEST_F(HintSessionWrapperTests, delayedDeletionDoesNotKillReusedSession) {
- EXPECT_CALL(*sMockBinding, fakeCloseSession(sessionPtr)).Times(0);
- EXPECT_CALL(*sMockBinding,
- fakeSendHint(sessionPtr, static_cast<int32_t>(SessionHint::CPU_LOAD_UP)))
- .Times(1);
-
- mWrapper->init();
- waitForWrapperReady();
- // Init a second time just to grab the wrapper from the promise
- mWrapper->init();
- EXPECT_EQ(mWrapper->alive(), true);
-
- // First schedule the deletion
- scheduleDelayedDestroyManaged();
-
- // Then, send a hint to update the timestamp
- mWrapper->sendLoadIncreaseHint();
-
- // Then, run the delayed deletion after sending the update
- allowDelayedDestructionToStart();
- waitForDelayedDestructionToFinish();
-
- // Ensure it didn't close within the timeframe of the test
- Mock::VerifyAndClearExpectations(sMockBinding.get());
- EXPECT_EQ(mWrapper->alive(), true);
-}
-
-} // namespace android::uirenderer::renderthread
+} // namespace android::uirenderer::renderthread \ No newline at end of file
diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING
index bb6e11dcf8d4..155ddaece6ba 100644
--- a/services/core/java/com/android/server/pm/TEST_MAPPING
+++ b/services/core/java/com/android/server/pm/TEST_MAPPING
@@ -18,7 +18,12 @@
"name": "CtsCompilationTestCases"
},
{
- "name": "CtsAppEnumerationTestCases"
+ "name": "CtsAppEnumerationTestCases",
+ "options": [
+ {
+ "exclude-annotation": "androidx.test.filters.LargeTest"
+ }
+ ]
},
{
"name": "CtsMatchFlagTestCases"
@@ -118,6 +123,9 @@
},
{
"name": "PackageManagerServiceHostTests"
+ },
+ {
+ "name": "CtsAppEnumerationTestCases"
}
],
"imports": [