Loading core/jni/android_view_RenderNode.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <renderthread/CanvasContext.h> #include <TreeInfo.h> #include <hwui/Paint.h> #include <utils/TraceUtils.h> #include "core_jni_helpers.h" Loading libs/hwui/Android.bp +2 −2 Original line number Diff line number Diff line Loading @@ -191,7 +191,7 @@ cc_defaults { "surfacetexture/EGLConsumer.cpp", "surfacetexture/ImageConsumer.cpp", "surfacetexture/SurfaceTexture.cpp", "thread/TaskManager.cpp", "thread/CommonPool.cpp", "utils/Blur.cpp", "utils/Color.cpp", "utils/GLUtils.cpp", Loading Loading @@ -308,6 +308,7 @@ cc_test { "tests/unit/main.cpp", "tests/unit/CacheManagerTests.cpp", "tests/unit/CanvasContextTests.cpp", "tests/unit/CommonPoolTests.cpp", "tests/unit/DamageAccumulatorTests.cpp", "tests/unit/DeferredLayerUpdaterTests.cpp", "tests/unit/FatVectorTests.cpp", Loading Loading @@ -381,7 +382,6 @@ cc_benchmark { "tests/microbench/LinearAllocatorBench.cpp", "tests/microbench/PathParserBench.cpp", "tests/microbench/RenderNodeBench.cpp", "tests/microbench/TaskManagerBench.cpp", ], } Loading libs/hwui/Readback.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "hwui/Bitmap.h" #include "utils/Color.h" #include "utils/MathUtils.h" #include "utils/TraceUtils.h" using namespace android::uirenderer::renderthread; Loading libs/hwui/pipeline/skia/SkiaPipeline.cpp +11 −41 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <SkPictureRecorder.h> #include "TreeInfo.h" #include "VectorDrawable.h" #include "thread/CommonPool.h" #include "utils/TraceUtils.h" #include <unistd.h> Loading @@ -49,10 +50,6 @@ SkiaPipeline::~SkiaPipeline() { unpinImages(); } TaskManager* SkiaPipeline::getTaskManager() { return mRenderThread.cacheManager().getTaskManager(); } void SkiaPipeline::onDestroyHardwareResources() { unpinImages(); mRenderThread.cacheManager().trimStaleResources(); Loading Loading @@ -225,42 +222,21 @@ void SkiaPipeline::renderVectorDrawableCache() { } } class SkiaPipeline::SavePictureProcessor : public TaskProcessor<bool> { public: explicit SavePictureProcessor(TaskManager* taskManager) : TaskProcessor<bool>(taskManager) {} struct SavePictureTask : public Task<bool> { sk_sp<SkData> data; std::string filename; }; void savePicture(const sk_sp<SkData>& data, const std::string& filename) { sp<SavePictureTask> task(new SavePictureTask()); task->data = data; task->filename = filename; TaskProcessor<bool>::add(task); } 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)) { task->setResult(false); static void savePictureAsync(const sk_sp<SkData>& data, const std::string& filename) { CommonPool::post([data, filename] { if (0 == access(filename.c_str(), F_OK)) { return; } SkFILEWStream stream(t->filename.c_str()); SkFILEWStream stream(filename.c_str()); if (stream.isValid()) { stream.write(t->data->data(), t->data->size()); stream.write(data->data(), data->size()); stream.flush(); SkDebugf("SKP Captured Drawing Output (%d bytes) for frame. %s", stream.bytesWritten(), t->filename.c_str()); filename.c_str()); } task->setResult(true); }); } }; SkCanvas* SkiaPipeline::tryCapture(SkSurface* surface) { if (CC_UNLIKELY(Properties::skpCaptureEnabled)) { Loading Loading @@ -297,16 +273,10 @@ void SkiaPipeline::endCapture(SkSurface* surface) { 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); savePictureAsync(data, mCapturedFile); } else { mSavePictureProcessor->savePicture( data, savePictureAsync(data, mCapturedFile + "_" + std::to_string(mCaptureSequence)); } mCaptureSequence--; Loading libs/hwui/pipeline/skia/SkiaPipeline.h +1 −7 Original line number Diff line number Diff line Loading @@ -33,8 +33,6 @@ public: explicit SkiaPipeline(renderthread::RenderThread& thread); virtual ~SkiaPipeline(); TaskManager* getTaskManager() override; void onDestroyHardwareResources() override; bool pinImages(std::vector<SkImage*>& mutableImages) override; Loading Loading @@ -157,11 +155,7 @@ private: * mCaptureSequence counts how many frames are left to take in the sequence. */ int mCaptureSequence = 0; /** * mSavePictureProcessor is used to run the file saving code in a separate thread. */ class SavePictureProcessor; sp<SavePictureProcessor> mSavePictureProcessor; /** * mRecorder holds the current picture recorder. We could store it on the stack to support * parallel tryCapture calls (not really needed). Loading Loading
core/jni/android_view_RenderNode.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <renderthread/CanvasContext.h> #include <TreeInfo.h> #include <hwui/Paint.h> #include <utils/TraceUtils.h> #include "core_jni_helpers.h" Loading
libs/hwui/Android.bp +2 −2 Original line number Diff line number Diff line Loading @@ -191,7 +191,7 @@ cc_defaults { "surfacetexture/EGLConsumer.cpp", "surfacetexture/ImageConsumer.cpp", "surfacetexture/SurfaceTexture.cpp", "thread/TaskManager.cpp", "thread/CommonPool.cpp", "utils/Blur.cpp", "utils/Color.cpp", "utils/GLUtils.cpp", Loading Loading @@ -308,6 +308,7 @@ cc_test { "tests/unit/main.cpp", "tests/unit/CacheManagerTests.cpp", "tests/unit/CanvasContextTests.cpp", "tests/unit/CommonPoolTests.cpp", "tests/unit/DamageAccumulatorTests.cpp", "tests/unit/DeferredLayerUpdaterTests.cpp", "tests/unit/FatVectorTests.cpp", Loading Loading @@ -381,7 +382,6 @@ cc_benchmark { "tests/microbench/LinearAllocatorBench.cpp", "tests/microbench/PathParserBench.cpp", "tests/microbench/RenderNodeBench.cpp", "tests/microbench/TaskManagerBench.cpp", ], } Loading
libs/hwui/Readback.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "hwui/Bitmap.h" #include "utils/Color.h" #include "utils/MathUtils.h" #include "utils/TraceUtils.h" using namespace android::uirenderer::renderthread; Loading
libs/hwui/pipeline/skia/SkiaPipeline.cpp +11 −41 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <SkPictureRecorder.h> #include "TreeInfo.h" #include "VectorDrawable.h" #include "thread/CommonPool.h" #include "utils/TraceUtils.h" #include <unistd.h> Loading @@ -49,10 +50,6 @@ SkiaPipeline::~SkiaPipeline() { unpinImages(); } TaskManager* SkiaPipeline::getTaskManager() { return mRenderThread.cacheManager().getTaskManager(); } void SkiaPipeline::onDestroyHardwareResources() { unpinImages(); mRenderThread.cacheManager().trimStaleResources(); Loading Loading @@ -225,42 +222,21 @@ void SkiaPipeline::renderVectorDrawableCache() { } } class SkiaPipeline::SavePictureProcessor : public TaskProcessor<bool> { public: explicit SavePictureProcessor(TaskManager* taskManager) : TaskProcessor<bool>(taskManager) {} struct SavePictureTask : public Task<bool> { sk_sp<SkData> data; std::string filename; }; void savePicture(const sk_sp<SkData>& data, const std::string& filename) { sp<SavePictureTask> task(new SavePictureTask()); task->data = data; task->filename = filename; TaskProcessor<bool>::add(task); } 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)) { task->setResult(false); static void savePictureAsync(const sk_sp<SkData>& data, const std::string& filename) { CommonPool::post([data, filename] { if (0 == access(filename.c_str(), F_OK)) { return; } SkFILEWStream stream(t->filename.c_str()); SkFILEWStream stream(filename.c_str()); if (stream.isValid()) { stream.write(t->data->data(), t->data->size()); stream.write(data->data(), data->size()); stream.flush(); SkDebugf("SKP Captured Drawing Output (%d bytes) for frame. %s", stream.bytesWritten(), t->filename.c_str()); filename.c_str()); } task->setResult(true); }); } }; SkCanvas* SkiaPipeline::tryCapture(SkSurface* surface) { if (CC_UNLIKELY(Properties::skpCaptureEnabled)) { Loading Loading @@ -297,16 +273,10 @@ void SkiaPipeline::endCapture(SkSurface* surface) { 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); savePictureAsync(data, mCapturedFile); } else { mSavePictureProcessor->savePicture( data, savePictureAsync(data, mCapturedFile + "_" + std::to_string(mCaptureSequence)); } mCaptureSequence--; Loading
libs/hwui/pipeline/skia/SkiaPipeline.h +1 −7 Original line number Diff line number Diff line Loading @@ -33,8 +33,6 @@ public: explicit SkiaPipeline(renderthread::RenderThread& thread); virtual ~SkiaPipeline(); TaskManager* getTaskManager() override; void onDestroyHardwareResources() override; bool pinImages(std::vector<SkImage*>& mutableImages) override; Loading Loading @@ -157,11 +155,7 @@ private: * mCaptureSequence counts how many frames are left to take in the sequence. */ int mCaptureSequence = 0; /** * mSavePictureProcessor is used to run the file saving code in a separate thread. */ class SavePictureProcessor; sp<SavePictureProcessor> mSavePictureProcessor; /** * mRecorder holds the current picture recorder. We could store it on the stack to support * parallel tryCapture calls (not really needed). Loading