diff options
| author | 2020-10-13 18:22:51 -0700 | |
|---|---|---|
| committer | 2020-10-19 12:32:18 -0700 | |
| commit | 05086b2572be79b7d86033e77e5ce117ce6dbd08 (patch) | |
| tree | b6046c8ec9bd38ec0ad441ac59546fd2beee7719 /libs/gui/BLASTBufferQueue.cpp | |
| parent | 9aa774d1beb90f1a083747f4de6382aa2d28ec60 (diff) | |
BLASTBufferQueue: Handler allocateBuffers on thread.
allocateBuffers is a one-way method in the IGBP interface. In
the non-BLAST case the IGBP is hosted in SF and allocateBuffers
is therefore a one-way binder call executed asynchronously on an
SF binder thread. In the BLAST case the IGBP will be in process and so
allocateBuffers will execute in a blocking fashion. Callers don't like
being blocked when they weren't before, so we want to emulate this
behavior in BLASTBufferQueue. We introduce a Surface subclass
(BBQSurface) which overrides allocateBuffers and pushes the operation to
a new thread.
Bug: 168504871
Test: asit/perf/appstartup_all_apps_cyclic_dropcache_test . Enabling
BLAST triggers regression, but applying this removes the regression.
Change-Id: If6bb411e021ba2e0886dfe96b1a1a1489e3627b8
Diffstat (limited to 'libs/gui/BLASTBufferQueue.cpp')
| -rw-r--r-- | libs/gui/BLASTBufferQueue.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 0b942199c3..82c963be7b 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -23,6 +23,7 @@ #include <gui/BLASTBufferQueue.h> #include <gui/BufferItemConsumer.h> #include <gui/GLConsumer.h> +#include <gui/Surface.h> #include <utils/Trace.h> @@ -352,4 +353,26 @@ bool BLASTBufferQueue::maxBuffersAcquired() const { (!mInitialCallbackReceived && mNumAcquired == 1); } +class BBQSurface : public Surface { +public: + BBQSurface(const sp<IGraphicBufferProducer>& igbp, bool controlledByApp) : + Surface(igbp, controlledByApp) { + } + void allocateBuffers() override { + uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth; + uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight; + auto gbp = getIGraphicBufferProducer(); + std::thread ([reqWidth, reqHeight, gbp=getIGraphicBufferProducer(), + reqFormat=mReqFormat, reqUsage=mReqUsage] () { + gbp->allocateBuffers(reqWidth, reqHeight, + reqFormat, reqUsage); + + }).detach(); + } +}; + +sp<Surface> BLASTBufferQueue::getSurface() { + return new BBQSurface(mProducer, true); +} + } // namespace android |