diff options
author | John Reck <jreck@google.com> | 2020-05-10 06:01:13 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-05-10 06:01:13 +0000 |
commit | 9d023c55dc61c19577e3fb9bf8c2be500a1d56b0 (patch) | |
tree | 6a11461441dd9b7dd451c221c16faa107280525d /libs/hwui/renderthread/ReliableSurface.cpp | |
parent | bf8b51e5e88a5608d2967e75f4af73859b89b150 (diff) | |
parent | bc6a00d37e5826da3931206dfc13a1d4b862fd47 (diff) |
Merge "Avoid excessive KGSL maps" into rvc-dev am: acf8443e9a am: 906a94baec am: d292bcc672 am: bc6a00d37e
Change-Id: I71ed49ad8273dd886c21cbff7413a0c189dbde60
Diffstat (limited to 'libs/hwui/renderthread/ReliableSurface.cpp')
-rw-r--r-- | libs/hwui/renderthread/ReliableSurface.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libs/hwui/renderthread/ReliableSurface.cpp b/libs/hwui/renderthread/ReliableSurface.cpp index 14a4c2879723..c29cc11fa7ea 100644 --- a/libs/hwui/renderthread/ReliableSurface.cpp +++ b/libs/hwui/renderthread/ReliableSurface.cpp @@ -19,6 +19,7 @@ #include <log/log_main.h> #include <private/android/AHardwareBufferHelpers.h> // TODO: this should be including apex instead. +#include <system/window.h> #include <vndk/window.h> namespace android::uirenderer::renderthread { @@ -44,6 +45,7 @@ ReliableSurface::~ReliableSurface() { ANativeWindow_setDequeueBufferInterceptor(mWindow, nullptr, nullptr); ANativeWindow_setQueueBufferInterceptor(mWindow, nullptr, nullptr); ANativeWindow_setPerformInterceptor(mWindow, nullptr, nullptr); + ANativeWindow_setQueryInterceptor(mWindow, nullptr, nullptr); ANativeWindow_release(mWindow); } @@ -63,6 +65,10 @@ void ReliableSurface::init() { result = ANativeWindow_setPerformInterceptor(mWindow, hook_perform, this); LOG_ALWAYS_FATAL_IF(result != NO_ERROR, "Failed to set perform interceptor: error = %d", result); + + result = ANativeWindow_setQueryInterceptor(mWindow, hook_query, this); + LOG_ALWAYS_FATAL_IF(result != NO_ERROR, "Failed to set query interceptor: error = %d", + result); } int ReliableSurface::reserveNext() { @@ -253,9 +259,29 @@ int ReliableSurface::hook_perform(ANativeWindow* window, ANativeWindow_performFn case ANATIVEWINDOW_PERFORM_SET_BUFFERS_FORMAT: rs->mFormat = static_cast<AHardwareBuffer_Format>(va_arg(args, int32_t)); break; + case NATIVE_WINDOW_SET_BUFFER_COUNT: + size_t bufferCount = va_arg(args, size_t); + if (bufferCount >= rs->mExpectedBufferCount) { + rs->mDidSetExtraBuffers = true; + } else { + ALOGD("HOOK FAILED! Expected %zd got = %zd", rs->mExpectedBufferCount, bufferCount); + } + break; } } return result; } +int ReliableSurface::hook_query(const ANativeWindow *window, ANativeWindow_queryFn query, + void *data, int what, int *value) { + ReliableSurface* rs = reinterpret_cast<ReliableSurface*>(data); + int result = query(window, what, value); + if (what == ANATIVEWINDOW_QUERY_MIN_UNDEQUEUED_BUFFERS && result == OK) { + std::lock_guard _lock{rs->mMutex}; + *value += rs->mExtraBuffers; + rs->mExpectedBufferCount = *value + 2; + } + return result; +} + }; // namespace android::uirenderer::renderthread |