diff options
author | John Reck <jreck@google.com> | 2018-12-10 17:06:22 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2019-01-22 13:13:06 -0800 |
commit | 5cca8f250cd287d311b9e7b560a6c10fb909c6bc (patch) | |
tree | 4de1ddaf1ac87b697327ac65cf2daf85d04989b5 /libs/hwui/pipeline/skia/SkiaPipeline.cpp | |
parent | 6f19cbdd2f285a7d54ce7694488e307bbe26bfc9 (diff) |
Add continuous SKP capture test api
Bug: 122856066
Test: PictureCaptureDemo
Change-Id: Iaf3a4bc1c8a2c18c7dff635c5f1cf726b331f8bf
Diffstat (limited to 'libs/hwui/pipeline/skia/SkiaPipeline.cpp')
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index df8224372ea7..47c90948bbbe 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -111,7 +111,7 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) const Rect& layerDamage = layers.entries()[i].damage; - SkCanvas* layerCanvas = tryCapture(layerNode->getLayerSurface()); + SkCanvas* layerCanvas = layerNode->getLayerSurface()->getCanvas(); int saveCount = layerCanvas->save(); SkASSERT(saveCount == 1); @@ -139,8 +139,6 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque) layerCanvas->restoreToCount(saveCount); mLightCenter = savedLightCenter; - endCapture(layerNode->getLayerSurface()); - // cache the current context so that we can defer flushing it until // either all the layers have been rendered or the context changes GrContext* currentContext = layerNode->getLayerSurface()->getCanvas()->getGrContext(); @@ -244,6 +242,7 @@ public: } virtual void onProcess(const sp<Task<bool>>& task) override { + ATRACE_NAME("SavePictureTask"); SavePictureTask* t = static_cast<SavePictureTask*>(task.get()); if (0 == access(t->filename.c_str(), F_OK)) { @@ -265,46 +264,56 @@ public: SkCanvas* SkiaPipeline::tryCapture(SkSurface* surface) { if (CC_UNLIKELY(Properties::skpCaptureEnabled)) { - bool recordingPicture = mCaptureSequence > 0; char prop[PROPERTY_VALUE_MAX] = {'\0'}; - if (!recordingPicture) { + if (mCaptureSequence <= 0) { property_get(PROPERTY_CAPTURE_SKP_FILENAME, prop, "0"); - recordingPicture = prop[0] != '0' && - mCapturedFile != prop; // ensure we capture only once per filename - if (recordingPicture) { + if (prop[0] != '0' && mCapturedFile != prop) { mCapturedFile = prop; mCaptureSequence = property_get_int32(PROPERTY_CAPTURE_SKP_FRAMES, 1); } } - if (recordingPicture) { + if (mCaptureSequence > 0 || mPictureCapturedCallback) { mRecorder.reset(new SkPictureRecorder()); - return mRecorder->beginRecording(surface->width(), surface->height(), nullptr, - SkPictureRecorder::kPlaybackDrawPicture_RecordFlag); + SkCanvas* pictureCanvas = mRecorder->beginRecording(surface->width(), surface->height(), nullptr, + SkPictureRecorder::kPlaybackDrawPicture_RecordFlag); + mNwayCanvas = std::make_unique<SkNWayCanvas>(surface->width(), surface->height()); + mNwayCanvas->addCanvas(surface->getCanvas()); + mNwayCanvas->addCanvas(pictureCanvas); + return mNwayCanvas.get(); } } return surface->getCanvas(); } void SkiaPipeline::endCapture(SkSurface* surface) { + mNwayCanvas.reset(); if (CC_UNLIKELY(mRecorder.get())) { + ATRACE_CALL(); sk_sp<SkPicture> picture = mRecorder->finishRecordingAsPicture(); - surface->getCanvas()->drawPicture(picture); if (picture->approximateOpCount() > 0) { - auto data = picture->serialize(); - - // offload saving to file in a different thread - if (!mSavePictureProcessor.get()) { - TaskManager* taskManager = getTaskManager(); - mSavePictureProcessor = new SavePictureProcessor( - taskManager->canRunTasks() ? taskManager : nullptr); + if (mCaptureSequence > 0) { + ATRACE_BEGIN("picture->serialize"); + auto data = picture->serialize(); + ATRACE_END(); + + // offload saving to file in a different thread + if (!mSavePictureProcessor.get()) { + TaskManager* taskManager = getTaskManager(); + mSavePictureProcessor = new SavePictureProcessor( + taskManager->canRunTasks() ? taskManager : nullptr); + } + if (1 == mCaptureSequence) { + mSavePictureProcessor->savePicture(data, mCapturedFile); + } else { + mSavePictureProcessor->savePicture( + data, + mCapturedFile + "_" + std::to_string(mCaptureSequence)); + } + mCaptureSequence--; } - if (1 == mCaptureSequence) { - mSavePictureProcessor->savePicture(data, mCapturedFile); - } else { - mSavePictureProcessor->savePicture( - data, mCapturedFile + "_" + std::to_string(mCaptureSequence)); + if (mPictureCapturedCallback) { + std::invoke(mPictureCapturedCallback, std::move(picture)); } - mCaptureSequence--; } mRecorder.reset(); } @@ -314,6 +323,11 @@ void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& cli const std::vector<sp<RenderNode>>& nodes, bool opaque, const Rect& contentDrawBounds, sk_sp<SkSurface> surface, const SkMatrix& preTransform) { + bool previousSkpEnabled = Properties::skpCaptureEnabled; + if (mPictureCapturedCallback) { + Properties::skpCaptureEnabled = true; + } + renderVectorDrawableCache(); // draw all layers up front @@ -334,6 +348,8 @@ void SkiaPipeline::renderFrame(const LayerUpdateQueue& layers, const SkRect& cli ATRACE_NAME("flush commands"); surface->getCanvas()->flush(); + + Properties::skpCaptureEnabled = previousSkpEnabled; } namespace { |