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
This commit is contained in:
Sidharth Guglani
2019-04-01 06:11:51 -07:00
committed by Facebook Github Bot
parent c11faf2d56
commit 74ce5afd9e
5 changed files with 17 additions and 9 deletions

View File

@@ -11,6 +11,7 @@ import com.facebook.soloader.SoLoader;
public class YogaConfig { public class YogaConfig {
public static int SPACING_TYPE = 1; public static int SPACING_TYPE = 1;
public static boolean useBatchingForLayoutOutputs = false;
long mNativePointer; long mNativePointer;
private YogaLogger mLogger; private YogaLogger mLogger;

View File

@@ -29,8 +29,8 @@ public class YogaNative {
// YGNode related // YGNode related
static native int jni_YGNodeGetInstanceCount(); static native int jni_YGNodeGetInstanceCount();
static native long jni_YGNodeNew(); static native long jni_YGNodeNew(boolean useBatchingForLayoutOutputs);
static native long jni_YGNodeNewWithConfig(long configPointer); static native long jni_YGNodeNewWithConfig(long configPointer, boolean useBatchingForLayoutOutputs);
static native void jni_YGNodeFree(long nativePointer); static native void jni_YGNodeFree(long nativePointer);
static native void jni_YGNodeReset(long nativePointer); static native void jni_YGNodeReset(long nativePointer);
static native void jni_YGNodeInsertChild(long nativePointer, long childPointer, int index); static native void jni_YGNodeInsertChild(long nativePointer, long childPointer, int index);

View File

@@ -10,11 +10,11 @@ import javax.annotation.Nullable;
public abstract class YogaNode { public abstract class YogaNode {
public static YogaNode create() { public static YogaNode create() {
return new YogaNodeJNI(); return YogaConfig.useBatchingForLayoutOutputs ? new YogaNodeJNIBatching() : new YogaNodeJNI();
} }
public static YogaNode create(YogaConfig config) { public static YogaNode create(YogaConfig config) {
return new YogaNodeJNI(config); return YogaConfig.useBatchingForLayoutOutputs ? new YogaNodeJNIBatching(config) : new YogaNodeJNI(config);
} }
public abstract void reset(); public abstract void reset();

View File

@@ -22,14 +22,14 @@ public abstract class YogaNodeJNIBase extends YogaNode {
@Nullable private Object mData; @Nullable private Object mData;
public YogaNodeJNIBase() { public YogaNodeJNIBase() {
mNativePointer = YogaNative.jni_YGNodeNew(); mNativePointer = YogaNative.jni_YGNodeNew(YogaConfig.useBatchingForLayoutOutputs);
if (mNativePointer == 0) { if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory"); throw new IllegalStateException("Failed to allocate native memory");
} }
} }
public YogaNodeJNIBase(YogaConfig config) { public YogaNodeJNIBase(YogaConfig config) {
mNativePointer = YogaNative.jni_YGNodeNewWithConfig(config.mNativePointer); mNativePointer = YogaNative.jni_YGNodeNewWithConfig(config.mNativePointer, YogaConfig.useBatchingForLayoutOutputs);
if (mNativePointer == 0) { if (mNativePointer == 0) {
throw new IllegalStateException("Failed to allocate native memory"); throw new IllegalStateException("Failed to allocate native memory");
} }

View File

@@ -72,6 +72,8 @@ const short int LAYOUT_MARGIN_START_INDEX = 6;
const short int LAYOUT_PADDING_START_INDEX = 10; const short int LAYOUT_PADDING_START_INDEX = 10;
const short int LAYOUT_BORDER_START_INDEX = 14; const short int LAYOUT_BORDER_START_INDEX = 14;
bool useBatchingForLayoutOutputs;
class PtrJNodeMap { class PtrJNodeMap {
using JNodeArray = JArrayClass<JYogaNode::javaobject>; using JNodeArray = JArrayClass<JYogaNode::javaobject>;
std::map<YGNodeRef, size_t> ptrsToIdxs_; std::map<YGNodeRef, size_t> ptrsToIdxs_;
@@ -194,7 +196,7 @@ static void YGTransferLayoutOutputsRecursive(
auto edgesSet = YGNodeEdges{root}; auto edgesSet = YGNodeEdges{root};
if (false) { if (useBatchingForLayoutOutputs) {
bool marginFieldSet = edgesSet.has(YGNodeEdges::MARGIN); bool marginFieldSet = edgesSet.has(YGNodeEdges::MARGIN);
bool paddingFieldSet = edgesSet.has(YGNodeEdges::PADDING); bool paddingFieldSet = edgesSet.has(YGNodeEdges::PADDING);
bool borderFieldSet = edgesSet.has(YGNodeEdges::BORDER); bool borderFieldSet = edgesSet.has(YGNodeEdges::BORDER);
@@ -431,16 +433,21 @@ static int YGJNILogFunc(
return result; return result;
} }
jlong jni_YGNodeNew(alias_ref<jclass>) { jlong jni_YGNodeNew(alias_ref<jobject> thiz, jboolean useBatching) {
const YGNodeRef node = YGNodeNew(); const YGNodeRef node = YGNodeNew();
node->setContext(YGNodeContext{}.asVoidPtr); node->setContext(YGNodeContext{}.asVoidPtr);
node->setPrintFunc(YGPrint); node->setPrintFunc(YGPrint);
useBatchingForLayoutOutputs = useBatching;
return reinterpret_cast<jlong>(node); return reinterpret_cast<jlong>(node);
} }
jlong jni_YGNodeNewWithConfig(alias_ref<jclass>, jlong configPointer) { jlong jni_YGNodeNewWithConfig(
alias_ref<jclass>,
jlong configPointer,
jboolean useBatching) {
const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer)); const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer));
node->setContext(YGNodeContext{}.asVoidPtr); node->setContext(YGNodeContext{}.asVoidPtr);
useBatchingForLayoutOutputs = useBatching;
return reinterpret_cast<jlong>(node); return reinterpret_cast<jlong>(node);
} }