summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/surfaceflinger/Scheduler/DispSync.cpp8
-rw-r--r--services/surfaceflinger/Scheduler/VSyncModulator.cpp29
-rw-r--r--services/surfaceflinger/Scheduler/VSyncModulator.h6
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp5
4 files changed, 28 insertions, 20 deletions
diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp
index 81be372091..83fd42b43f 100644
--- a/services/surfaceflinger/Scheduler/DispSync.cpp
+++ b/services/surfaceflinger/Scheduler/DispSync.cpp
@@ -92,8 +92,12 @@ public:
mPeriod = period;
if (!mModelLocked && referenceTimeChanged) {
for (auto& eventListener : mEventListeners) {
- eventListener.mLastEventTime =
- mReferenceTime - mPeriod + mPhase + eventListener.mPhase;
+ eventListener.mLastEventTime = mReferenceTime + mPhase + eventListener.mPhase;
+ // If mLastEventTime is after mReferenceTime (can happen when positive phase offsets
+ // are used) we treat it as like it happened in previous period.
+ if (eventListener.mLastEventTime > mReferenceTime) {
+ eventListener.mLastEventTime -= mPeriod;
+ }
}
}
if (mTraceDetailedInfo) {
diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.cpp b/services/surfaceflinger/Scheduler/VSyncModulator.cpp
index 381308ab34..d452c19b68 100644
--- a/services/surfaceflinger/Scheduler/VSyncModulator.cpp
+++ b/services/surfaceflinger/Scheduler/VSyncModulator.cpp
@@ -102,7 +102,7 @@ void VSyncModulator::onRefreshed(bool usedRenderEngine) {
VSyncModulator::Offsets VSyncModulator::getOffsets() {
std::lock_guard<std::mutex> lock(mMutex);
- return mOffsetMap.at(mOffsetType);
+ return mOffsets;
}
VSyncModulator::Offsets VSyncModulator::getNextOffsets() {
@@ -129,13 +129,13 @@ void VSyncModulator::updateOffsets() {
void VSyncModulator::updateOffsetsLocked() {
const Offsets desired = getNextOffsets();
- const Offsets current = mOffsetMap.at(mOffsetType);
+ const Offsets current = mOffsets;
bool changed = false;
if (desired.sf != current.sf) {
if (mSfConnectionHandle != nullptr) {
mScheduler->setPhaseOffset(mSfConnectionHandle, desired.sf);
- } else {
+ } else if (mSfEventThread != nullptr) {
mSfEventThread->setPhaseOffset(desired.sf);
}
changed = true;
@@ -143,36 +143,35 @@ void VSyncModulator::updateOffsetsLocked() {
if (desired.app != current.app) {
if (mAppConnectionHandle != nullptr) {
mScheduler->setPhaseOffset(mAppConnectionHandle, desired.app);
- } else {
+ } else if (mAppEventThread != nullptr) {
mAppEventThread->setPhaseOffset(desired.app);
}
changed = true;
}
if (changed) {
- updateOffsetType();
+ flushOffsets();
}
}
-void VSyncModulator::updateOffsetType() {
- mOffsetType = getNextOffsetType();
+void VSyncModulator::flushOffsets() {
+ OffsetType type = getNextOffsetType();
+ mOffsets = mOffsetMap.at(type);
if (!mTraceDetailedInfo) {
return;
}
- OffsetType type = mOffsetType;
- Offsets offsets = mOffsetMap.at(type);
ATRACE_INT("Vsync-EarlyOffsetsOn",
- offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Early);
+ mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Early);
ATRACE_INT("Vsync-EarlyGLOffsetsOn",
- offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::EarlyGl);
+ mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::EarlyGl);
ATRACE_INT("Vsync-LateOffsetsOn",
- offsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Late);
+ mOffsets.fpsMode == RefreshRateType::DEFAULT && type == OffsetType::Late);
ATRACE_INT("Vsync-HighFpsEarlyOffsetsOn",
- offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Early);
+ mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Early);
ATRACE_INT("Vsync-HighFpsEarlyGLOffsetsOn",
- offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::EarlyGl);
+ mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::EarlyGl);
ATRACE_INT("Vsync-HighFpsLateOffsetsOn",
- offsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Late);
+ mOffsets.fpsMode == RefreshRateType::PERFORMANCE && type == OffsetType::Late);
}
} // namespace android
diff --git a/services/surfaceflinger/Scheduler/VSyncModulator.h b/services/surfaceflinger/Scheduler/VSyncModulator.h
index c6374be83a..10cf8e6cc9 100644
--- a/services/surfaceflinger/Scheduler/VSyncModulator.h
+++ b/services/surfaceflinger/Scheduler/VSyncModulator.h
@@ -114,8 +114,8 @@ private:
// Updates offsets and persists them into the scheduler framework.
void updateOffsets() EXCLUDES(mMutex);
void updateOffsetsLocked() REQUIRES(mMutex);
- // Updates the internal offset type.
- void updateOffsetType() REQUIRES(mMutex);
+ // Updates the internal offsets and offset type.
+ void flushOffsets() REQUIRES(mMutex);
mutable std::mutex mMutex;
std::unordered_map<OffsetType, Offsets> mOffsetMap GUARDED_BY(mMutex);
@@ -128,7 +128,7 @@ private:
Scheduler::ConnectionHandle* mAppConnectionHandle = nullptr;
Scheduler::ConnectionHandle* mSfConnectionHandle = nullptr;
- OffsetType mOffsetType GUARDED_BY(mMutex) = OffsetType::Late;
+ Offsets mOffsets GUARDED_BY(mMutex) = {Scheduler::RefreshRateType::DEFAULT, 0, 0};
std::atomic<Scheduler::TransactionStart> mTransactionStart =
Scheduler::TransactionStart::NORMAL;
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 60c6e4ecee..459cd0af89 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -5665,6 +5665,11 @@ status_t SurfaceFlinger::captureScreen(uint64_t displayOrLayerStack, Dataspace*
captureOrientation = fromSurfaceComposerRotation(
static_cast<ISurfaceComposer::Rotation>(display->getOrientation()));
+ if (captureOrientation == ui::Transform::orientation_flags::ROT_90) {
+ captureOrientation = ui::Transform::orientation_flags::ROT_270;
+ } else if (captureOrientation == ui::Transform::orientation_flags::ROT_270) {
+ captureOrientation = ui::Transform::orientation_flags::ROT_90;
+ }
*outDataspace =
pickDataspaceFromColorMode(display->getCompositionDisplay()->getState().colorMode);
}