summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLikai Ding <likaid@codeaurora.org>2016-06-01 10:31:45 +0800
committerSteve Kondik <steve@cyngn.com>2016-09-26 04:54:49 -0700
commitb750059243b8b484a744b7715fbba55e6f968349 (patch)
tree8ba2b870603692a0c746cfd740a54932b8085b16
parent0f34582709227dd5c2e0d26d59bc6dd8e6f4f6a2 (diff)
downloadandroid_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.tar.gz
android_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.tar.bz2
android_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.zip
Gallery: faster texture upload
TileTexture.Uploader uses a fixed time slot (4ms) to upload tiles. However, typical GL idle time is much longer than that. To better utilize it, a third parameter is added to onGLIdle method to indicate the due time. This can cut ~170ms on certain devices. CRs-Fixed: 1024519 Change-Id: I8347b87f85815a4deaf10eb10f234a56b047681e
-rw-r--r--src/com/android/gallery3d/glrenderer/TextureUploader.java2
-rw-r--r--src/com/android/gallery3d/glrenderer/TiledTexture.java17
-rw-r--r--src/com/android/gallery3d/ui/GLRoot.java2
-rw-r--r--src/com/android/gallery3d/ui/GLRootView.java15
-rw-r--r--src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java2
-rw-r--r--src/com/android/gallery3d/ui/TileImageView.java2
6 files changed, 24 insertions, 16 deletions
diff --git a/src/com/android/gallery3d/glrenderer/TextureUploader.java b/src/com/android/gallery3d/glrenderer/TextureUploader.java
index f17ab845c..bc670eca4 100644
--- a/src/com/android/gallery3d/glrenderer/TextureUploader.java
+++ b/src/com/android/gallery3d/glrenderer/TextureUploader.java
@@ -92,7 +92,7 @@ public class TextureUploader implements OnGLIdleListener {
}
@Override
- public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
+ public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) {
int uploadQuota = QUOTA_PER_FRAME;
uploadQuota = upload(canvas, mFgTextures, uploadQuota, false);
if (uploadQuota < QUOTA_PER_FRAME) mGLRoot.requestRender();
diff --git a/src/com/android/gallery3d/glrenderer/TiledTexture.java b/src/com/android/gallery3d/glrenderer/TiledTexture.java
index 78cb2f2de..f33a52c97 100644
--- a/src/com/android/gallery3d/glrenderer/TiledTexture.java
+++ b/src/com/android/gallery3d/glrenderer/TiledTexture.java
@@ -24,7 +24,6 @@ import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
-import android.os.SystemClock;
import com.android.gallery3d.ui.GLRoot;
import com.android.gallery3d.ui.GLRoot.OnGLIdleListener;
@@ -42,10 +41,6 @@ public class TiledTexture implements Texture {
private static final int TILE_SIZE = CONTENT_SIZE + 2 * BORDER_SIZE;
private static final int INIT_CAPACITY = 8;
- // We are targeting at 60fps, so we have 16ms for each frame.
- // In this 16ms, we use about 4~8 ms to upload tiles.
- private static final long UPLOAD_TILE_LIMIT = 4; // ms
-
private static Tile sFreeTileHead = null;
private static final Object sFreeTileLock = new Object();
@@ -88,18 +83,20 @@ public class TiledTexture implements Texture {
}
@Override
- public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
+ public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) {
ArrayDeque<TiledTexture> deque = mTextures;
synchronized (this) {
- long now = SystemClock.uptimeMillis();
- long dueTime = now + UPLOAD_TILE_LIMIT;
- while (now < dueTime && !deque.isEmpty()) {
+ long now = System.nanoTime();
+ long uploadTime = 0;
+ while (now + uploadTime < dueTime && !deque.isEmpty()) {
TiledTexture t = deque.peekFirst();
if (t.uploadNextTile(canvas)) {
deque.removeFirst();
mGlRoot.requestRender();
}
- now = SystemClock.uptimeMillis();
+ long t1 = System.nanoTime();
+ uploadTime = t1 - now;
+ now = t1;
}
mIsQueued = !mTextures.isEmpty();
diff --git a/src/com/android/gallery3d/ui/GLRoot.java b/src/com/android/gallery3d/ui/GLRoot.java
index 33a82eaf7..caa36c334 100644
--- a/src/com/android/gallery3d/ui/GLRoot.java
+++ b/src/com/android/gallery3d/ui/GLRoot.java
@@ -28,7 +28,7 @@ public interface GLRoot {
// Mainly used for uploading textures.
public static interface OnGLIdleListener {
public boolean onGLIdle(
- GLCanvas canvas, boolean renderRequested);
+ GLCanvas canvas, boolean renderRequested, long dueTime);
}
public void addOnGLIdleListener(OnGLIdleListener listener);
diff --git a/src/com/android/gallery3d/ui/GLRootView.java b/src/com/android/gallery3d/ui/GLRootView.java
index dc898d83d..911ca4025 100644
--- a/src/com/android/gallery3d/ui/GLRootView.java
+++ b/src/com/android/gallery3d/ui/GLRootView.java
@@ -78,6 +78,8 @@ public class GLRootView extends GLSurfaceView
private static final int FLAG_INITIALIZED = 1;
private static final int FLAG_NEED_LAYOUT = 2;
+ private static final long FRAME_INTERVAL = 16000000;
+
private GL11 mGL;
private GLCanvas mCanvas;
private GLView mContentView;
@@ -111,6 +113,8 @@ public class GLRootView extends GLSurfaceView
private boolean mInDownState = false;
private boolean mFirstDraw = true;
+ private long mDueTime;
+
public GLRootView(Context context) {
this(context, null);
}
@@ -339,6 +343,7 @@ public class GLRootView extends GLSurfaceView
@Override
public void onDrawFrame(GL10 gl) {
+ mDueTime = System.nanoTime() + FRAME_INTERVAL;
AnimationTime.update();
long t0;
if (DEBUG_PROFILE_SLOW_ONLY) {
@@ -499,9 +504,15 @@ public class GLRootView extends GLSurfaceView
listener = mIdleListeners.removeFirst();
}
mRenderLock.lock();
- boolean keepInQueue;
+ boolean keepInQueue = false;
try {
- keepInQueue = listener.onGLIdle(mCanvas, mRenderRequested);
+ if (mCanvas != null) {
+ long t = System.nanoTime();
+ if (mDueTime < t) {
+ mDueTime = t + FRAME_INTERVAL / 2;
+ }
+ keepInQueue = listener.onGLIdle(mCanvas, mRenderRequested, mDueTime);
+ }
} finally {
mRenderLock.unlock();
}
diff --git a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java
index ce672f211..74be72255 100644
--- a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java
+++ b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java
@@ -47,7 +47,7 @@ public class PreparePageFadeoutTexture implements OnGLIdleListener {
}
@Override
- public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
+ public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) {
if (!mCancelled) {
try {
canvas.beginRenderTarget(mTexture);
diff --git a/src/com/android/gallery3d/ui/TileImageView.java b/src/com/android/gallery3d/ui/TileImageView.java
index 2b978d1bf..16e2fc129 100644
--- a/src/com/android/gallery3d/ui/TileImageView.java
+++ b/src/com/android/gallery3d/ui/TileImageView.java
@@ -559,7 +559,7 @@ public class TileImageView extends GLView {
AtomicBoolean mActive = new AtomicBoolean(false);
@Override
- public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) {
+ public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) {
// Skips uploading if there is a pending rendering request.
// Returns true to keep uploading in next rendering loop.
if (renderRequested) return true;