Merge "Add more description for disabling of rate limiter in code"
diff --git a/Android.bp b/Android.bp
index dec6716..615a7a8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -64,14 +64,20 @@
name: "framework_native_aidl_binder",
srcs: ["aidl/binder/**/*.aidl"],
path: "aidl/binder",
- visibility: ["//frameworks/native"],
+ visibility: [
+ "//frameworks/native",
+ "//frameworks/native/libs/gui",
+ ],
}
filegroup {
name: "framework_native_aidl_gui",
srcs: ["aidl/gui/**/*.aidl"],
path: "aidl/gui",
- visibility: ["//frameworks/native"],
+ visibility: [
+ "//frameworks/native",
+ "//frameworks/native/libs/gui",
+ ],
}
filegroup {
@@ -82,7 +88,7 @@
],
}
-cc_library_headers{
+cc_library_headers {
name: "libandroid_headers_private",
export_include_dirs: ["include/private"],
}
diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp
index d7bc500..e138212 100644
--- a/libs/gui/Android.bp
+++ b/libs/gui/Android.bp
@@ -184,7 +184,8 @@
],
srcs: [
- ":framework_native_aidl",
+ ":framework_native_aidl_binder",
+ ":framework_native_aidl_gui",
":inputconstants_aidl",
":libgui_bufferqueue_sources",
diff --git a/libs/gui/OWNERS b/libs/gui/OWNERS
index 45c958e..31bf895 100644
--- a/libs/gui/OWNERS
+++ b/libs/gui/OWNERS
@@ -2,9 +2,8 @@
alecmouri@google.com
chaviw@google.com
chrisforbes@google.com
-jessehall@google.com
lpy@google.com
-mathias@google.com
+jreck@google.com
racarr@google.com
vishnun@google.com
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h
index 9ee779c..5854674 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h
@@ -91,16 +91,9 @@
// Called after the HWC calls are made to present the display
virtual void onPresentDisplayCompleted() = 0;
- // Called after the surface has been rendering to signal the surface should
- // be made ready for displaying
- virtual void flip() = 0;
-
// Debugging - Dumps the state of the RenderSurface to a string
virtual void dump(std::string& result) const = 0;
- // Debugging - gets the page flip count for the RenderSurface
- virtual std::uint32_t getPageFlipCount() const = 0;
-
// Returns true if the render surface supports client composition prediction.
virtual bool supportsCompositionStrategyPrediction() const = 0;
};
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h
index e4cb113..1c14a43 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h
@@ -62,15 +62,12 @@
base::unique_fd* bufferFence) override;
void queueBuffer(base::unique_fd readyFence) override;
void onPresentDisplayCompleted() override;
- void flip() override;
bool supportsCompositionStrategyPrediction() const override;
// Debugging
void dump(std::string& result) const override;
- std::uint32_t getPageFlipCount() const override;
// Testing
- void setPageFlipCountForTest(std::uint32_t);
void setSizeForTest(const ui::Size&);
std::shared_ptr<renderengine::ExternalTexture>& mutableTextureForTest();
base::unique_fd& mutableBufferReadyForTest();
@@ -89,7 +86,6 @@
ui::Size mSize;
const size_t mMaxTextureCacheSize;
bool mProtected{false};
- std::uint32_t mPageFlipCount{0};
};
std::unique_ptr<compositionengine::RenderSurface> createRenderSurface(
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h
index e12aebb..af8d4bc 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h
@@ -42,9 +42,7 @@
MOCK_METHOD1(dequeueBuffer, std::shared_ptr<renderengine::ExternalTexture>(base::unique_fd*));
MOCK_METHOD1(queueBuffer, void(base::unique_fd));
MOCK_METHOD0(onPresentDisplayCompleted, void());
- MOCK_METHOD0(flip, void());
MOCK_CONST_METHOD1(dump, void(std::string& result));
- MOCK_CONST_METHOD0(getPageFlipCount, std::uint32_t());
MOCK_CONST_METHOD0(supportsCompositionStrategyPrediction, bool());
};
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index a98aed2..8ebc5b1 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -1493,7 +1493,6 @@
auto& outputState = editState();
outputState.dirtyRegion.clear();
- mRenderSurface->flip();
auto frame = presentAndGetFrameFences();
diff --git a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp
index 5a3af7b..0fe55db 100644
--- a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp
@@ -251,10 +251,6 @@
mDisplaySurface->onFrameCommitted();
}
-void RenderSurface::flip() {
- mPageFlipCount++;
-}
-
void RenderSurface::dump(std::string& out) const {
using android::base::StringAppendF;
@@ -265,7 +261,6 @@
dumpVal(out, "size", mSize);
StringAppendF(&out, "ANativeWindow=%p (format %d) ", mNativeWindow.get(),
ANativeWindow_getFormat(mNativeWindow.get()));
- dumpVal(out, "flips", mPageFlipCount);
out.append("\n");
String8 surfaceDump;
@@ -273,14 +268,6 @@
out.append(surfaceDump);
}
-std::uint32_t RenderSurface::getPageFlipCount() const {
- return mPageFlipCount;
-}
-
-void RenderSurface::setPageFlipCountForTest(std::uint32_t count) {
- mPageFlipCount = count;
-}
-
void RenderSurface::setSizeForTest(const ui::Size& size) {
mSize = size;
}
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 657084a..ad0fb9d 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -3227,7 +3227,6 @@
// setup below are satisfied in the specific order.
InSequence seq;
- EXPECT_CALL(*mRenderSurface, flip());
EXPECT_CALL(mOutput, presentAndGetFrameFences()).WillOnce(Return(frameFences));
EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
@@ -3250,7 +3249,6 @@
frameFences.layerFences.emplace(&mLayer2.hwc2Layer, layer2Fence);
frameFences.layerFences.emplace(&mLayer3.hwc2Layer, layer3Fence);
- EXPECT_CALL(*mRenderSurface, flip());
EXPECT_CALL(mOutput, presentAndGetFrameFences()).WillOnce(Return(frameFences));
EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
@@ -3284,7 +3282,6 @@
frameFences.layerFences.emplace(&mLayer2.hwc2Layer, sp<Fence>::make());
frameFences.layerFences.emplace(&mLayer3.hwc2Layer, sp<Fence>::make());
- EXPECT_CALL(*mRenderSurface, flip());
EXPECT_CALL(mOutput, presentAndGetFrameFences()).WillOnce(Return(frameFences));
EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
@@ -3320,7 +3317,6 @@
Output::FrameFences frameFences;
frameFences.presentFence = presentFence;
- EXPECT_CALL(*mRenderSurface, flip());
EXPECT_CALL(mOutput, presentAndGetFrameFences()).WillOnce(Return(frameFences));
EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
diff --git a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp
index 8c793b0..83937a6 100644
--- a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp
@@ -362,17 +362,5 @@
mSurface.onPresentDisplayCompleted();
}
-/*
- * RenderSurface::flip()
- */
-
-TEST_F(RenderSurfaceTest, flipForwardsSignal) {
- mSurface.setPageFlipCountForTest(500);
-
- mSurface.flip();
-
- EXPECT_EQ(501u, mSurface.getPageFlipCount());
-}
-
} // namespace
} // namespace android::compositionengine
diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
index 27f4311..cc9f7cf 100644
--- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp
@@ -100,14 +100,8 @@
return getExpectedCallbackTime(nextVsyncTime, timing);
}
- bool const alreadyDispatchedForVsync = mLastDispatchTime &&
- ((*mLastDispatchTime + mMinVsyncDistance) >= nextVsyncTime &&
- (*mLastDispatchTime - mMinVsyncDistance) <= nextVsyncTime);
- if (alreadyDispatchedForVsync) {
- nextVsyncTime =
- tracker.nextAnticipatedVSyncTimeFrom(*mLastDispatchTime + mMinVsyncDistance);
- nextWakeupTime = nextVsyncTime - timing.workDuration - timing.readyDuration;
- }
+ nextVsyncTime = adjustVsyncIfNeeded(tracker, nextVsyncTime);
+ nextWakeupTime = nextVsyncTime - timing.workDuration - timing.readyDuration;
auto const nextReadyTime = nextVsyncTime - timing.readyDuration;
mScheduleTiming = timing;
@@ -123,6 +117,25 @@
return mWorkloadUpdateInfo.has_value();
}
+nsecs_t VSyncDispatchTimerQueueEntry::adjustVsyncIfNeeded(VSyncTracker& tracker,
+ nsecs_t nextVsyncTime) const {
+ bool const alreadyDispatchedForVsync = mLastDispatchTime &&
+ ((*mLastDispatchTime + mMinVsyncDistance) >= nextVsyncTime &&
+ (*mLastDispatchTime - mMinVsyncDistance) <= nextVsyncTime);
+ const nsecs_t currentPeriod = tracker.currentPeriod();
+ bool const nextVsyncTooClose = mLastDispatchTime &&
+ (nextVsyncTime - *mLastDispatchTime + mMinVsyncDistance) <= currentPeriod;
+ if (alreadyDispatchedForVsync) {
+ return tracker.nextAnticipatedVSyncTimeFrom(*mLastDispatchTime + mMinVsyncDistance);
+ }
+
+ if (nextVsyncTooClose) {
+ return tracker.nextAnticipatedVSyncTimeFrom(*mLastDispatchTime + currentPeriod);
+ }
+
+ return nextVsyncTime;
+}
+
void VSyncDispatchTimerQueueEntry::update(VSyncTracker& tracker, nsecs_t now) {
if (!mArmedInfo && !mWorkloadUpdateInfo) {
return;
@@ -136,7 +149,9 @@
const auto earliestReadyBy = now + mScheduleTiming.workDuration + mScheduleTiming.readyDuration;
const auto earliestVsync = std::max(earliestReadyBy, mScheduleTiming.earliestVsync);
- const auto nextVsyncTime = tracker.nextAnticipatedVSyncTimeFrom(earliestVsync);
+ const auto nextVsyncTime =
+ adjustVsyncIfNeeded(tracker, /*nextVsyncTime*/
+ tracker.nextAnticipatedVSyncTimeFrom(earliestVsync));
const auto nextReadyTime = nextVsyncTime - mScheduleTiming.readyDuration;
const auto nextWakeupTime = nextReadyTime - mScheduleTiming.workDuration;
diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.h b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.h
index 4923031..4f2f87a 100644
--- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.h
+++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.h
@@ -84,6 +84,8 @@
void dump(std::string& result) const;
private:
+ nsecs_t adjustVsyncIfNeeded(VSyncTracker& tracker, nsecs_t nextVsyncTime) const;
+
const std::string mName;
const VSyncDispatch::Callback mCallback;
diff --git a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp
index b7f968d..f660753 100644
--- a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp
+++ b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp
@@ -44,6 +44,8 @@
ON_CALL(*this, nextAnticipatedVSyncTimeFrom(_))
.WillByDefault(Invoke(this, &MockVSyncTracker::nextVSyncTime));
ON_CALL(*this, addVsyncTimestamp(_)).WillByDefault(Return(true));
+ ON_CALL(*this, currentPeriod())
+ .WillByDefault(Invoke(this, &MockVSyncTracker::getCurrentPeriod));
}
MOCK_METHOD1(addVsyncTimestamp, bool(nsecs_t));
@@ -62,6 +64,8 @@
return (timePoint - (timePoint % mPeriod) + mPeriod);
}
+ nsecs_t getCurrentPeriod() const { return mPeriod; }
+
protected:
nsecs_t const mPeriod;
};
@@ -393,6 +397,43 @@
EXPECT_THAT(cb1.mCalls[0], Eq(1063));
}
+TEST_F(VSyncDispatchTimerQueueTest, noCloseCallbacksAfterPeriodChange) {
+ EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
+ .Times(4)
+ .WillOnce(Return(1000))
+ .WillOnce(Return(2000))
+ .WillOnce(Return(2500))
+ .WillOnce(Return(4000));
+
+ Sequence seq;
+ EXPECT_CALL(mMockClock, alarmAt(_, 900)).InSequence(seq);
+ EXPECT_CALL(mMockClock, alarmAt(_, 1900)).InSequence(seq);
+ EXPECT_CALL(mMockClock, alarmAt(_, 3900)).InSequence(seq);
+
+ CountingCallback cb(mDispatch);
+
+ mDispatch.schedule(cb, {.workDuration = 100, .readyDuration = 0, .earliestVsync = 0});
+
+ advanceToNextCallback();
+
+ ASSERT_THAT(cb.mCalls.size(), Eq(1));
+ EXPECT_THAT(cb.mCalls[0], Eq(1000));
+
+ mDispatch.schedule(cb, {.workDuration = 100, .readyDuration = 0, .earliestVsync = 1000});
+
+ advanceToNextCallback();
+
+ ASSERT_THAT(cb.mCalls.size(), Eq(2));
+ EXPECT_THAT(cb.mCalls[1], Eq(2000));
+
+ mDispatch.schedule(cb, {.workDuration = 100, .readyDuration = 0, .earliestVsync = 2000});
+
+ advanceToNextCallback();
+
+ ASSERT_THAT(cb.mCalls.size(), Eq(3));
+ EXPECT_THAT(cb.mCalls[2], Eq(4000));
+}
+
TEST_F(VSyncDispatchTimerQueueTest, rearmsFaroutTimeoutWhenCancellingCloseOne) {
EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
.Times(4)