Fix for Surface#lockHardwareCanvas lockups
By avoiding setting a dequeue buffer timeout we avoid hitting a different path in BufferQueue that prevents async behavior from happening. This restores P's behavior in this path. Bug: 143860379 Test: repro app in bug Change-Id: Iffbd9f9e6689a40876ff3aa74c10020e3f09fc6a
This commit is contained in:
@@ -180,10 +180,13 @@ static void android_view_ThreadedRenderer_setSurface(JNIEnv* env, jobject clazz,
|
|||||||
if (jsurface) {
|
if (jsurface) {
|
||||||
surface = android_view_Surface_getSurface(env, jsurface);
|
surface = android_view_Surface_getSurface(env, jsurface);
|
||||||
}
|
}
|
||||||
|
bool enableTimeout = true;
|
||||||
if (discardBuffer) {
|
if (discardBuffer) {
|
||||||
|
// Currently only Surface#lockHardwareCanvas takes this path
|
||||||
|
enableTimeout = false;
|
||||||
proxy->setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
|
proxy->setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
|
||||||
}
|
}
|
||||||
proxy->setSurface(surface);
|
proxy->setSurface(surface, enableTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static jboolean android_view_ThreadedRenderer_pause(JNIEnv* env, jobject clazz,
|
static jboolean android_view_ThreadedRenderer_pause(JNIEnv* env, jobject clazz,
|
||||||
|
|||||||
@@ -140,13 +140,15 @@ void CanvasContext::destroy() {
|
|||||||
mAnimationContext->destroy();
|
mAnimationContext->destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanvasContext::setSurface(sp<Surface>&& surface) {
|
void CanvasContext::setSurface(sp<Surface>&& surface, bool enableTimeout) {
|
||||||
ATRACE_CALL();
|
ATRACE_CALL();
|
||||||
|
|
||||||
if (surface) {
|
if (surface) {
|
||||||
mNativeSurface = new ReliableSurface{std::move(surface)};
|
mNativeSurface = new ReliableSurface{std::move(surface)};
|
||||||
// TODO: Fix error handling & re-shorten timeout
|
if (enableTimeout) {
|
||||||
ANativeWindow_setDequeueTimeout(mNativeSurface.get(), 4000_ms);
|
// TODO: Fix error handling & re-shorten timeout
|
||||||
|
ANativeWindow_setDequeueTimeout(mNativeSurface.get(), 4000_ms);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mNativeSurface = nullptr;
|
mNativeSurface = nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public:
|
|||||||
// Won't take effect until next EGLSurface creation
|
// Won't take effect until next EGLSurface creation
|
||||||
void setSwapBehavior(SwapBehavior swapBehavior);
|
void setSwapBehavior(SwapBehavior swapBehavior);
|
||||||
|
|
||||||
void setSurface(sp<Surface>&& surface);
|
void setSurface(sp<Surface>&& surface, bool enableTimeout = true);
|
||||||
bool pauseSurface();
|
bool pauseSurface();
|
||||||
void setStopped(bool stopped);
|
void setStopped(bool stopped);
|
||||||
bool hasSurface() const { return mNativeSurface.get(); }
|
bool hasSurface() const { return mNativeSurface.get(); }
|
||||||
|
|||||||
@@ -78,9 +78,10 @@ void RenderProxy::setName(const char* name) {
|
|||||||
mRenderThread.queue().runSync([this, name]() { mContext->setName(std::string(name)); });
|
mRenderThread.queue().runSync([this, name]() { mContext->setName(std::string(name)); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderProxy::setSurface(const sp<Surface>& surface) {
|
void RenderProxy::setSurface(const sp<Surface>& surface, bool enableTimeout) {
|
||||||
mRenderThread.queue().post(
|
mRenderThread.queue().post([this, surf = surface, enableTimeout]() mutable {
|
||||||
[this, surf = surface]() mutable { mContext->setSurface(std::move(surf)); });
|
mContext->setSurface(std::move(surf), enableTimeout);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderProxy::allocateBuffers() {
|
void RenderProxy::allocateBuffers() {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public:
|
|||||||
ANDROID_API bool loadSystemProperties();
|
ANDROID_API bool loadSystemProperties();
|
||||||
ANDROID_API void setName(const char* name);
|
ANDROID_API void setName(const char* name);
|
||||||
|
|
||||||
ANDROID_API void setSurface(const sp<Surface>& surface);
|
ANDROID_API void setSurface(const sp<Surface>& surface, bool enableTimeout = true);
|
||||||
ANDROID_API void allocateBuffers();
|
ANDROID_API void allocateBuffers();
|
||||||
ANDROID_API bool pause();
|
ANDROID_API bool pause();
|
||||||
ANDROID_API void setStopped(bool stopped);
|
ANDROID_API void setStopped(bool stopped);
|
||||||
|
|||||||
Reference in New Issue
Block a user