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