blob: bd03e100aeda88e42b85b5c7c1d92fa6c57be334 [file] [log] [blame] [edit]
/*
* Copyright 2022 Rive
*/
#include "bench.hpp"
#include "rive/math/raw_path.hpp"
using namespace rive;
static void map(const Mat2D& m,
std::vector<Vec2D>& dst,
const std::vector<Vec2D>& pts)
{
size_t n = pts.size();
#if 0
// Scalar implementation.
for (size_t i = 0; i < n; ++i)
dst[i] = m * pts[i];
#else
// Vector implementation.
m.mapPoints(dst.data(), pts.data(), n);
#endif
}
// Measure the speed of Mat2D::mapPoints().
class MapPoints : public Bench
{
public:
MapPoints(const Mat2D& matrix) : m_matrix(matrix)
{
m_points.resize(32768 / sizeof(Vec2D)); // 32k so we fit in L1.
srand(0);
for (Vec2D& pt : m_points)
pt = Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX;
m_dst.resize(m_points.size());
}
private:
int run() const override
{
map(m_matrix, m_dst, m_points);
for (int i = 1; i < 4096; ++i)
map(m_matrix, m_dst, m_dst);
return static_cast<int>(m_dst.back().x);
}
Mat2D m_matrix;
std::vector<Vec2D> m_points;
mutable std::vector<Vec2D> m_dst;
};
class MapPointsScaleTrans : public MapPoints
{
public:
MapPointsScaleTrans() : MapPoints(Mat2D(-2, 0, 0, 3, -4, 5)) {}
};
class MapPointsAffine : public MapPoints
{
public:
MapPointsAffine() : MapPoints(Mat2D(2, -3, -4, 5, 6, -7)) {}
};
REGISTER_BENCH(MapPointsScaleTrans);
REGISTER_BENCH(MapPointsAffine);