From 795c5b156756796cbb3a584c99b1ab51fb5fe187 Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Fri, 21 Apr 2017 12:05:01 -0400 Subject: jumper, implement 2.2 stages with approx_powf My main interest is getting rid of weird code, but it's also faster. The new bench drops from 667 to 412. Change-Id: Ibf889601284cf925780320c828394f79937dc705 Reviewed-on: https://skia-review.googlesource.com/14035 Reviewed-by: Matt Sarett Commit-Queue: Mike Klein --- tests/ParametricStageTest.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'tests/ParametricStageTest.cpp') diff --git a/tests/ParametricStageTest.cpp b/tests/ParametricStageTest.cpp index 5810148454..0185abcb36 100644 --- a/tests/ParametricStageTest.cpp +++ b/tests/ParametricStageTest.cpp @@ -73,3 +73,36 @@ DEF_TEST(Parametric_inv_1dot8, r) { check_error(r, 1/510.0f, 1/1.8f); } DEF_TEST(Parametric_inv_2dot0, r) { check_error(r, 1/510.0f, 1/2.0f); } DEF_TEST(Parametric_inv_2dot2, r) { check_error(r, 1/510.0f, 1/2.2f); } DEF_TEST(Parametric_inv_2dot4, r) { check_error(r, 1/510.0f, 1/2.4f); } + +// As above, checking that the stage implements gamma within limit. +static void check_error(skiatest::Reporter* r, float limit, + float gamma, SkRasterPipeline::StockStage stage) { + + // We expect the gamma will only be applied to R,G,B, leaving A alone. + // So this isn't quite exhaustive, but it's pretty good. + float in[256], out[256]; + for (int i = 0; i < 256; i++) { + in [i] = i / 255.0f; + out[i] = 0.0f; // Not likely important. Just being tidy. + } + + const float* ip = in; + float* op = out; + + SkRasterPipeline p; + p.append(SkRasterPipeline::load_f32, &ip); + p.append(stage); + p.append(SkRasterPipeline::store_f32, &op); + p.run(0, 256/4); + + for (int i = 0; i < 256; i++) { + float want = powf(i/255.0f, (i%4) == 3 ? 1.0f + : gamma); + float err = fabsf(out[i] - want); + if (err > limit) { + ERRORF(r, "At %d, error was %g (got %g, want %g)", i, err, out[i], want); + } + } +} +DEF_TEST(from_2dot2, r) { check_error(r, 1/510.f, 2.2f, SkRasterPipeline::from_2dot2); } +DEF_TEST( to_2dot2, r) { check_error(r, 1/510.f, 1/2.2f,SkRasterPipeline:: to_2dot2); } -- cgit v1.2.3