Implement missing safelyRun() on ThreadedRenderer

Change-Id: I14b75f37a13fabaa759a51369190dbdc84087c4b
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 @@
 
     @Override
     boolean safelyRun(Runnable action) {
-        // TODO:
-        return false;
+        nRunWithGlContext(mNativeProxy, action);
+        return true;
     }
 
     @Override
@@ -256,6 +256,7 @@
     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 @@
     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 @@
     { "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 @@
     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 @@
     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 @@
     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 @@
     ANDROID_API void attachFunctor(Functor* functor);
     ANDROID_API void detachFunctor(Functor* functor);
 
+    ANDROID_API void runWithGlContext(RenderTask* task);
+
 private:
     RenderThread& mRenderThread;
     CanvasContext* mContext;