diff options
author | John Reck <jreck@google.com> | 2020-05-07 16:11:18 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2020-05-07 16:47:10 -0700 |
commit | 8ddbc59d55881b1595f48facd6f91a4bd2d2453a (patch) | |
tree | 36055d950683b32bab3e82ed9d91cc33d689e3ab /libs/hwui/renderthread/CanvasContext.cpp | |
parent | d59670170fd3fd761ac9d403596dfa93ef26275e (diff) |
Avoid excessive KGSL maps
Hook MIN_UNDEQUEUED_BUFFERS if possible to avoid thrashing kgsl
maps when render_ahead is being used
Bug: 143555869
Test: verified kgsl maps only happened once per buffer
Change-Id: I985fae0a9a7635be3a1cf6177186e5541a1169df
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 335bcdcfc1fb..a362bd220936 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -139,9 +139,30 @@ void CanvasContext::destroy() { mAnimationContext->destroy(); } +static void setBufferCount(ANativeWindow* window, uint32_t extraBuffers) { + int query_value; + int err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); + if (err != 0 || query_value < 0) { + ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err, query_value); + return; + } + auto min_undequeued_buffers = static_cast<uint32_t>(query_value); + + int bufferCount = min_undequeued_buffers + 2 + extraBuffers; + native_window_set_buffer_count(window, bufferCount); +} + void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { ATRACE_CALL(); + if (mRenderAheadDepth == 0 && DeviceInfo::get()->getMaxRefreshRate() > 66.6f) { + mFixedRenderAhead = false; + mRenderAheadCapacity = 1; + } else { + mFixedRenderAhead = true; + mRenderAheadCapacity = mRenderAheadDepth; + } + if (window) { mNativeSurface = std::make_unique<ReliableSurface>(window); mNativeSurface->init(); @@ -149,21 +170,17 @@ void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { // TODO: Fix error handling & re-shorten timeout ANativeWindow_setDequeueTimeout(window, 4000_ms); } + mNativeSurface->setExtraBufferCount(mRenderAheadCapacity); } else { mNativeSurface = nullptr; } - if (mRenderAheadDepth == 0 && DeviceInfo::get()->getMaxRefreshRate() > 66.6f) { - mFixedRenderAhead = false; - mRenderAheadCapacity = 1; - } else { - mFixedRenderAhead = true; - mRenderAheadCapacity = mRenderAheadDepth; - } - bool hasSurface = mRenderPipeline->setSurface( - mNativeSurface ? mNativeSurface->getNativeWindow() : nullptr, mSwapBehavior, - mRenderAheadCapacity); + mNativeSurface ? mNativeSurface->getNativeWindow() : nullptr, mSwapBehavior); + + if (mNativeSurface && !mNativeSurface->didSetExtraBuffers()) { + setBufferCount(mNativeSurface->getNativeWindow(), mRenderAheadCapacity); + } mFrameNumber = -1; |