diff options
| author | 2019-05-03 15:12:21 +0000 | |
|---|---|---|
| committer | 2019-05-03 15:12:21 +0000 | |
| commit | 790b6b9e8688f43daa8c6ad227abd64fdb318668 (patch) | |
| tree | 93f874215592c0a382e564b59346b2137289a1b3 /services/surfaceflinger/RegionSamplingThread.cpp | |
| parent | 230171daa7a69959130fada320fac82eca8ec690 (diff) | |
| parent | 4efd1f505ce5587bba57e79dfb54eb1daff59eec (diff) | |
Merge "sf: reuse luma sampling buffer when available" into qt-dev
Diffstat (limited to 'services/surfaceflinger/RegionSamplingThread.cpp')
| -rw-r--r-- | services/surfaceflinger/RegionSamplingThread.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 252ff0d611..0d142675db 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -377,10 +377,15 @@ void RegionSamplingThread::captureSample() { mFlinger.traverseLayersInDisplay(device, filterVisitor); }; - const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; - sp<GraphicBuffer> buffer = - new GraphicBuffer(sampledArea.getWidth(), sampledArea.getHeight(), - PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); + sp<GraphicBuffer> buffer = nullptr; + if (mCachedBuffer && mCachedBuffer->getWidth() == sampledArea.getWidth() && + mCachedBuffer->getHeight() == sampledArea.getHeight()) { + buffer = mCachedBuffer; + } else { + const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; + buffer = new GraphicBuffer(sampledArea.getWidth(), sampledArea.getHeight(), + PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); + } // When calling into SF, we post a message into the SF message queue (so the // screen capture runs on the main thread). This message blocks until the @@ -415,6 +420,12 @@ void RegionSamplingThread::captureSample() { for (size_t d = 0; d < activeDescriptors.size(); ++d) { activeDescriptors[d].listener->onSampleCollected(lumas[d]); } + + // Extend the lifetime of mCachedBuffer from the previous frame to here to ensure that: + // 1) The region sampling thread is the last owner of the buffer, and the freeing of the buffer + // happens in this thread, as opposed to the main thread. + // 2) The listener(s) receive their notifications prior to freeing the buffer. + mCachedBuffer = buffer; ATRACE_INT(lumaSamplingStepTag, static_cast<int>(samplingStep::noWorkNeeded)); } |