From a3402c33c61b55e8d068b8b4e06aae158fd1af4e Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Thu, 19 Sep 2013 12:49:13 -0700 Subject: [PATCH] TextureView/GLES20Canvas: Support synchronous GLConsumers Always update to the newest available frame from a GLConsumer. Otherwise, with a synchronous queue, rendering can fall behind and eventually deadlock with producer. Bug: 10830400 Change-Id: I7f1d752c80ae5dac892a26d82e86806c27f5d955 --- core/jni/android_view_GLES20Canvas.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index dc90da734de78..b720e73785bde 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -878,6 +878,23 @@ static void android_view_GLES20Canvas_updateTextureLayer(JNIEnv* env, jobject cl sp surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface)); if (surfaceTexture->updateTexImage() == NO_ERROR) { + int64_t frameNumber = surfaceTexture->getFrameNumber(); + // If the GLConsumer queue is in synchronous mode, need to discard all + // but latest frame, using the frame number to tell when we no longer + // have newer frames to target. Since we can't tell which mode it is in, + // do this unconditionally. + int dropCounter = 0; + while (surfaceTexture->updateTexImage() == NO_ERROR) { + int64_t newFrameNumber = surfaceTexture->getFrameNumber(); + if (newFrameNumber == frameNumber) break; + frameNumber = newFrameNumber; + dropCounter++; + } + #if DEBUG_RENDERER + if (dropCounter > 0) { + RENDERER_LOGD("Dropped %d frames on texture layer update", dropCounter); + } + #endif surfaceTexture->getTransformMatrix(transform); GLenum renderTarget = surfaceTexture->getCurrentTextureTarget();