Skip to content

Commit

Permalink
Expose replacement wrapper of CalculateLayout + (de)serialize layout …
Browse files Browse the repository at this point in the history
…inputs (#1575)

Summary:
Pull Request resolved: #1575

If we want to replay layouts for benchmark, we should also capture the inputs. This diff does that as well as changing the API in CaptureTree.h. We now expose YGCalculateLayoutWithCapture designed to be a drop-in replacement for YGCalculateLayout. This allows us to have a bit more control on the order of everything and lets us capture measure functions in the next diff much easier.

Reviewed By: NickGerleman

Differential Revision: D53444261

fbshipit-source-id: 616e39153c21e7b472911502b6a717e92c88a4d1
  • Loading branch information
joevilches authored and facebook-github-bot committed Feb 10, 2024
1 parent 753b319 commit cc66362
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 16 deletions.
7 changes: 6 additions & 1 deletion benchmark/Benchmark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,14 @@ BenchmarkResult generateBenchmark(const std::filesystem::path& capturePath) {
YogaNodeAndConfig root = buildTreeFromJson(capture, nullptr, 0 /*index*/);
auto treeCreationEnd = steady_clock::now();

json layoutInputs = capture["layout-inputs"];
float availableWidth = layoutInputs["available-width"];
float availableHeight = layoutInputs["available-height"];
YGDirection direction = directionFromString(layoutInputs["owner-direction"]);

auto layoutBegin = steady_clock::now();
YGNodeCalculateLayout(
root.node_.get(), YGUndefined, YGUndefined, YGDirectionLTR);
root.node_.get(), availableWidth, availableHeight, direction);
auto layoutEnd = steady_clock::now();

return BenchmarkResult{
Expand Down
12 changes: 12 additions & 0 deletions benchmark/TreeDeserialization.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,16 @@ inline std::string edgeStringFromPropertyName(
std::string propertyName) {
return it.key().substr(propertyName.length() + 1);
}

inline YGDirection directionFromString(std::string str) {
if (str == "ltr") {
return YGDirectionLTR;
} else if (str == "rtl") {
return YGDirectionRTL;
} else if (str == "inherit") {
return YGDirectionInherit;
} else {
throw std::invalid_argument(invalidArgumentMessage(str, "YGDirection"));
}
}
} // namespace facebook::yoga
28 changes: 22 additions & 6 deletions capture/CaptureTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,34 @@

#include <capture/CaptureTree.h>
#include <capture/NodeToString.h>
#include <nlohmann/json.hpp>

namespace facebook::yoga {

void captureTree(YGNodeRef node, const std::filesystem::path& path) {
std::string str;
nodeToString(
str,
using namespace nlohmann;

static void captureTree(
std::string_view serializedTree,
const std::filesystem::path& path) {
std::ofstream file(path);
file << serializedTree;
}

void YGNodeCalculateLayoutWithCapture(
YGNodeRef node,
float availableWidth,
float availableHeight,
YGDirection ownerDirection,
const std::filesystem::path& path) {
json j;
serializeLayoutInputs(j, availableWidth, availableHeight, ownerDirection);
serializeTree(
j,
node,
PrintOptions::Style | PrintOptions::Children | PrintOptions::Config |
PrintOptions::Node);
std::ofstream file(path);
file << str;
captureTree(j.dump(2), path);
YGNodeCalculateLayout(node, availableWidth, availableHeight, ownerDirection);
}

} // namespace facebook::yoga
7 changes: 6 additions & 1 deletion capture/CaptureTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@

namespace facebook::yoga {

void captureTree(YGNodeRef node, const std::filesystem::path& path);
void YGNodeCalculateLayoutWithCapture(
YGNodeRef node,
float availableWidth,
float availableHeight,
YGDirection ownerDirection,
const std::filesystem::path& path);

} // namespace facebook::yoga
19 changes: 12 additions & 7 deletions capture/NodeToString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <memory>

#include <capture/NodeToString.h>
#include <nlohmann/json.hpp>

namespace facebook::yoga {

Expand Down Expand Up @@ -121,7 +120,7 @@ YGValue borderFloatToYGValue(YGNodeRef node, YGEdge edge) {
return YGValue{val, unit};
}

static void nodeToStringImpl(json& j, YGNodeRef node, PrintOptions options) {
void serializeTree(json& j, YGNodeRef node, PrintOptions options) {
if ((options & PrintOptions::Layout) == PrintOptions::Layout) {
j["layout"]["width"] = YGNodeStyleGetWidth(node).value;
j["layout"]["height"] = YGNodeStyleGetHeight(node).value;
Expand Down Expand Up @@ -303,15 +302,21 @@ static void nodeToStringImpl(json& j, YGNodeRef node, PrintOptions options) {
childCount > 0) {
for (size_t i = 0; i < childCount; i++) {
j["children"].push_back({});
nodeToStringImpl(j["children"][i], YGNodeGetChild(node, i), options);
serializeTree(j["children"][i], YGNodeGetChild(node, i), options);
}
}
}

void nodeToString(std::string& str, YGNodeRef node, PrintOptions options) {
json j;
nodeToStringImpl(j, node, options);
str = j.dump(2);
void serializeLayoutInputs(
json& j,
float availableWidth,
float availableHeight,
YGDirection ownerDirection) {
j["layout-inputs"] = {
{"available-width", availableWidth},
{"available-height", availableHeight},
{"owner-direction", YGDirectionToString(ownerDirection)},
};
}

} // namespace facebook::yoga
9 changes: 8 additions & 1 deletion capture/NodeToString.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <string>

#include <nlohmann/json.hpp>
#include <yoga/Yoga.h>

namespace facebook::yoga {
Expand All @@ -22,6 +23,12 @@ enum class PrintOptions : uint8_t {
};
YG_DEFINE_ENUM_FLAG_OPERATORS(PrintOptions);

void nodeToString(std::string& str, YGNodeRef node, PrintOptions options);
void serializeTree(nlohmann::json& j, YGNodeRef root, PrintOptions options);

void serializeLayoutInputs(
nlohmann::json& j,
float availableWidth,
float availableHeight,
YGDirection ownerDirection);

} // namespace facebook::yoga

0 comments on commit cc66362

Please sign in to comment.