diff options
Diffstat (limited to 'libs/gui/Surface.cpp')
-rw-r--r-- | libs/gui/Surface.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 1149b8980b..41221aab8d 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -52,6 +52,8 @@ Surface::Surface( mAutoRefresh(false), mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT), mSharedBufferHasBeenQueued(false), + mQueriedSupportedTimestamps(false), + mFrameTimestampsSupportsPresent(false), mEnableFrameTimestamps(false), mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) { @@ -209,8 +211,8 @@ static bool checkConsumerForUpdates( bool checkForDisplayPresent = (outDisplayPresentTime != nullptr) && !e->hasDisplayPresentInfo(); - // LastRefreshStart, DequeueReady, and Release are never - // available for the last frame. + // LastRefreshStart, DequeueReady, and Release are never available for the + // last frame. bool checkForLastRefreshStart = (outLastRefreshStartTime != nullptr) && !e->hasLastRefreshStartInfo() && (e->frameNumber != lastFrameNumber); @@ -252,6 +254,12 @@ status_t Surface::getFrameTimestamps(uint64_t frameNumber, return INVALID_OPERATION; } + // Verify the requested timestamps are supported. + querySupportedTimestampsLocked(); + if (outDisplayPresentTime != nullptr && !mFrameTimestampsSupportsPresent) { + return BAD_VALUE; + } + FrameEvents* events = mFrameEventHistory->getFrame(frameNumber); if (events == nullptr) { // If the entry isn't available in the producer, it's definitely not @@ -739,6 +747,29 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { return err; } +void Surface::querySupportedTimestampsLocked() const { + // mMutex must be locked when calling this method. + + if (mQueriedSupportedTimestamps) { + return; + } + mQueriedSupportedTimestamps = true; + + std::vector<FrameEvent> supportedFrameTimestamps; + status_t err = composerService()->getSupportedFrameTimestamps( + &supportedFrameTimestamps); + + if (err != NO_ERROR) { + return; + } + + for (auto sft : supportedFrameTimestamps) { + if (sft == FrameEvent::DISPLAY_PRESENT) { + mFrameTimestampsSupportsPresent = true; + } + } +} + int Surface::query(int what, int* value) const { ATRACE_CALL(); ALOGV("Surface::query"); @@ -800,6 +831,11 @@ int Surface::query(int what, int* value) const { static_cast<int>(durationUs); return NO_ERROR; } + case NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT: { + querySupportedTimestampsLocked(); + *value = mFrameTimestampsSupportsPresent ? 1 : 0; + return NO_ERROR; + } case NATIVE_WINDOW_IS_VALID: { *value = mGraphicBufferProducer != nullptr ? 1 : 0; return NO_ERROR; |