Loading libs/gui/BufferQueueProducer.cpp +8 −8 Original line number Original line Diff line number Diff line Loading @@ -989,14 +989,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCallbackCondition.broadcast(); 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. // Update and get FrameEventHistory. nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); NewFrameEventsEntry newFrameEventsEntry = { NewFrameEventsEntry newFrameEventsEntry = { Loading @@ -1008,6 +1000,14 @@ status_t BufferQueueProducer::queueBuffer(int slot, addAndGetFrameTimestamps(&newFrameEventsEntry, addAndGetFrameTimestamps(&newFrameEventsEntry, getFrameTimestamps ? &output->frameTimestamps : nullptr); 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; return NO_ERROR; } } Loading services/surfaceflinger/TimeStats/TimeStats.cpp +18 −0 Original line number Original line 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.latchTime = latchTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.desiredTime = desiredTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireTime = acquireTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireFence = acquireFence; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.presentTime = presentTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.presentFence = presentFence; timeRecord.presentFence = presentFence; Loading Loading
libs/gui/BufferQueueProducer.cpp +8 −8 Original line number Original line Diff line number Diff line Loading @@ -989,14 +989,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, mCallbackCondition.broadcast(); 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. // Update and get FrameEventHistory. nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t postedTime = systemTime(SYSTEM_TIME_MONOTONIC); NewFrameEventsEntry newFrameEventsEntry = { NewFrameEventsEntry newFrameEventsEntry = { Loading @@ -1008,6 +1000,14 @@ status_t BufferQueueProducer::queueBuffer(int slot, addAndGetFrameTimestamps(&newFrameEventsEntry, addAndGetFrameTimestamps(&newFrameEventsEntry, getFrameTimestamps ? &output->frameTimestamps : nullptr); 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; return NO_ERROR; } } Loading
services/surfaceflinger/TimeStats/TimeStats.cpp +18 −0 Original line number Original line 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.latchTime = latchTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.desiredTime = desiredTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireTime = acquireTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.acquireFence = acquireFence; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.presentTime = presentTime; 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); std::lock_guard<std::mutex> lock(mMutex); if (!timeStatsTracker.count(layerName)) return; if (!timeStatsTracker.count(layerName)) return; LayerRecord& layerRecord = timeStatsTracker[layerName]; LayerRecord& layerRecord = timeStatsTracker[layerName]; if (layerRecord.waitData < 0 || layerRecord.waitData >= static_cast<int32_t>(layerRecord.timeRecords.size())) return; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; TimeRecord& timeRecord = layerRecord.timeRecords[layerRecord.waitData]; if (timeRecord.frameNumber == frameNumber) { if (timeRecord.frameNumber == frameNumber) { timeRecord.presentFence = presentFence; timeRecord.presentFence = presentFence; Loading