Don't reset the capture mode after each frame when using the CallbackAPI

When multiframe skp support was introduced it set the capture mode to
none for everything but the multiframe use case. This was incorrect in
the case of the CallbackAPI where we want to continue to capture frames.

Bug: 152084866
Test: hwui_unit_tests
Change-Id: I7e3caf41a3725d03252df1ab7bedfe1b69a238c2
This commit is contained in:
Derek Sollenberger
2020-04-01 15:59:02 -04:00
parent 2728fa3c52
commit 5f9753d770
2 changed files with 38 additions and 1 deletions

View File

@@ -418,9 +418,9 @@ void SkiaPipeline::endCapture(SkSurface* surface) {
auto data = picture->serialize();
savePictureAsync(data, mCapturedFile);
mCaptureSequence = 0;
mCaptureMode = CaptureMode::None;
}
}
mCaptureMode = CaptureMode::None;
mRecorder.reset();
}
}

View File

@@ -403,3 +403,40 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, context_lost) {
renderThread.destroyRenderingContext();
EXPECT_FALSE(pipeline->isSurfaceReady());
}
RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, pictureCallback) {
// create a pipeline and add a picture callback
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
int callbackCount = 0;
pipeline->setPictureCapturedCallback(
[&callbackCount](sk_sp<SkPicture>&& picture) { callbackCount += 1; });
// create basic red frame and render it
auto redNode = TestUtils::createSkiaNode(
0, 0, 1, 1, [](RenderProperties& props, SkiaRecordingCanvas& redCanvas) {
redCanvas.drawColor(SK_ColorRED, SkBlendMode::kSrcOver);
});
LayerUpdateQueue layerUpdateQueue;
SkRect dirty = SkRectMakeLargest();
std::vector<sp<RenderNode>> renderNodes;
renderNodes.push_back(redNode);
bool opaque = true;
android::uirenderer::Rect contentDrawBounds(0, 0, 1, 1);
auto surface = SkSurface::MakeRasterN32Premul(1, 1);
pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
SkMatrix::I());
// verify the callback was called
EXPECT_EQ(1, callbackCount);
// render a second frame and check the callback count
pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
SkMatrix::I());
EXPECT_EQ(2, callbackCount);
// unset the callback, render another frame, check callback was not invoked
pipeline->setPictureCapturedCallback(nullptr);
pipeline->renderFrame(layerUpdateQueue, dirty, renderNodes, opaque, contentDrawBounds, surface,
SkMatrix::I());
EXPECT_EQ(2, callbackCount);
}