diff options
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 5 | ||||
-rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 |
6 files changed, 37 insertions, 2 deletions
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 1c20923..1d7e5b2 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -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); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 8e121de..e86a2d4 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -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 }; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index a848c8f..4e665d9 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -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 */ diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 2daa905..3197df3 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -65,6 +65,8 @@ public: void attachFunctor(Functor* functor); void detachFunctor(Functor* functor); + void runWithGlContext(RenderTask* task); + private: void setSurface(EGLNativeWindowType window); void swapBuffers(); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 25badac..34f1961 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -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); diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 113c5a8..1ad0c2d 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -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; |