| /* |
| * 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); |