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