summaryrefslogtreecommitdiff
path: root/libs/gui/BLASTBufferQueue.cpp
diff options
context:
space:
mode:
author Robert Carr <racarr@google.com> 2020-10-13 18:22:51 -0700
committer Robert Carr <racarr@google.com> 2020-10-19 12:32:18 -0700
commit05086b2572be79b7d86033e77e5ce117ce6dbd08 (patch)
treeb6046c8ec9bd38ec0ad441ac59546fd2beee7719 /libs/gui/BLASTBufferQueue.cpp
parent9aa774d1beb90f1a083747f4de6382aa2d28ec60 (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.cpp23
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