2c21a11923
afaict the perf surprises associated with: https://skia-review.googlesource.com/c/skia/+/334417 (Remove SkBaseDevice::flush) were bc Ganesh resolves MSAA buffers for SkCanvas::flush but doesn't do so for GrDirectContext::flush. Where possible this CL switches SkCanvas::flush to SkSurface::flush (which will also resolve MSAA buffers) so that when https://skia-review.googlesource.com/c/skia/+/334417 relands there should not be any performance surprises. Change-Id: I705ad6219f0f625a88cf3f9e8b2418a3182d298c Reviewed-on: https://skia-review.googlesource.com/c/skia/+/335866 Commit-Queue: Robert Phillips <robertphillips@google.com> Reviewed-by: Adlai Holler <adlai@google.com>
83 lines
2.9 KiB
C++
83 lines
2.9 KiB
C++
/*
|
|
* Copyright 2019 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "include/core/SkPaint.h"
|
|
#include "include/core/SkPicture.h"
|
|
#include "include/core/SkPictureRecorder.h"
|
|
#include "include/core/SkRect.h"
|
|
#include "tests/Test.h"
|
|
#include "tools/debugger/DebugLayerManager.h"
|
|
|
|
// Adds one full update, one partial update, and requests one image a few frames later.
|
|
static void test_basic(skiatest::Reporter* reporter) {
|
|
// prepare supporting objects
|
|
int layerWidth = 100;
|
|
int layerHeight = 100;
|
|
|
|
// make a picture that fully updates the layer
|
|
SkPictureRecorder rec;
|
|
SkCanvas* canvas = rec.beginRecording(layerWidth, layerHeight);
|
|
canvas->clear(0x00000000);
|
|
SkPaint paint;
|
|
paint.setColor(SK_ColorBLUE);
|
|
canvas->drawOval(SkRect::MakeLTRB(1,1,99,99), paint);
|
|
auto picture1 = rec.finishRecordingAsPicture();
|
|
SkIRect dirtyRectFull = SkIRect::MakeLTRB(0, 0, layerWidth, layerHeight);
|
|
|
|
// make a second picture that acts as a partial update.
|
|
SkPictureRecorder rec2;
|
|
canvas = rec2.beginRecording(layerWidth, layerHeight);
|
|
paint.setColor(SK_ColorGREEN);
|
|
canvas->drawOval(SkRect::MakeLTRB(40,40,60,60), paint);
|
|
auto picture2 = rec2.finishRecordingAsPicture();
|
|
SkIRect dirtyRectPartial = SkIRect::MakeLTRB(40,40,60,60);
|
|
|
|
int node = 2;
|
|
|
|
// create and exercise DebugLayerManager
|
|
DebugLayerManager dlm;
|
|
dlm.storeSkPicture(node, 0, picture1, dirtyRectFull);
|
|
dlm.storeSkPicture(node, 10, picture2, dirtyRectPartial);
|
|
auto frames = dlm.listFramesForNode(node);
|
|
|
|
// Confirm the layer manager stored these at the right places.
|
|
REPORTER_ASSERT(reporter, frames.size() == 2);
|
|
REPORTER_ASSERT(reporter, frames[0] == 0);
|
|
REPORTER_ASSERT(reporter, frames[1] == 10);
|
|
|
|
SkPixmap pixmap;
|
|
// request an image of the layer between the two updates.
|
|
for (int i=0; i<10; i++) {
|
|
auto image = dlm.getLayerAsImage(node, i);
|
|
REPORTER_ASSERT(reporter, image->width() == layerWidth);
|
|
REPORTER_ASSERT(reporter, image->height() == layerHeight);
|
|
// confirm center is blue, proving only first pic was drawn.
|
|
image->peekPixels(&pixmap);
|
|
SkColor paintColor = pixmap.getColor(50, 50);
|
|
REPORTER_ASSERT(reporter, paintColor == SK_ColorBLUE);
|
|
}
|
|
|
|
// For any images after the second draw, confirm the center is green, but the area just outside
|
|
// that smaller circle is still blue, proving dlm drew both pictures.
|
|
for (int i=10; i<12; i++) {
|
|
auto image = dlm.getLayerAsImage(node, i);
|
|
REPORTER_ASSERT(reporter, image->width() == layerWidth);
|
|
REPORTER_ASSERT(reporter, image->height() == layerHeight);
|
|
image->peekPixels(&pixmap);
|
|
auto innerColor = pixmap.getColor(50, 50);
|
|
REPORTER_ASSERT(reporter, innerColor == SK_ColorGREEN);
|
|
auto outerColor = pixmap.getColor(10, 50);
|
|
REPORTER_ASSERT(reporter, outerColor == SK_ColorBLUE);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
DEF_TEST(DebugLayerManagerTest, reporter) {
|
|
test_basic(reporter);
|
|
}
|