129 lines
3.9 KiB
C++
129 lines
3.9 KiB
C++
|
|
/*
|
||
|
|
* Copyright 2022 Google LLC
|
||
|
|
*
|
||
|
|
* Use of this source code is governed by a BSD-style license that can be
|
||
|
|
* found in the LICENSE file.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "tests/Test.h"
|
||
|
|
|
||
|
|
#include "include/core/SkBitmap.h"
|
||
|
|
#include "include/gpu/graphite/Context.h"
|
||
|
|
#include "include/gpu/graphite/Recording.h"
|
||
|
|
#include "src/gpu/graphite/ContextPriv.h"
|
||
|
|
#include "src/gpu/graphite/Surface_Graphite.h"
|
||
|
|
#include "tests/TestUtils.h"
|
||
|
|
#include "tools/ToolUtils.h"
|
||
|
|
|
||
|
|
using namespace skgpu::graphite;
|
||
|
|
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
const SkISize kSurfaceSize = { 64, 64 };
|
||
|
|
|
||
|
|
constexpr SkColor4f kBackgroundColor = SkColors::kWhite;
|
||
|
|
|
||
|
|
bool run_test(skiatest::Reporter* reporter,
|
||
|
|
Context* context,
|
||
|
|
Recorder* recorder) {
|
||
|
|
SkImageInfo ii = SkImageInfo::Make(kSurfaceSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
|
||
|
|
|
||
|
|
SkBitmap result0, result1;
|
||
|
|
result0.allocPixels(ii);
|
||
|
|
result1.allocPixels(ii);
|
||
|
|
SkPixmap pm0, pm1;
|
||
|
|
|
||
|
|
SkAssertResult(result0.peekPixels(&pm0));
|
||
|
|
SkAssertResult(result1.peekPixels(&pm1));
|
||
|
|
|
||
|
|
sk_sp<SkSurface> surface = SkSurface::MakeGraphite(recorder, ii);
|
||
|
|
if (!surface) {
|
||
|
|
ERRORF(reporter, "Surface creation failed");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
SkCanvas* canvas = surface->getCanvas();
|
||
|
|
|
||
|
|
// Set up a recording to clear the surface
|
||
|
|
canvas->clear(kBackgroundColor);
|
||
|
|
std::unique_ptr<Recording> clearRecording = recorder->snap();
|
||
|
|
if (!clearRecording) {
|
||
|
|
ERRORF(reporter, "Recording creation failed");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Draw some text and get recording
|
||
|
|
SkPaint paint;
|
||
|
|
paint.setAntiAlias(true);
|
||
|
|
|
||
|
|
SkFont font(ToolUtils::create_portable_typeface("serif", SkFontStyle()));
|
||
|
|
font.setSubpixel(true);
|
||
|
|
font.setSize(12);
|
||
|
|
|
||
|
|
const char* text0 = "Hamburge";
|
||
|
|
const size_t text0Len = strlen(text0);
|
||
|
|
|
||
|
|
canvas->drawSimpleText(text0, text0Len, SkTextEncoding::kUTF8, 3, 20, font, paint);
|
||
|
|
std::unique_ptr<Recording> text0Recording = recorder->snap();
|
||
|
|
|
||
|
|
// Draw some more text and get recording
|
||
|
|
const char* text1 = "burgefons";
|
||
|
|
const size_t text1Len = strlen(text1);
|
||
|
|
|
||
|
|
canvas->drawSimpleText(text1, text1Len, SkTextEncoding::kUTF8, 3, 40, font, paint);
|
||
|
|
std::unique_ptr<Recording> text1Recording = recorder->snap();
|
||
|
|
|
||
|
|
// Playback 0, then 1, and read pixels
|
||
|
|
InsertRecordingInfo info;
|
||
|
|
info.fRecording = clearRecording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
info.fRecording = text0Recording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
info.fRecording = text1Recording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
context->submit();
|
||
|
|
|
||
|
|
if (!surface->readPixels(pm0, 0, 0)) {
|
||
|
|
ERRORF(reporter, "readPixels failed");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Playback 1, then 0, and read pixels
|
||
|
|
info.fRecording = clearRecording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
info.fRecording = text1Recording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
info.fRecording = text0Recording.get();
|
||
|
|
context->insertRecording(info);
|
||
|
|
context->submit();
|
||
|
|
|
||
|
|
if (!surface->readPixels(pm1, 0, 0)) {
|
||
|
|
ERRORF(reporter, "readPixels failed");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Compare and contrast
|
||
|
|
float tol = 1.f/256;
|
||
|
|
const float tols[4] = {tol, tol, tol, tol};
|
||
|
|
auto error = std::function<ComparePixmapsErrorReporter>([&](int x, int y,
|
||
|
|
const float diffs[4]) {
|
||
|
|
SkASSERT(x >= 0 && y >= 0);
|
||
|
|
ERRORF(reporter,
|
||
|
|
"Error at %d, %d. Diff in floats: (%f, %f, %f, %f)",
|
||
|
|
x, y, diffs[0], diffs[1], diffs[2], diffs[3]);
|
||
|
|
});
|
||
|
|
ComparePixels(pm0, pm1, tols, error);
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
} // anonymous namespace
|
||
|
|
|
||
|
|
// This test captures two recordings A and B, plays them back as A then B, and B then A,
|
||
|
|
// and verifies that the result is the same.
|
||
|
|
DEF_GRAPHITE_TEST_FOR_RENDERING_CONTEXTS(RecordingOrderTest_Graphite, reporter, context) {
|
||
|
|
std::unique_ptr<Recorder> recorder = context->makeRecorder();
|
||
|
|
|
||
|
|
(void) run_test(reporter, context, recorder.get());
|
||
|
|
}
|