Implement missing safelyRun() on ThreadedRenderer

Change-Id: I14b75f37a13fabaa759a51369190dbdc84087c4b
This commit is contained in:
John Reck
2014-02-11 10:40:25 -08:00
parent f6eebb21d5
commit fc53ef2779
6 changed files with 37 additions and 2 deletions

View File

@@ -113,8 +113,8 @@ public class ThreadedRenderer extends HardwareRenderer {
@Override
boolean safelyRun(Runnable action) {
// TODO:
return false;
nRunWithGlContext(mNativeProxy, action);
return true;
}
@Override
@@ -256,6 +256,7 @@ public class ThreadedRenderer extends HardwareRenderer {
private static native void nSetup(long nativeProxy, int width, int height);
private static native void nDrawDisplayList(long nativeProxy, long displayList,
int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom);
private static native void nRunWithGlContext(long nativeProxy, Runnable runnable);
private static native void nDestroyCanvas(long nativeProxy);
private static native void nAttachFunctor(long nativeProxy, long functor);

View File

@@ -131,6 +131,13 @@ static void android_view_ThreadedRenderer_detachFunctor(JNIEnv* env, jobject cla
proxy->detachFunctor(functor);
}
static void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
jlong proxyPtr, jobject jrunnable) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>( proxyPtr);
RenderTask* task = new JavaTask(env, jrunnable);
proxy->runWithGlContext(task);
}
#endif
// ----------------------------------------------------------------------------
@@ -151,6 +158,7 @@ static JNINativeMethod gMethods[] = {
{ "nDestroyCanvas", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvas},
{ "nAttachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_attachFunctor},
{ "nDetachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_detachFunctor},
{ "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
#endif
};

View File

@@ -462,6 +462,16 @@ void CanvasContext::queueFunctorsTask(int delayMs) {
mRenderThread.queueDelayed(&mInvokeFunctorsTask, delayMs);
}
void CanvasContext::runWithGlContext(RenderTask* task) {
if (mEglSurface != EGL_NO_SURFACE) {
mGlobalContext->makeCurrent(mEglSurface);
} else {
mGlobalContext->usePBufferSurface();
}
task->run();
}
} /* namespace renderthread */
} /* namespace uirenderer */
} /* namespace android */

View File

@@ -65,6 +65,8 @@ public:
void attachFunctor(Functor* functor);
void detachFunctor(Functor* functor);
void runWithGlContext(RenderTask* task);
private:
void setSurface(EGLNativeWindowType window);
void swapBuffers();

View File

@@ -170,6 +170,18 @@ void RenderProxy::detachFunctor(Functor* functor) {
post(task);
}
CREATE_BRIDGE2(runWithGlContext, CanvasContext* context, RenderTask* task) {
args->context->runWithGlContext(args->task);
return NULL;
}
void RenderProxy::runWithGlContext(RenderTask* gltask) {
SETUP_TASK(runWithGlContext);
args->context = mContext;
args->task = gltask;
postAndWait(task);
}
MethodInvokeRenderTask* RenderProxy::createTask(RunnableMethod method) {
// TODO: Consider having a small pool of these to avoid alloc churn
return new MethodInvokeRenderTask(method);

View File

@@ -62,6 +62,8 @@ public:
ANDROID_API void attachFunctor(Functor* functor);
ANDROID_API void detachFunctor(Functor* functor);
ANDROID_API void runWithGlContext(RenderTask* task);
private:
RenderThread& mRenderThread;
CanvasContext* mContext;