Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e150fef authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Add invokeFunctor"

parents 877ffde5 0d1f634f
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -554,6 +554,32 @@ public class GLRenderer extends HardwareRenderer {
        return true;
    }

    @Override
    public void invokeFunctor(long functor, boolean waitForCompletion) {
        boolean needsContext = !isEnabled() || checkRenderContext() == SURFACE_STATE_ERROR;
        boolean hasContext = !needsContext;

        if (needsContext) {
            GLRendererEglContext managedContext =
                    (GLRendererEglContext) sEglContextStorage.get();
            if (managedContext != null) {
                usePbufferSurface(managedContext.getContext());
                hasContext = true;
            }
        }

        try {
            nInvokeFunctor(functor, hasContext);
        } finally {
            if (needsContext) {
                sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE,
                        EGL_NO_SURFACE, EGL_NO_CONTEXT);
            }
        }
    }

    private static native void nInvokeFunctor(long functor, boolean hasContext);

    @Override
    void destroyHardwareResources(final View view) {
        if (view != null) {
+11 −0
Original line number Diff line number Diff line
@@ -437,6 +437,17 @@ public abstract class HardwareRenderer {
     */
    abstract void attachFunctor(View.AttachInfo attachInfo, long functor);

    /**
     * Schedules the functor for execution in either kModeProcess or
     * kModeProcessNoContext, depending on whether or not there is an EGLContext.
     *
     * @param functor The native functor to invoke
     * @param waitForCompletion If true, this will not return until the functor
     *                          has invoked. If false, the functor may be invoked
     *                          asynchronously.
     */
    public abstract void invokeFunctor(long functor, boolean waitForCompletion);

    /**
     * Initializes the hardware renderer for the specified surface and setup the
     * renderer for drawing, if needed. This is invoked when the ViewAncestor has
+6 −0
Original line number Diff line number Diff line
@@ -185,6 +185,11 @@ public class ThreadedRenderer extends HardwareRenderer {
        nAttachFunctor(mNativeProxy, functor);
    }

    @Override
    public void invokeFunctor(long functor, boolean waitForCompletion) {
        nInvokeFunctor(mNativeProxy, functor, waitForCompletion);
    }

    @Override
    HardwareLayer createDisplayListLayer(int width, int height) {
        long layer = nCreateDisplayListLayer(mNativeProxy, width, height);
@@ -266,6 +271,7 @@ public class ThreadedRenderer extends HardwareRenderer {

    private static native void nAttachFunctor(long nativeProxy, long functor);
    private static native void nDetachFunctor(long nativeProxy, long functor);
    private static native void nInvokeFunctor(long nativeProxy, long functor, boolean waitForCompletion);

    private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
    private static native long nCreateTextureLayer(long nativeProxy);
+11 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@

#include <utils/Timers.h>

#include <private/hwui/DrawGlInfo.h>

#include <Caches.h>
#include <Extensions.h>
#include <LayerRenderer.h>
@@ -155,6 +157,14 @@ static void android_view_GLRenderer_updateRenderNodeProperties(JNIEnv* env, jobj
    renderNode->updateProperties();
}

static void android_view_GLRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
        jlong functorPtr, jboolean hasContext) {
    using namespace android::uirenderer;
    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
    DrawGlInfo::Mode mode = hasContext ? DrawGlInfo::kModeProcess : DrawGlInfo::kModeProcessNoContext;
    (*functor)(mode, NULL);
}

#endif // USE_OPENGL_RENDERER

// ----------------------------------------------------------------------------
@@ -187,6 +197,7 @@ static JNINativeMethod gMethods[] = {
    { "nDestroyLayer",         "(J)V",  (void*) android_view_GLRenderer_destroyLayer },
    { "nSetDisplayListData",  "(JJ)V", (void*) android_view_GLRenderer_setDisplayListData },
    { "nUpdateRenderNodeProperties", "(J)V", (void*) android_view_GLRenderer_updateRenderNodeProperties },
    { "nInvokeFunctor",        "(JZ)V", (void*) android_view_GLRenderer_invokeFunctor },
#endif

    { "setupShadersDiskCache", "(Ljava/lang/String;)V",
+8 −0
Original line number Diff line number Diff line
@@ -139,6 +139,13 @@ static void android_view_ThreadedRenderer_detachFunctor(JNIEnv* env, jobject cla
    proxy->detachFunctor(functor);
}

static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
        jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) {
    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
    proxy->invokeFunctor(functor, waitForCompletion);
}

static void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz,
        jlong proxyPtr, jobject jrunnable) {
    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -196,6 +203,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 },
    { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
Loading