/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/core/SkRasterPipeline.h"
#include "src/core/SkRasterPipelineOpContexts.h"
#include "src/core/SkRasterPipelineOpList.h"
#include "tests/Test.h"

#include <cstdint>

DEF_TEST(F16Stages, r) {
    // Make sure SkRasterPipelineOp::load_f16 and store_f16 can handle a range of
    // ordinary (0<=x<=1) and interesting (x<0, x>1) values.
    float floats[16] = {
        0.0f, 0.25f, 0.5f, 1.0f,
        -1.25f, -0.5f, 1.25f, 2.0f,
        0,0,0,0, 0,0,0,0,  // pad a bit to make sure we qualify for platform-specific code
    };
    uint64_t halfs[4] = {0,0,0,0};

    SkRasterPipeline_MemoryCtx f32 = { floats, 0 },
                               f16 = { halfs,  0 };

    {
        SkRasterPipeline_<256> p;
        p.append(SkRasterPipelineOp:: load_f32, &f32);
        p.append(SkRasterPipelineOp::store_f16, &f16);
        p.run(0,0,16/4,1);
    }
    REPORTER_ASSERT(r, ((halfs[0] >>  0) & 0xffff) == 0x0000);
    REPORTER_ASSERT(r, ((halfs[0] >> 16) & 0xffff) == 0x3400);
    REPORTER_ASSERT(r, ((halfs[0] >> 32) & 0xffff) == 0x3800);
    REPORTER_ASSERT(r, ((halfs[0] >> 48) & 0xffff) == 0x3c00);
    REPORTER_ASSERT(r, ((halfs[1] >>  0) & 0xffff) == 0xbd00);
    REPORTER_ASSERT(r, ((halfs[1] >> 16) & 0xffff) == 0xb800);
    REPORTER_ASSERT(r, ((halfs[1] >> 32) & 0xffff) == 0x3d00);
    REPORTER_ASSERT(r, ((halfs[1] >> 48) & 0xffff) == 0x4000);

    {
        SkRasterPipeline_<256> p;
        p.append(SkRasterPipelineOp:: load_f16, &f16);
        p.append(SkRasterPipelineOp::store_f32, &f32);
        p.run(0,0,16/4,1);
    }
    REPORTER_ASSERT(r, floats[0] ==  0.00f);
    REPORTER_ASSERT(r, floats[1] ==  0.25f);
    REPORTER_ASSERT(r, floats[2] ==  0.50f);
    REPORTER_ASSERT(r, floats[3] ==  1.00f);
    REPORTER_ASSERT(r, floats[4] == -1.25f);
    REPORTER_ASSERT(r, floats[5] == -0.50f);
    REPORTER_ASSERT(r, floats[6] ==  1.25f);
    REPORTER_ASSERT(r, floats[7] ==  2.00f);
}
