64 lines
2.5 KiB
C++
64 lines
2.5 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/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 Recording can be replayed to a provided surface.
|
|
DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(RecordingSurfacesTest, 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);
|
|
Surface* graphiteSurface = static_cast<Surface*>(surface.get());
|
|
const TextureInfo& textureInfo = graphiteSurface->backingTextureProxy()->textureInfo();
|
|
|
|
// Flush the initial clear added by MakeGraphite.
|
|
std::unique_ptr<skgpu::graphite::Recording> surfaceRecording = surfaceRecorder->snap();
|
|
context->insertRecording({surfaceRecording.get()});
|
|
|
|
// Snap a recording without a bound target.
|
|
const SkImageInfo recordingImageInfo = surfaceImageInfo.makeDimensions(SkISize::Make(8, 16));
|
|
std::unique_ptr<Recorder> recorder = context->makeRecorder();
|
|
SkCanvas* canvas = recorder->makeDeferredCanvas(recordingImageInfo, textureInfo);
|
|
canvas->clear(SkColors::kRed);
|
|
// Can't make another canvas before snapping.
|
|
REPORTER_ASSERT(reporter,
|
|
recorder->makeDeferredCanvas(recordingImageInfo, textureInfo) == nullptr);
|
|
std::unique_ptr<Recording> recording = recorder->snap();
|
|
|
|
// Play back recording.
|
|
context->insertRecording({recording.get(), surface.get()});
|
|
|
|
// Read pixels.
|
|
SkBitmap bitmap;
|
|
SkPixmap pixmap;
|
|
bitmap.allocPixels(surfaceImageInfo);
|
|
SkAssertResult(bitmap.peekPixels(&pixmap));
|
|
if (!surface->readPixels(pixmap, 0, 0)) {
|
|
ERRORF(reporter, "readPixels failed");
|
|
return;
|
|
}
|
|
|
|
// Verify recording was replayed and is now uninstantiated.
|
|
REPORTER_ASSERT(reporter, pixmap.getColor4f(0, 0) == SkColors::kRed);
|
|
REPORTER_ASSERT(reporter, pixmap.getColor4f(8, 0) == SkColors::kTransparent);
|
|
REPORTER_ASSERT(reporter, !recording->isTargetProxyInstantiated());
|
|
}
|
|
|
|
} // namespace skgpu::graphite
|