blob: f9d2973d0625510860fdc2d517750977817e28a4 [file] [log] [blame] [edit]
/*
* Copyright 2022 Rive
*/
#include "bench.hpp"
#include "rive/math/raw_path.hpp"
#include "rive/math/simd.hpp"
using namespace rive;
static Vec2D randpt()
{
return Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX;
}
// Measure the speed of RawPath iteration. In an attempt to be representative of
// algorithms that need to know p0 for lines and cubics, we sum up the midpoints
// of lines and cubics.
class IterateRawPath : public Bench
{
public:
IterateRawPath()
{
// Make a random path.
srand(0);
for (int i = 0; i < 1000000; ++i)
{
int r = rand() % 22;
if (r == 0)
{
m_path.move(randpt());
}
else if (r == 1)
{
m_path.close();
}
else if (r < 12)
{
m_path.line(randpt());
}
else
{
m_path.cubic(randpt(), randpt(), randpt());
}
}
}
private:
int run() const override
{
float4 midpointsSum{};
float2 startPt{};
for (auto [verb, p] : m_path)
{
switch (verb)
{
case PathVerb::move:
startPt = simd::load2f(&p[0].x);
break;
case PathVerb::line:
{
float4 p0_1 = simd::load4f(&p[0].x);
midpointsSum += p0_1 * .5f;
break;
}
case PathVerb::cubic:
{
float4 p0_1 = simd::load4f(&p[0].x);
midpointsSum += p0_1 * float4{.125f, .125f, .75f, .75f};
float4 p2_3 = simd::load4f(&p[2].x);
midpointsSum += p2_3 * float4{.75f, .75f, .125f, .125f};
break;
}
case PathVerb::close:
{
float4 p0_1;
p0_1.xy = simd::load2f(&p[0].x);
p0_1.zw = startPt;
midpointsSum += p0_1 * .5f;
break;
}
case PathVerb::quad:
RIVE_UNREACHABLE();
}
}
midpointsSum.xy += midpointsSum.zw;
return (int)(midpointsSum.x + midpointsSum.y);
}
RawPath m_path;
};
REGISTER_BENCH(IterateRawPath);