From 5db8e20db77bf86eba25ec713c76da783dd98b19 Mon Sep 17 00:00:00 2001 From: Alan Newberger Date: Tue, 30 Sep 2014 14:59:32 -0700 Subject: [PATCH] Only allow one draw call pending at a time If modules call draw aggressively, there should only be one pending at a time. If we get another, just drop it, there will be a draw momentarily. Bug: 17703978 Change-Id: I60b3b9e257ae4e064287a97973b1de878ce66de1 --- src/com/android/camera/SurfaceTextureRenderer.java | 42 +++++++--------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/src/com/android/camera/SurfaceTextureRenderer.java b/src/com/android/camera/SurfaceTextureRenderer.java index 69897cad8..ee557f88b 100644 --- a/src/com/android/camera/SurfaceTextureRenderer.java +++ b/src/com/android/camera/SurfaceTextureRenderer.java @@ -44,6 +44,8 @@ public class SurfaceTextureRenderer { private EGL10 mEgl; private GL10 mGl; + private volatile boolean mDrawPending = false; + private final Handler mEglHandler; private final FrameDrawer mFrameDrawer; @@ -55,32 +57,13 @@ public class SurfaceTextureRenderer { if (mEglDisplay != null && mEglSurface != null) { mFrameDrawer.onDrawFrame(mGl); mEgl.eglSwapBuffers(mEglDisplay, mEglSurface); + mDrawPending = false; } mRenderLock.notifyAll(); } } }; - public class RenderThread extends Thread { - private Boolean mRenderStopped = false; - - @Override - public void run() { - while (true) { - synchronized (mRenderStopped) { - if (mRenderStopped) return; - } - draw(true); - } - } - - public void stopRender() { - synchronized (mRenderStopped) { - mRenderStopped = true; - } - } - } - public SurfaceTextureRenderer(SurfaceTexture tex, Handler handler, FrameDrawer renderer) { mEglHandler = handler; @@ -89,10 +72,6 @@ public class SurfaceTextureRenderer { initialize(tex); } - public RenderThread createRenderThread() { - return new RenderThread(); - } - public void release() { mEglHandler.post(new Runnable() { @Override @@ -116,12 +95,15 @@ public class SurfaceTextureRenderer { */ public void draw(boolean sync) { synchronized (mRenderLock) { - mEglHandler.post(mRenderTask); - if (sync) { - try { - mRenderLock.wait(); - } catch (InterruptedException ex) { - Log.v(TAG, "RenderLock.wait() interrupted"); + if (!mDrawPending) { + mEglHandler.post(mRenderTask); + mDrawPending = true; + if (sync) { + try { + mRenderLock.wait(); + } catch (InterruptedException ex) { + Log.v(TAG, "RenderLock.wait() interrupted"); + } } } } -- 2.11.0