From 74ce5afd9e625fadde44afccca732df1e9fc5fef Mon Sep 17 00:00:00 2001 From: Sidharth Guglani Date: Mon, 1 Apr 2019 06:11:51 -0700 Subject: [PATCH] added flag for useBatchingForLayoutOutputs experiment Summary: Using a config flag to switch between different implementations of transferring layout outputs - YogaNodeJNI uses multiple access of java fields to pass all properties like width, height, margin etc... - YogaNodeJNIBatching uses a float array to pass all the data in one java field access Reviewed By: davidaurelio Differential Revision: D14378301 fbshipit-source-id: 0da5b28e6a67ad8fd60eb7efe622d9b2deaf177f --- java/com/facebook/yoga/YogaConfig.java | 1 + java/com/facebook/yoga/YogaNative.java | 4 ++-- java/com/facebook/yoga/YogaNode.java | 4 ++-- java/com/facebook/yoga/YogaNodeJNIBase.java | 4 ++-- java/jni/YGJNI.cpp | 13 ++++++++++--- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/java/com/facebook/yoga/YogaConfig.java b/java/com/facebook/yoga/YogaConfig.java index bc2538da..2121d643 100644 --- a/java/com/facebook/yoga/YogaConfig.java +++ b/java/com/facebook/yoga/YogaConfig.java @@ -11,6 +11,7 @@ import com.facebook.soloader.SoLoader; public class YogaConfig { public static int SPACING_TYPE = 1; + public static boolean useBatchingForLayoutOutputs = false; long mNativePointer; private YogaLogger mLogger; diff --git a/java/com/facebook/yoga/YogaNative.java b/java/com/facebook/yoga/YogaNative.java index ef0b44ee..372fb3c0 100644 --- a/java/com/facebook/yoga/YogaNative.java +++ b/java/com/facebook/yoga/YogaNative.java @@ -29,8 +29,8 @@ public class YogaNative { // YGNode related static native int jni_YGNodeGetInstanceCount(); - static native long jni_YGNodeNew(); - static native long jni_YGNodeNewWithConfig(long configPointer); + static native long jni_YGNodeNew(boolean useBatchingForLayoutOutputs); + static native long jni_YGNodeNewWithConfig(long configPointer, boolean useBatchingForLayoutOutputs); static native void jni_YGNodeFree(long nativePointer); static native void jni_YGNodeReset(long nativePointer); static native void jni_YGNodeInsertChild(long nativePointer, long childPointer, int index); diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index fe850333..66d743f5 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -10,11 +10,11 @@ import javax.annotation.Nullable; public abstract class YogaNode { public static YogaNode create() { - return new YogaNodeJNI(); + return YogaConfig.useBatchingForLayoutOutputs ? new YogaNodeJNIBatching() : new YogaNodeJNI(); } public static YogaNode create(YogaConfig config) { - return new YogaNodeJNI(config); + return YogaConfig.useBatchingForLayoutOutputs ? new YogaNodeJNIBatching(config) : new YogaNodeJNI(config); } public abstract void reset(); diff --git a/java/com/facebook/yoga/YogaNodeJNIBase.java b/java/com/facebook/yoga/YogaNodeJNIBase.java index ae4c42ed..e07bbb86 100644 --- a/java/com/facebook/yoga/YogaNodeJNIBase.java +++ b/java/com/facebook/yoga/YogaNodeJNIBase.java @@ -22,14 +22,14 @@ public abstract class YogaNodeJNIBase extends YogaNode { @Nullable private Object mData; public YogaNodeJNIBase() { - mNativePointer = YogaNative.jni_YGNodeNew(); + mNativePointer = YogaNative.jni_YGNodeNew(YogaConfig.useBatchingForLayoutOutputs); if (mNativePointer == 0) { throw new IllegalStateException("Failed to allocate native memory"); } } public YogaNodeJNIBase(YogaConfig config) { - mNativePointer = YogaNative.jni_YGNodeNewWithConfig(config.mNativePointer); + mNativePointer = YogaNative.jni_YGNodeNewWithConfig(config.mNativePointer, YogaConfig.useBatchingForLayoutOutputs); if (mNativePointer == 0) { throw new IllegalStateException("Failed to allocate native memory"); } diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index fa4e897d..a7fef2e6 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -72,6 +72,8 @@ const short int LAYOUT_MARGIN_START_INDEX = 6; const short int LAYOUT_PADDING_START_INDEX = 10; const short int LAYOUT_BORDER_START_INDEX = 14; +bool useBatchingForLayoutOutputs; + class PtrJNodeMap { using JNodeArray = JArrayClass; std::map ptrsToIdxs_; @@ -194,7 +196,7 @@ static void YGTransferLayoutOutputsRecursive( auto edgesSet = YGNodeEdges{root}; - if (false) { + if (useBatchingForLayoutOutputs) { bool marginFieldSet = edgesSet.has(YGNodeEdges::MARGIN); bool paddingFieldSet = edgesSet.has(YGNodeEdges::PADDING); bool borderFieldSet = edgesSet.has(YGNodeEdges::BORDER); @@ -431,16 +433,21 @@ static int YGJNILogFunc( return result; } -jlong jni_YGNodeNew(alias_ref) { +jlong jni_YGNodeNew(alias_ref thiz, jboolean useBatching) { const YGNodeRef node = YGNodeNew(); node->setContext(YGNodeContext{}.asVoidPtr); node->setPrintFunc(YGPrint); + useBatchingForLayoutOutputs = useBatching; return reinterpret_cast(node); } -jlong jni_YGNodeNewWithConfig(alias_ref, jlong configPointer) { +jlong jni_YGNodeNewWithConfig( + alias_ref, + jlong configPointer, + jboolean useBatching) { const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer)); node->setContext(YGNodeContext{}.asVoidPtr); + useBatchingForLayoutOutputs = useBatching; return reinterpret_cast(node); }