Skip to content

Commit 9b51737

Browse files
jbeta51SkCQ
authored andcommitted
[capture] record and collect SKPs in the CaptureManager during capture
This add basic SkPicture tracking functionality. Followup CLs will target grabbing sub-picture "breakpoints" at specified intervals. Test: bazel run //example/external_client:use_graphite_metal_capture --keep_going --compilation_mode=dbg Bug: b/412351769 Change-Id: Iace6b187ce4c6ac10f1496f0ec745d9dcc473aaf Reviewed-on: https://skia-review.googlesource.com/c/skia/+/1033137 Reviewed-by: Michael Ludwig <michaelludwig@google.com> Commit-Queue: Jorge Betancourt <jmbetancourt@google.com>
1 parent 237844d commit 9b51737

File tree

5 files changed

+48
-6
lines changed

5 files changed

+48
-6
lines changed

example/external_client/src/graphite_metal_capture.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "include/core/SkBitmap.h"
99
#include "include/core/SkCanvas.h"
10+
#include "include/core/SkColor.h"
1011
#include "include/core/SkImage.h"
1112
#include "include/core/SkRRect.h"
1213
#include "include/core/SkRect.h"
@@ -58,11 +59,21 @@ int main(int argc, char *argv[]) {
5859
return 1;
5960
}
6061

62+
sk_sp<SkSurface> surfaceB =
63+
SkSurfaces::RenderTarget(recorder.get(), imageInfo);
64+
if (!surfaceB) {
65+
printf("Could not make second surface from Metal Recorder\n");
66+
return 1;
67+
}
68+
6169
/* DRAWING */
6270
context->startCapture();
6371
printf("Capture started, now to draw\n");
6472

6573
SkCanvas* canvas = surface->getCanvas();
74+
SkCanvas* canvasB = surfaceB->getCanvas();
75+
76+
// Canvas A
6677
canvas->clear(SK_ColorCYAN);
6778
SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeLTRB(10, 20, 50, 70), 10, 10);
6879

@@ -72,6 +83,12 @@ int main(int argc, char *argv[]) {
7283

7384
canvas->drawRRect(rrect, paint);
7485

86+
// Canvas B
87+
// TODO (b/412351769): take image snapshot from canvas A and draw into B
88+
canvasB->clear(SK_ColorMAGENTA);
89+
paint.setColor(SK_ColorBLACK);
90+
canvasB->drawCircle(10, 10, 5, paint);
91+
7592
printf("ready to snap the GPU calls\n");
7693
// Now to send the draws to the GPU
7794
std::unique_ptr<skgpu::graphite::Recording> recording = recorder->snap();

src/capture/SkCaptureCanvas.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ sk_sp<SkPicture> SkCaptureCanvas::snapPicture() {
4040
if (!fCapturing) {
4141
return nullptr;
4242
}
43+
this->detachRecordingCanvas(); // remove the stale recording canvas before the recorder finishes
4344
auto skp = fRecorder.finishRecordingAsPicture();
44-
this->detachRecordingCanvas(); // remove the stale recording canvas
4545
this->attachRecordingCanvas();
4646
return skp;
4747
}
@@ -57,6 +57,10 @@ void SkCaptureCanvas::detachRecordingCanvas() {
5757
this->removeCanvas(fRecorder.getRecordingCanvas());
5858
}
5959

60+
void SkCaptureCanvas::onSurfaceDelete() {
61+
// TODO (b/412351769): signal to the capture manager that this canvas's surface has been deleted
62+
}
63+
6064
//////////////////// Function forwarding ///////////////////////
6165

6266
void SkCaptureCanvas::willSave() {
@@ -305,7 +309,3 @@ void SkCaptureCanvas::onDrawEdgeAAImageSet2(const ImageSetEntry set[],
305309
this->SkNWayCanvas::onDrawEdgeAAImageSet2(
306310
set, count, dstClips, preViewMatrices, sampling, paint, constraint);
307311
}
308-
309-
void SkCaptureCanvas::onSurfaceDelete() {
310-
// TODO (b/412351769): signal to the capture manager that this canvas's surface has been deleted
311-
}

src/capture/SkCaptureManager.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "src/capture/SkCaptureManager.h"
99

1010
#include "include/core/SkCanvas.h"
11+
#include "include/private/base/SkDebug.h"
1112
#include "src/capture/SkCaptureCanvas.h"
1213

1314
#include <memory>
@@ -20,3 +21,20 @@ SkCanvas* SkCaptureManager::makeCaptureCanvas(SkCanvas* canvas) {
2021
fTrackedCanvases.emplace_back(std::move(newCanvas));
2122
return rawCanvasPtr;
2223
}
24+
25+
void SkCaptureManager::snapPictures() {
26+
for (auto& canvas : fTrackedCanvases) {
27+
if (canvas) {
28+
auto picture = canvas->snapPicture();
29+
if (picture) {
30+
fPictures.emplace_back(picture);
31+
}
32+
}
33+
}
34+
}
35+
36+
void SkCaptureManager::serializeCapture() {
37+
// TODO (412351769): return a serialized file via SkData, for now this will print the contents
38+
// of the capture for inspection.
39+
SkDebugf("Tracked canvases: %d. SkPictures: %d\n", fTrackedCanvases.size(), fPictures.size());
40+
}

src/capture/SkCaptureManager.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#ifndef SkCaptureManager_DEFINED
99
#define SkCaptureManager_DEFINED
1010

11+
#include "include/core/SkPicture.h"
1112
#include "include/core/SkRefCnt.h"
1213
#include "include/private/base/SkTArray.h"
1314

@@ -21,19 +22,24 @@ class SkCaptureManager : public SkRefCnt {
2122
SkCaptureManager();
2223

2324
SkCanvas* makeCaptureCanvas(SkCanvas* canvas);
25+
void snapPictures();
26+
void serializeCapture();
2427

2528
void toggleCapture(bool capturing) {
29+
if (capturing != fIsCurrentlyCapturing && !capturing) {
30+
this->snapPictures();
31+
}
2632
fIsCurrentlyCapturing = capturing;
2733
}
2834

2935
bool isCurrentlyCapturing() const {
3036
return fIsCurrentlyCapturing;
3137
}
3238

33-
3439
private:
3540
std::atomic<bool> fIsCurrentlyCapturing = false;
3641
skia_private::TArray<std::unique_ptr<SkCaptureCanvas>> fTrackedCanvases;
42+
skia_private::TArray<sk_sp<SkPicture>> fPictures;
3743
};
3844

3945
#endif // SkCaptureManager_DEFINED

src/gpu/graphite/Context.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,7 @@ void Context::endCapture() {
917917
// TODO (b/412351769): Return an SkData block of serialized SKPs and other capture data
918918
if (fSharedContext->captureManager()) {
919919
fSharedContext->captureManager()->toggleCapture(false);
920+
fSharedContext->captureManager()->serializeCapture();
920921
}
921922
}
922923

0 commit comments

Comments
 (0)