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

#include "gm/gm.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkData.h"
#include "include/core/SkFont.h"
#include "include/core/SkPaint.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "include/core/SkSurface.h"
#include "src/gpu/GrDirectContextPriv.h"
#include "src/gpu/GrSurfaceDrawContext.h"
#include "tests/Test.h"
#include "tests/sksl/dslfp/GrDSLFPTest_DoStatement.h"
#include "tests/sksl/dslfp/GrDSLFPTest_ForStatement.h"
#include "tests/sksl/dslfp/GrDSLFPTest_IfStatement.h"
#include "tests/sksl/dslfp/GrDSLFPTest_SwitchStatement.h"
#include "tests/sksl/dslfp/GrDSLFPTest_Swizzle.h"
#include "tests/sksl/dslfp/GrDSLFPTest_Ternary.h"
#include "tests/sksl/dslfp/GrDSLFPTest_WhileStatement.h"
#include "tools/Resources.h"
#include "tools/ToolUtils.h"

template <typename FPClass, typename... Uniforms>
static void test_dsl_fp(skiatest::Reporter* r,
                        GrDirectContext* ctx,
                        bool worksInES2,
                        Uniforms&&... uniforms) {
    if (!worksInES2) {
        // We don't have an ES2 caps bit, so we check for integer support and derivatives support.
        // Our ES2 bots should return false for these.
        if (!ctx->priv().caps()->shaderCaps()->shaderDerivativeSupport() ||
            !ctx->priv().caps()->shaderCaps()->integerSupport()) {
            return;
        }
    }
    std::unique_ptr<GrSurfaceDrawContext> rtCtx =
            GrSurfaceDrawContext::Make(ctx,
                                       GrColorType::kRGBA_8888,
                                       /*colorSpace=*/nullptr,
                                       SkBackingFit::kApprox,
                                       /*dimensions=*/{1, 1},
                                       SkSurfaceProps{});

    rtCtx->fillRectWithFP(SkIRect::MakeWH(1, 1),
                          FPClass::Make(std::forward<Uniforms>(uniforms)...));

    SkImageInfo dstInfo = SkImageInfo::Make(/*width=*/1, /*height=*/1, kRGBA_8888_SkColorType,
                                            kPremul_SkAlphaType, /*cs=*/nullptr);
    GrPixmap dstPM = GrPixmap::Allocate(dstInfo);
    REPORTER_ASSERT(r, rtCtx->readPixels(ctx, dstPM, /*srcPt=*/{0, 0}));

    const GrColor* color = static_cast<const GrColor*>(dstPM.addr());
    REPORTER_ASSERT(r, *color == GrColorPackRGBA(0x00, 0xFF, 0x00, 0xFF),
                    "Expected: solid green. Actual: A=%02X R=%02X G=%02X B=%02X.",
                    GrColorUnpackA(*color), GrColorUnpackR(*color),
                    GrColorUnpackG(*color), GrColorUnpackB(*color));
}

#define DSL_FP_TEST_ES2(FPClass, ...)                                                    \
    DEF_GPUTEST_FOR_RENDERING_CONTEXTS(FPClass, r, ctxInfo) {                            \
        return test_dsl_fp<Gr##FPClass>(r, ctxInfo.directContext(), /*worksInES2=*/true, \
                                        ##__VA_ARGS__);                                  \
    }
#define DSL_FP_TEST(FPClass, ...)                                                         \
    DEF_GPUTEST_FOR_RENDERING_CONTEXTS(FPClass, r, ctxInfo) {                             \
        return test_dsl_fp<Gr##FPClass>(r, ctxInfo.directContext(), /*worksInES2=*/false, \
                                        ##__VA_ARGS__);                                   \
    }

DSL_FP_TEST_ES2(DSLFPTest_IfStatement, /*one:*/ 1.0f, /*unused:*/ 555.0f)
DSL_FP_TEST_ES2(DSLFPTest_Swizzle)
DSL_FP_TEST_ES2(DSLFPTest_Ternary, /*primaryColors:*/true,
                                   /*colorGreen:*/   SkPMColor4f{0.0, 1.0, 0.0, 1.0},
                                   /*colorRed:*/     SkPMColor4f{1.0, 0.0, 0.0, 1.0},
                                   /*colorOrange:*/  SkPMColor4f{1.0, 0.5, 0.0, 1.0},
                                   /*colorPurple:*/  SkPMColor4f{0.5, 0.0, 0.5, 1.0})
DSL_FP_TEST(DSLFPTest_DoStatement, /*shouldLoop:*/ false)
DSL_FP_TEST(DSLFPTest_ForStatement, /*colorWhite:*/ SkPMColor4f{1, 1, 1, 1})
DSL_FP_TEST(DSLFPTest_SwitchStatement, /*ten:*/ 10);
DSL_FP_TEST(DSLFPTest_WhileStatement)
