surfaceflinger: Track the last surfaceview frame for latency dumps

When measuring GL latency with dumpsys, it's possible to hit a
race condition if the hardware is fast enough to complete rendering
the test cycle before the latency dump is requested, since it only
matches the latency for live layers (unless it's an animation. See
change I8bded1ea08a4cddefef0aa955401052bb9107c90)

So always save a reference to the last rendered SurfaceView frame,
and dump its values if there isn't an active one.

Change-Id: I740e9830161396ea955b5a53322bd8576b5136bc
This commit is contained in:
Ricardo Cerqueira 2014-07-17 19:36:08 +01:00 committed by Steve Kondik
parent 00888b7eee
commit b87c456431

View File

@ -124,6 +124,8 @@ const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER"
const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER"); const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
const String16 sDump("android.permission.DUMP"); const String16 sDump("android.permission.DUMP");
static sp<Layer> lastSurfaceViewLayer;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
SurfaceFlinger::SurfaceFlinger() SurfaceFlinger::SurfaceFlinger()
@ -1174,6 +1176,10 @@ void SurfaceFlinger::setUpHWComposer() {
const sp<Layer>& layer(currentLayers[i]); const sp<Layer>& layer(currentLayers[i]);
layer->setPerFrameData(hw, *cur); layer->setPerFrameData(hw, *cur);
setOrientationEventControl(freezeSurfacePresent,id); setOrientationEventControl(freezeSurfacePresent,id);
if(!strncmp(layer->getName(), "SurfaceView",
11)) {
lastSurfaceViewLayer = layer;
}
} }
} }
} }
@ -2612,14 +2618,19 @@ void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index
if (name.isEmpty()) { if (name.isEmpty()) {
mAnimFrameTracker.dumpStats(result); mAnimFrameTracker.dumpStats(result);
} else { } else {
bool found = false;
const LayerVector& currentLayers = mCurrentState.layersSortedByZ; const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
const size_t count = currentLayers.size(); const size_t count = currentLayers.size();
for (size_t i=0 ; i<count ; i++) { for (size_t i=0 ; i<count ; i++) {
const sp<Layer>& layer(currentLayers[i]); const sp<Layer>& layer(currentLayers[i]);
if (name == layer->getName()) { if (name == layer->getName()) {
found = true;
layer->dumpFrameStats(result); layer->dumpFrameStats(result);
} }
} }
if (!found && !strncmp(name.string(), "SurfaceView", 11)) {
lastSurfaceViewLayer->dumpFrameStats(result);
}
} }
} }