• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "tests/Test.h"
9 
10 #include "include/core/SkBitmap.h"
11 #include "include/core/SkCanvas.h"
12 #include "include/core/SkPixmap.h"
13 #include "include/gpu/graphite/Context.h"
14 #include "include/gpu/graphite/Recorder.h"
15 #include "include/gpu/graphite/Recording.h"
16 #include "src/gpu/graphite/Surface_Graphite.h"
17 
18 namespace skgpu::graphite {
19 
20 // Tests that a Recording can be replayed to a provided surface.
DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(RecordingSurfacesTest,reporter,context)21 DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(RecordingSurfacesTest, reporter, context) {
22     const SkImageInfo surfaceImageInfo = SkImageInfo::Make(
23             16, 16, SkColorType::kRGBA_8888_SkColorType, SkAlphaType::kPremul_SkAlphaType);
24 
25     std::unique_ptr<Recorder> surfaceRecorder = context->makeRecorder();
26     sk_sp<SkSurface> surface = SkSurface::MakeGraphite(surfaceRecorder.get(), surfaceImageInfo);
27     Surface* graphiteSurface = static_cast<Surface*>(surface.get());
28     const TextureInfo& textureInfo = graphiteSurface->backingTextureProxy()->textureInfo();
29 
30     // Flush the initial clear added by MakeGraphite.
31     std::unique_ptr<skgpu::graphite::Recording> surfaceRecording = surfaceRecorder->snap();
32     context->insertRecording({surfaceRecording.get()});
33 
34     // Snap a recording without a bound target.
35     const SkImageInfo recordingImageInfo = surfaceImageInfo.makeDimensions(SkISize::Make(8, 16));
36     std::unique_ptr<Recorder> recorder = context->makeRecorder();
37     SkCanvas* canvas = recorder->makeDeferredCanvas(recordingImageInfo, textureInfo);
38     canvas->clear(SkColors::kRed);
39     // Can't make another canvas before snapping.
40     REPORTER_ASSERT(reporter,
41                     recorder->makeDeferredCanvas(recordingImageInfo, textureInfo) == nullptr);
42     std::unique_ptr<Recording> recording = recorder->snap();
43 
44     // Play back recording.
45     context->insertRecording({recording.get(), surface.get()});
46 
47     // Read pixels.
48     SkBitmap bitmap;
49     SkPixmap pixmap;
50     bitmap.allocPixels(surfaceImageInfo);
51     SkAssertResult(bitmap.peekPixels(&pixmap));
52     if (!surface->readPixels(pixmap, 0, 0)) {
53         ERRORF(reporter, "readPixels failed");
54         return;
55     }
56 
57     // Verify recording was replayed and is now uninstantiated.
58     REPORTER_ASSERT(reporter, pixmap.getColor4f(0, 0) == SkColors::kRed);
59     REPORTER_ASSERT(reporter, pixmap.getColor4f(8, 0) == SkColors::kTransparent);
60     REPORTER_ASSERT(reporter, !recording->isTargetProxyInstantiated());
61 }
62 
63 }  // namespace skgpu::graphite
64