Loading libs/gui/BufferQueueProducer.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -989,14 +989,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCallbackCondition.broadcast(); } // Wait without lock held if (connectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. lastQueuedFence->waitForever("Throttling EGL Production"); } // Update and get FrameEventHistory. nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); NewFrameEventsEntry newFrameEventsEntry = { Loading @@ -1008,6 +1000,14 @@ status_t BufferQueueProducer::queueBuffer(int slot, addAndGetFrameTimestamps(&newFrameEventsEntry, getFrameTimestamps ? &output->frameTimestamps : nullptr); // Wait without lock held if (connectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. lastQueuedFence->waitForever("Throttling EGL Production"); } return NO_ERROR; } Loading services/surfaceflinger/TimeStats/TimeStats.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,9 @@ void TimeStats::setLatchTime(const std::string& layerName, uint64_t frameNumber, std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.latchTime = latchTime; Loading @@ -294,6 +297,9 @@ void TimeStats::setDesiredTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.desiredTime = desiredTime; Loading @@ -311,6 +317,9 @@ void TimeStats::setAcquireTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireTime = acquireTime; Loading @@ -328,6 +337,9 @@ void TimeStats::setAcquireFence(const std::string& layerName, uint64_t frameNumb std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireFence = acquireFence; Loading @@ -345,6 +357,9 @@ void TimeStats::setPresentTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.presentTime = presentTime; Loading @@ -366,6 +381,9 @@ void TimeStats::setPresentFence(const std::string& layerName, uint64_t frameNumb std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.presentFence = presentFence; Loading Loading
libs/gui/BufferQueueProducer.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -989,14 +989,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCallbackCondition.broadcast(); } // Wait without lock held if (connectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. lastQueuedFence->waitForever("Throttling EGL Production"); } // Update and get FrameEventHistory. nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); NewFrameEventsEntry newFrameEventsEntry = { Loading @@ -1008,6 +1000,14 @@ status_t BufferQueueProducer::queueBuffer(int slot, addAndGetFrameTimestamps(&newFrameEventsEntry, getFrameTimestamps ? &output->frameTimestamps : nullptr); // Wait without lock held if (connectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. lastQueuedFence->waitForever("Throttling EGL Production"); } return NO_ERROR; } Loading
services/surfaceflinger/TimeStats/TimeStats.cpp +18 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,9 @@ void TimeStats::setLatchTime(const std::string& layerName, uint64_t frameNumber, std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.latchTime = latchTime; Loading @@ -294,6 +297,9 @@ void TimeStats::setDesiredTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.desiredTime = desiredTime; Loading @@ -311,6 +317,9 @@ void TimeStats::setAcquireTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireTime = acquireTime; Loading @@ -328,6 +337,9 @@ void TimeStats::setAcquireFence(const std::string& layerName, uint64_t frameNumb std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireFence = acquireFence; Loading @@ -345,6 +357,9 @@ void TimeStats::setPresentTime(const std::string& layerName, uint64_t frameNumbe std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.presentTime = presentTime; Loading @@ -366,6 +381,9 @@ void TimeStats::setPresentFence(const std::string& layerName, uint64_t frameNumb std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { timeRecord.presentFence = presentFence; Loading