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:
committed by
Facebook Github Bot
parent
c11faf2d56
commit
74ce5afd9e
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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();
|
||||||
|
@@ -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");
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user