Merge "Add drawGlFunctor support to RenderThread"

This commit is contained in:
John Reck
2013-12-16 18:55:22 +00:00
committed by Android (Google) Code Review
4 changed files with 1558 additions and 96 deletions

View File

@@ -1123,66 +1123,6 @@ public class GLRenderer extends HardwareRenderer {
}
}
@Override
void drawDisplayList(DisplayList displayList, View.AttachInfo attachInfo,
HardwareDrawCallbacks callbacks, Rect dirty) {
if (canDraw()) {
if (!hasDirtyRegions()) {
dirty = null;
}
// We are already on the correct thread
final int surfaceState = checkRenderContextUnsafe();
if (surfaceState != SURFACE_STATE_ERROR) {
HardwareCanvas canvas = mCanvas;
if (mProfileEnabled) {
mProfileLock.lock();
}
dirty = beginFrame(canvas, dirty, surfaceState);
int saveCount = 0;
int status = DisplayList.STATUS_DONE;
long start = getSystemTime();
try {
status = prepareFrame(dirty);
saveCount = canvas.save();
callbacks.onHardwarePreDraw(canvas);
status |= drawDisplayList(attachInfo, canvas, displayList, status);
} catch (Exception e) {
Log.e(LOG_TAG, "An error has occurred while drawing:", e);
} finally {
callbacks.onHardwarePostDraw(canvas);
canvas.restoreToCount(saveCount);
mDrawDelta = getSystemTime() - start;
if (mDrawDelta > 0) {
mFrameCount++;
debugOverdraw(attachInfo, dirty, canvas, displayList);
debugDirtyRegions(dirty, canvas);
drawProfileData(attachInfo);
}
}
onPostDraw();
swapBuffers(status);
if (mProfileEnabled) {
mProfileLock.unlock();
}
attachInfo.mIgnoreDirtyState = false;
}
}
}
@Override
void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
Rect dirty) {
@@ -1539,7 +1479,7 @@ public class GLRenderer extends HardwareRenderer {
return (int) (dp * density + 0.5f);
}
private static native boolean loadProperties();
static native boolean loadProperties();
static native void setupShadersDiskCache(String cacheFile);
@@ -1547,14 +1487,14 @@ public class GLRenderer extends HardwareRenderer {
* Notifies EGL that the frame is about to be rendered.
* @param size
*/
private static native void beginFrame(int[] size);
static native void beginFrame(int[] size);
/**
* Returns the current system time according to the renderer.
* This method is used for debugging only and should not be used
* as a clock.
*/
private static native long getSystemTime();
static native long getSystemTime();
/**
* Preserves the back buffer of the current surface after a buffer swap.
@@ -1565,7 +1505,7 @@ public class GLRenderer extends HardwareRenderer {
* @return True if the swap behavior was successfully changed,
* false otherwise.
*/
private static native boolean preserveBackBuffer();
static native boolean preserveBackBuffer();
/**
* Indicates whether the current surface preserves its back buffer
@@ -1574,7 +1514,7 @@ public class GLRenderer extends HardwareRenderer {
* @return True, if the surface's EGL_SWAP_BEHAVIOR is EGL_BUFFER_PRESERVED,
* false otherwise
*/
private static native boolean isBackBufferPreserved();
static native boolean isBackBufferPreserved();
class DrawPerformanceDataProvider extends GraphDataProvider {
private final int mGraphType;

View File

@@ -407,18 +407,6 @@ public abstract class HardwareRenderer {
abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
Rect dirty);
/**
* Temporary hook to draw a display list directly, only used if sUseRenderThread
* is true.
*
* @param displayList The display list to draw
* @param attachInfo AttachInfo tied to the specified view.
* @param callbacks Callbacks invoked when drawing happens.
* @param dirty The dirty rectangle to update, can be null.
*/
abstract void drawDisplayList(DisplayList displayList, View.AttachInfo attachInfo,
HardwareDrawCallbacks callbacks, Rect dirty);
/**
* Creates a new hardware layer. A hardware layer built by calling this
* method will be treated as a texture layer, instead of as a render target.
@@ -527,10 +515,11 @@ public abstract class HardwareRenderer {
static HardwareRenderer create(boolean translucent) {
HardwareRenderer renderer = null;
if (GLES20Canvas.isAvailable()) {
renderer = new GLRenderer(translucent);
}
if (renderer != null && sUseRenderThread) {
renderer = new ThreadedRenderer((GLRenderer)renderer);
if (sUseRenderThread) {
renderer = new ThreadedRenderer(translucent);
} else {
renderer = new GLRenderer(translucent);
}
}
return renderer;
}

File diff suppressed because it is too large Load Diff

View File

@@ -50,19 +50,20 @@ public class ThreadedRenderer extends HardwareRenderer {
@SuppressWarnings("serial")
static HashMap<String, Method> sMethodLut = new HashMap<String, Method>() {{
Method[] methods = HardwareRenderer.class.getDeclaredMethods();
Method[] methods = RemoteGLRenderer.class.getDeclaredMethods();
for (Method m : methods) {
put(m.getName(), m);
m.setAccessible(true);
put(m.getName() + ":" + m.getParameterTypes().length, m);
}
}};
static boolean sNeedsInit = true;
private HardwareRenderer mRemoteRenderer;
private RemoteGLRenderer mRemoteRenderer;
private int mWidth, mHeight;
private RTJob mPreviousDraw;
ThreadedRenderer(GLRenderer backingRenderer) {
mRemoteRenderer = backingRenderer;
ThreadedRenderer(boolean translucent) {
mRemoteRenderer = new RemoteGLRenderer(this, translucent);
setEnabled(true);
if (sNeedsInit) {
sNeedsInit = false;
@@ -166,12 +167,6 @@ public class ThreadedRenderer extends HardwareRenderer {
throw new NoSuchMethodError();
}
@Override
void drawDisplayList(DisplayList displayList, AttachInfo attachInfo,
HardwareDrawCallbacks callbacks, Rect dirty) {
throw new NoSuchMethodError();
}
/**
* TODO: Remove
* Temporary hack to allow RenderThreadTest prototype app to trigger
@@ -233,12 +228,12 @@ public class ThreadedRenderer extends HardwareRenderer {
@Override
void detachFunctor(int functor) {
throw new NoSuchMethodError();
run("detachFunctor", functor);
}
@Override
boolean attachFunctor(AttachInfo attachInfo, int functor) {
throw new NoSuchMethodError();
return (Boolean) run("attachFunctor", attachInfo, functor);
}
@Override
@@ -262,7 +257,7 @@ public class ThreadedRenderer extends HardwareRenderer {
private RTJob post(String method, Object... args) {
RTJob job = new RTJob();
job.method = sMethodLut.get(method);
job.method = sMethodLut.get(method + ":" + args.length);
job.args = args;
job.target = mRemoteRenderer;
if (job.method == null) {
@@ -274,7 +269,7 @@ public class ThreadedRenderer extends HardwareRenderer {
private Object run(String method, Object... args) {
RTJob job = new RTJob();
job.method = sMethodLut.get(method);
job.method = sMethodLut.get(method + ":" + args.length);
job.args = args;
job.target = mRemoteRenderer;
if (job.method == null) {