summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Newberger <alann@google.com>2014-09-30 14:59:32 -0700
committerAlan Newberger <alann@google.com>2014-09-30 23:29:53 +0000
commitd822d1cfc893faa6f3d5b566a50c628ec83fa4e6 (patch)
tree508c55633be7e3656905be44fc4ee9a967bd865e
parent2499af485d19e9e9843f7f8ea9a566ee24e62a33 (diff)
downloadandroid_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.java42
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");
+ }
}
}
}