SF: pass expectedPresentTime to composer
Bug: 198186194
Test: VTS
Change-Id: I1265f4f016fc83a9e730c1eb6a00532c968b0a79
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
index 3bed796..6f2880d 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -256,6 +256,7 @@
bool AidlComposer::isSupported(OptionalFeature feature) const {
switch (feature) {
case OptionalFeature::RefreshRateSwitching:
+ case OptionalFeature::ExpectedPresentTime:
return true;
}
}
@@ -580,10 +581,11 @@
return Error::NONE;
}
-Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests) {
+Error AidlComposer::validateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests) {
ATRACE_NAME("HwcValidateDisplay");
- mWriter.validateDisplay(translate<int64_t>(display));
+ mWriter.validateDisplay(translate<int64_t>(display),
+ ClockMonotonicTimestamp{expectedPresentTime});
Error error = execute();
if (error != Error::NONE) {
@@ -595,11 +597,12 @@
return Error::NONE;
}
-Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests, int* outPresentFence,
- uint32_t* state) {
+Error AidlComposer::presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests,
+ int* outPresentFence, uint32_t* state) {
ATRACE_NAME("HwcPresentOrValidateDisplay");
- mWriter.presentOrvalidateDisplay(translate<int64_t>(display));
+ mWriter.presentOrvalidateDisplay(translate<int64_t>(display),
+ ClockMonotonicTimestamp{expectedPresentTime});
Error error = execute();
if (error != Error::NONE) {
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
index fa33d96..6aae562 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
@@ -124,10 +124,11 @@
Error setClientTargetSlotCount(Display display) override;
- Error validateDisplay(Display display, uint32_t* outNumTypes,
+ Error validateDisplay(Display display, nsecs_t expectedPresentTime, uint32_t* outNumTypes,
uint32_t* outNumRequests) override;
- Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes, uint32_t* outNumRequests,
+ Error presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests,
int* outPresentFence, uint32_t* state) override;
Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override;
diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h
index 6f2aa78..84e227d 100644
--- a/services/surfaceflinger/DisplayHardware/ComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h
@@ -77,6 +77,7 @@
enum class OptionalFeature {
RefreshRateSwitching,
+ ExpectedPresentTime,
};
virtual bool isSupported(OptionalFeature) const = 0;
@@ -146,12 +147,12 @@
virtual Error setClientTargetSlotCount(Display display) = 0;
- virtual Error validateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests) = 0;
+ virtual Error validateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests) = 0;
- virtual Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests, int* outPresentFence,
- uint32_t* state) = 0;
+ virtual Error presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests,
+ int* outPresentFence, uint32_t* state) = 0;
virtual Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) = 0;
/* see setClientTarget for the purpose of slot */
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index 5dbec05..b1f7808 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -492,11 +492,11 @@
return static_cast<Error>(intError);
}
-Error Display::validate(uint32_t* outNumTypes, uint32_t* outNumRequests)
-{
+Error Display::validate(nsecs_t expectedPresentTime, uint32_t* outNumTypes,
+ uint32_t* outNumRequests) {
uint32_t numTypes = 0;
uint32_t numRequests = 0;
- auto intError = mComposer.validateDisplay(mId, &numTypes, &numRequests);
+ auto intError = mComposer.validateDisplay(mId, expectedPresentTime, &numTypes, &numRequests);
auto error = static_cast<Error>(intError);
if (error != Error::NONE && !hasChangesError(error)) {
return error;
@@ -507,14 +507,14 @@
return error;
}
-Error Display::presentOrValidate(uint32_t* outNumTypes, uint32_t* outNumRequests,
- sp<android::Fence>* outPresentFence, uint32_t* state) {
-
+Error Display::presentOrValidate(nsecs_t expectedPresentTime, uint32_t* outNumTypes,
+ uint32_t* outNumRequests, sp<android::Fence>* outPresentFence,
+ uint32_t* state) {
uint32_t numTypes = 0;
uint32_t numRequests = 0;
int32_t presentFenceFd = -1;
- auto intError = mComposer.presentOrValidateDisplay(
- mId, &numTypes, &numRequests, &presentFenceFd, state);
+ auto intError = mComposer.presentOrValidateDisplay(mId, expectedPresentTime, &numTypes,
+ &numRequests, &presentFenceFd, state);
auto error = static_cast<Error>(intError);
if (error != Error::NONE && !hasChangesError(error)) {
return error;
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h
index 1425c61..40bfcd3 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2.h
@@ -134,10 +134,11 @@
const android::sp<android::Fence>& releaseFence) = 0;
[[clang::warn_unused_result]] virtual hal::Error setPowerMode(hal::PowerMode mode) = 0;
[[clang::warn_unused_result]] virtual hal::Error setVsyncEnabled(hal::Vsync enabled) = 0;
- [[clang::warn_unused_result]] virtual hal::Error validate(uint32_t* outNumTypes,
+ [[clang::warn_unused_result]] virtual hal::Error validate(nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes,
uint32_t* outNumRequests) = 0;
[[clang::warn_unused_result]] virtual hal::Error presentOrValidate(
- uint32_t* outNumTypes, uint32_t* outNumRequests,
+ nsecs_t expectedPresentTime, uint32_t* outNumTypes, uint32_t* outNumRequests,
android::sp<android::Fence>* outPresentFence, uint32_t* state) = 0;
[[clang::warn_unused_result]] virtual std::future<hal::Error> setDisplayBrightness(
float brightness) = 0;
@@ -202,8 +203,10 @@
const android::sp<android::Fence>& releaseFence) override;
hal::Error setPowerMode(hal::PowerMode) override;
hal::Error setVsyncEnabled(hal::Vsync enabled) override;
- hal::Error validate(uint32_t* outNumTypes, uint32_t* outNumRequests) override;
- hal::Error presentOrValidate(uint32_t* outNumTypes, uint32_t* outNumRequests,
+ hal::Error validate(nsecs_t expectedPresentTime, uint32_t* outNumTypes,
+ uint32_t* outNumRequests) override;
+ hal::Error presentOrValidate(nsecs_t expectedPresentTime, uint32_t* outNumTypes,
+ uint32_t* outNumRequests,
android::sp<android::Fence>* outPresentFence,
uint32_t* state) override;
std::future<hal::Error> setDisplayBrightness(float brightness) override;
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 514c879..7ed564f 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -459,7 +459,7 @@
status_t HWComposer::getDeviceCompositionChanges(
HalDisplayId displayId, bool frameUsesClientComposition,
std::chrono::steady_clock::time_point earliestPresentTime,
- const std::shared_ptr<FenceTime>& previousPresentFence,
+ const std::shared_ptr<FenceTime>& previousPresentFence, nsecs_t expectedPresentTime,
std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {
ATRACE_CALL();
@@ -481,16 +481,30 @@
// earliest time to present. Otherwise, we may present a frame too early.
// 2. There is no client composition. Otherwise, we first need to render the
// client target buffer.
- const bool prevFencePending =
- previousPresentFence->getSignalTime() == Fence::SIGNAL_TIME_PENDING;
- const bool canPresentEarly =
- !prevFencePending && std::chrono::steady_clock::now() < earliestPresentTime;
- const bool canSkipValidate = !canPresentEarly && !frameUsesClientComposition;
+ const bool canSkipValidate = [&] {
+ // We must call validate if we have client composition
+ if (frameUsesClientComposition) {
+ return false;
+ }
+
+ // If composer supports getting the expected present time, we can skip
+ // as composer will make sure to prevent early presentation
+ if (mComposer->isSupported(Hwc2::Composer::OptionalFeature::ExpectedPresentTime)) {
+ return true;
+ }
+
+ // composer doesn't support getting the expected present time. We can only
+ // skip validate if we know that we are not going to present early.
+ return std::chrono::steady_clock::now() >= earliestPresentTime ||
+ previousPresentFence->getSignalTime() == Fence::SIGNAL_TIME_PENDING;
+ }();
+
displayData.validateWasSkipped = false;
if (canSkipValidate) {
sp<Fence> outPresentFence;
uint32_t state = UINT32_MAX;
- error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);
+ error = hwcDisplay->presentOrValidate(expectedPresentTime, &numTypes, &numRequests,
+ &outPresentFence, &state);
if (!hasChangesError(error)) {
RETURN_IF_HWC_ERROR_FOR("presentOrValidate", error, displayId, UNKNOWN_ERROR);
}
@@ -505,7 +519,7 @@
}
// Present failed but Validate ran.
} else {
- error = hwcDisplay->validate(&numTypes, &numRequests);
+ error = hwcDisplay->validate(expectedPresentTime, &numTypes, &numRequests);
}
ALOGV("SkipValidate failed, Falling back to SLOW validate/present");
if (!hasChangesError(error)) {
@@ -571,9 +585,11 @@
return NO_ERROR;
}
- const bool previousFramePending =
- previousPresentFence->getSignalTime() == Fence::SIGNAL_TIME_PENDING;
- if (!previousFramePending) {
+ const bool waitForEarliestPresent =
+ !mComposer->isSupported(Hwc2::Composer::OptionalFeature::ExpectedPresentTime) &&
+ previousPresentFence->getSignalTime() != Fence::SIGNAL_TIME_PENDING;
+
+ if (waitForEarliestPresent) {
ATRACE_NAME("wait for earliest present time");
std::this_thread::sleep_until(earliestPresentTime);
}
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index aa4abdf..6d33f52 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -134,7 +134,7 @@
virtual status_t getDeviceCompositionChanges(
HalDisplayId, bool frameUsesClientComposition,
std::chrono::steady_clock::time_point earliestPresentTime,
- const std::shared_ptr<FenceTime>& previousPresentFence,
+ const std::shared_ptr<FenceTime>& previousPresentFence, nsecs_t expectedPresentTime,
std::optional<DeviceRequestedChanges>* outChanges) = 0;
virtual status_t setClientTarget(HalDisplayId, uint32_t slot, const sp<Fence>& acquireFence,
@@ -280,7 +280,7 @@
status_t getDeviceCompositionChanges(
HalDisplayId, bool frameUsesClientComposition,
std::chrono::steady_clock::time_point earliestPresentTime,
- const std::shared_ptr<FenceTime>& previousPresentFence,
+ const std::shared_ptr<FenceTime>& previousPresentFence, nsecs_t expectedPresentTime,
std::optional<DeviceRequestedChanges>* outChanges) override;
status_t setClientTarget(HalDisplayId, uint32_t slot, const sp<Fence>& acquireFence,
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
index ab16027..c3214d8 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
@@ -158,6 +158,8 @@
switch (feature) {
case OptionalFeature::RefreshRateSwitching:
return mClient_2_4 != nullptr;
+ case OptionalFeature::ExpectedPresentTime:
+ return false;
}
}
@@ -540,8 +542,8 @@
return unwrapRet(ret);
}
-Error HidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests) {
+Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
+ uint32_t* outNumTypes, uint32_t* outNumRequests) {
ATRACE_NAME("HwcValidateDisplay");
mWriter.selectDisplay(display);
mWriter.validateDisplay();
@@ -556,9 +558,9 @@
return Error::NONE;
}
-Error HidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
- uint32_t* outNumRequests, int* outPresentFence,
- uint32_t* state) {
+Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
+ uint32_t* outNumTypes, uint32_t* outNumRequests,
+ int* outPresentFence, uint32_t* state) {
ATRACE_NAME("HwcPresentOrValidateDisplay");
mWriter.selectDisplay(display);
mWriter.presentOrvalidateDisplay();
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
index d60d12c..fdb2cbd 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
@@ -235,10 +235,11 @@
Error setClientTargetSlotCount(Display display) override;
- Error validateDisplay(Display display, uint32_t* outNumTypes,
+ Error validateDisplay(Display display, nsecs_t expectedPresentTime, uint32_t* outNumTypes,
uint32_t* outNumRequests) override;
- Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes, uint32_t* outNumRequests,
+ Error presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
+ uint32_t* outNumTypes, uint32_t* outNumRequests,
int* outPresentFence, uint32_t* state) override;
Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override;