83 lines
2.8 KiB
C++
83 lines
2.8 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/core/SkCanvas.h"
|
|
#include "include/core/SkPath.h"
|
|
#include "include/core/SkPixmap.h"
|
|
#include "include/gpu/graphite/Context.h"
|
|
#include "include/gpu/graphite/Recorder.h"
|
|
#include "include/gpu/graphite/Recording.h"
|
|
#include "src/gpu/graphite/Surface_Graphite.h"
|
|
|
|
namespace skgpu::graphite {
|
|
|
|
// Tests that a drawing with MSAA will have contents retained between recordings.
|
|
// This is for testing MSAA load from resolve feature.
|
|
DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(MultisampleRetainTest, reporter, context) {
|
|
const SkImageInfo surfaceImageInfo = SkImageInfo::Make(
|
|
16, 16, SkColorType::kRGBA_8888_SkColorType, SkAlphaType::kPremul_SkAlphaType);
|
|
|
|
std::unique_ptr<Recorder> surfaceRecorder = context->makeRecorder();
|
|
sk_sp<SkSurface> surface = SkSurface::MakeGraphite(surfaceRecorder.get(), surfaceImageInfo);
|
|
|
|
// Clear entire surface to red
|
|
SkCanvas* surfaceCanvas = surface->getCanvas();
|
|
surfaceCanvas->clear(SkColors::kRed);
|
|
std::unique_ptr<Recording> surfaceRecording = surfaceRecorder->snap();
|
|
// Flush the clearing
|
|
context->insertRecording({surfaceRecording.get()});
|
|
|
|
// Draw a blue path. The old red background should be retained between recordings.
|
|
SkPaint paint;
|
|
paint.setStrokeWidth(3);
|
|
paint.setColor(SkColors::kBlue);
|
|
paint.setStyle(SkPaint::Style::kStroke_Style);
|
|
|
|
SkPath path;
|
|
constexpr int kPathPoints[][2] = {
|
|
{3, 2},
|
|
{3, 4},
|
|
{6, 8},
|
|
{3, 15},
|
|
};
|
|
|
|
for (size_t i = 0; i < std::size(kPathPoints); ++i) {
|
|
path.lineTo(kPathPoints[i][0], kPathPoints[i][1]);
|
|
}
|
|
|
|
surfaceCanvas->drawPath(path, paint);
|
|
|
|
std::unique_ptr<Recording> surfaceRecording2 = surfaceRecorder->snap();
|
|
// Play back recording.
|
|
context->insertRecording({surfaceRecording2.get()});
|
|
|
|
// Read pixels.
|
|
SkBitmap bitmap;
|
|
bitmap.allocPixels(surfaceImageInfo);
|
|
if (!surface->readPixels(bitmap, 0, 0)) {
|
|
ERRORF(reporter, "readPixels failed");
|
|
return;
|
|
}
|
|
|
|
// Verify recording was replayed.
|
|
REPORTER_ASSERT(reporter, bitmap.getColor4f(8, 0) == SkColors::kRed);
|
|
REPORTER_ASSERT(reporter, bitmap.getColor4f(0, 8) == SkColors::kRed);
|
|
REPORTER_ASSERT(reporter, bitmap.getColor4f(15, 14) == SkColors::kRed);
|
|
|
|
// Verify points on the path have blue color. We don't verify last point because it is on the
|
|
// edge of the path thus might have blurry color.
|
|
for (size_t i = 0; i < std::size(kPathPoints) - 1; ++i) {
|
|
REPORTER_ASSERT(reporter,
|
|
bitmap.getColor4f(kPathPoints[i][0], kPathPoints[i][1]) == SkColors::kBlue);
|
|
}
|
|
}
|
|
|
|
} // namespace skgpu::graphite
|