diff options
author | Alan Newberger <alann@google.com> | 2014-09-30 14:59:32 -0700 |
---|---|---|
committer | Alan Newberger <alann@google.com> | 2014-09-30 23:29:53 +0000 |
commit | d822d1cfc893faa6f3d5b566a50c628ec83fa4e6 (patch) | |
tree | 508c55633be7e3656905be44fc4ee9a967bd865e | |
parent | 2499af485d19e9e9843f7f8ea9a566ee24e62a33 (diff) | |
download | android_packages_apps_Camera2-d822d1cfc893faa6f3d5b566a50c628ec83fa4e6.tar.gz android_packages_apps_Camera2-d822d1cfc893faa6f3d5b566a50c628ec83fa4e6.tar.bz2 android_packages_apps_Camera2-d822d1cfc893faa6f3d5b566a50c628ec83fa4e6.zip |
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
(cherry picked from commit 5db8e20db77bf86eba25ec713c76da783dd98b19)
-rw-r--r-- | src/com/android/camera/SurfaceTextureRenderer.java | 42 |
1 files 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"); + } } } } |