blob: f2bffc0d7c96cf789feb9bb3ed16c65f64c74b02 [file] [log] [blame]
/*
* 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