summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/ReliableSurface.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2019-07-26 16:51:08 -0700
committerJohn Reck <jreck@google.com>2019-07-26 16:58:37 -0700
commit59dd2ea974a7f2abfcf6aced764b1e1dc695760b (patch)
tree9203f967c3aa147a392b58f8fa4d6472da583c3b /libs/hwui/renderthread/ReliableSurface.cpp
parent04fbf35294a9d7789490c850fd74b5ef9bfed37b (diff)
Fix ReliableSurface to be more reliable
Handle TIMED_OUT better by rescheduling (TODO: give up after N attempts?) Fix SYNC_SURFACE_LOST_REWARD_IF_FOUND path to actually go fetch a new surface. Bug: 137509524 Test: Injected errors randomly, verified nothing got permanently dead. Change-Id: Id30f8ad1dd7196041ee84c16c8cf5c814002a6ce
Diffstat (limited to 'libs/hwui/renderthread/ReliableSurface.cpp')
-rw-r--r--libs/hwui/renderthread/ReliableSurface.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/libs/hwui/renderthread/ReliableSurface.cpp b/libs/hwui/renderthread/ReliableSurface.cpp
index ad1fc4921781..a44b80457218 100644
--- a/libs/hwui/renderthread/ReliableSurface.cpp
+++ b/libs/hwui/renderthread/ReliableSurface.cpp
@@ -87,21 +87,21 @@ void ReliableSurface::perform(int operation, va_list args) {
}
int ReliableSurface::reserveNext() {
+ if constexpr (DISABLE_BUFFER_PREFETCH) {
+ return OK;
+ }
{
std::lock_guard _lock{mMutex};
if (mReservedBuffer) {
ALOGW("reserveNext called but there was already a buffer reserved?");
return OK;
}
- if (mInErrorState) {
+ if (mBufferQueueState != OK) {
return UNKNOWN_ERROR;
}
if (mHasDequeuedBuffer) {
return OK;
}
- if constexpr (DISABLE_BUFFER_PREFETCH) {
- return OK;
- }
}
// TODO: Update this to better handle when requested dimensions have changed
@@ -165,10 +165,11 @@ int ReliableSurface::dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd) {
}
}
+
int result = callProtected(mSurface, dequeueBuffer, buffer, fenceFd);
if (result != OK) {
ALOGW("dequeueBuffer failed, error = %d; switching to fallback", result);
- *buffer = acquireFallbackBuffer();
+ *buffer = acquireFallbackBuffer(result);
*fenceFd = -1;
return *buffer ? OK : INVALID_OPERATION;
} else {
@@ -201,9 +202,9 @@ bool ReliableSurface::isFallbackBuffer(const ANativeWindowBuffer* windowBuffer)
return windowBuffer == scratchBuffer;
}
-ANativeWindowBuffer* ReliableSurface::acquireFallbackBuffer() {
+ANativeWindowBuffer* ReliableSurface::acquireFallbackBuffer(int error) {
std::lock_guard _lock{mMutex};
- mInErrorState = true;
+ mBufferQueueState = error;
if (mScratchBuffer) {
return AHardwareBuffer_to_ANativeWindowBuffer(mScratchBuffer.get());