1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
10cb93a386Sopenharmony_ci#include "include/core/SkSurface.h"
11cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h"
12cb93a386Sopenharmony_ci#include "src/gpu/GrDirectContextPriv.h"
13cb93a386Sopenharmony_ci#include "src/gpu/GrGpu.h"
14cb93a386Sopenharmony_ci#include "tests/Test.h"
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cistatic bool check_read(skiatest::Reporter* reporter, const SkBitmap& bitmap) {
17cb93a386Sopenharmony_ci    bool result = true;
18cb93a386Sopenharmony_ci    for (int x = 0; x < 1000 && result; ++x) {
19cb93a386Sopenharmony_ci        const uint32_t srcPixel = *bitmap.getAddr32(x, 0);
20cb93a386Sopenharmony_ci        if (srcPixel != SK_ColorGREEN) {
21cb93a386Sopenharmony_ci            ERRORF(reporter, "Expected color of Green, but got 0x%08x, at pixel (%d, 0).",
22cb93a386Sopenharmony_ci                   x, srcPixel);
23cb93a386Sopenharmony_ci            result = false;
24cb93a386Sopenharmony_ci        }
25cb93a386Sopenharmony_ci    }
26cb93a386Sopenharmony_ci    return result;
27cb93a386Sopenharmony_ci}
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciDEF_GPUTEST_FOR_RENDERING_CONTEXTS(OpsTaskFlushCount, reporter, ctxInfo) {
30cb93a386Sopenharmony_ci    auto context = ctxInfo.directContext();
31cb93a386Sopenharmony_ci    GrGpu* gpu = context->priv().getGpu();
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    SkImageInfo imageInfo = SkImageInfo::Make(1000, 1, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci    sk_sp<SkSurface> surface1 = SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, imageInfo);
36cb93a386Sopenharmony_ci    if (!surface1) {
37cb93a386Sopenharmony_ci        return;
38cb93a386Sopenharmony_ci    }
39cb93a386Sopenharmony_ci    sk_sp<SkSurface> surface2 = SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, imageInfo);
40cb93a386Sopenharmony_ci    if (!surface2) {
41cb93a386Sopenharmony_ci        return;
42cb93a386Sopenharmony_ci    }
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci    SkCanvas* canvas1 = surface1->getCanvas();
45cb93a386Sopenharmony_ci    SkCanvas* canvas2 = surface2->getCanvas();
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci    canvas1->clear(SK_ColorRED);
48cb93a386Sopenharmony_ci    canvas2->clear(SK_ColorRED);
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    SkRect srcRect = SkRect::MakeWH(1, 1);
51cb93a386Sopenharmony_ci    SkRect dstRect = SkRect::MakeWH(1, 1);
52cb93a386Sopenharmony_ci    SkPaint paint;
53cb93a386Sopenharmony_ci    paint.setColor(SK_ColorGREEN);
54cb93a386Sopenharmony_ci    canvas1->drawRect(dstRect, paint);
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci    for (int i = 0; i < 1000; ++i) {
57cb93a386Sopenharmony_ci        srcRect.fLeft = i;
58cb93a386Sopenharmony_ci        srcRect.fRight = srcRect.fLeft + 1;
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci        sk_sp<SkImage> image = surface1->makeImageSnapshot();
61cb93a386Sopenharmony_ci        canvas2->drawImageRect(image.get(), srcRect, dstRect, SkSamplingOptions(), nullptr,
62cb93a386Sopenharmony_ci                               SkCanvas::kStrict_SrcRectConstraint);
63cb93a386Sopenharmony_ci        if (i != 999) {
64cb93a386Sopenharmony_ci            dstRect.fLeft = i+1;
65cb93a386Sopenharmony_ci            dstRect.fRight = dstRect.fLeft + 1;
66cb93a386Sopenharmony_ci            image = surface2->makeImageSnapshot();
67cb93a386Sopenharmony_ci            canvas1->drawImageRect(image.get(), srcRect, dstRect, SkSamplingOptions(), nullptr,
68cb93a386Sopenharmony_ci                                   SkCanvas::kStrict_SrcRectConstraint);
69cb93a386Sopenharmony_ci        }
70cb93a386Sopenharmony_ci    }
71cb93a386Sopenharmony_ci    context->flushAndSubmit();
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci    // In total we make 2000 oplists. Our current limit on max oplists between flushes is 100, so we
74cb93a386Sopenharmony_ci    // should do 20 flushes while executing oplists. Additionaly we always do 1 flush at the end of
75cb93a386Sopenharmony_ci    // executing all oplists. So in total we should see 21 flushes here.
76cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, gpu->stats()->numSubmitToGpus() == 21);
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    SkBitmap readbackBitmap;
79cb93a386Sopenharmony_ci    readbackBitmap.allocN32Pixels(1000, 1);
80cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, surface1->readPixels(readbackBitmap, 0, 0));
81cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, check_read(reporter, readbackBitmap));
82cb93a386Sopenharmony_ci
83cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, surface2->readPixels(readbackBitmap, 0, 0));
84cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, check_read(reporter, readbackBitmap));
85cb93a386Sopenharmony_ci}
86