Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 322b8ab7 authored by John Reck's avatar John Reck
Browse files

Remove old TaskManager system

Replace it with a newer, fancier, WorkQueue-inspired
one that's just a global common thread pool.

Test: hwuiunit passes
Change-Id: Ib5d03104a08bbac9a4ec67a1bfc0db2b35d6700f
parent 59a599c1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <renderthread/CanvasContext.h>
#include <TreeInfo.h>
#include <hwui/Paint.h>
#include <utils/TraceUtils.h>

#include "core_jni_helpers.h"

+2 −2
Original line number Diff line number Diff line
@@ -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",
@@ -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",
@@ -381,7 +382,6 @@ cc_benchmark {
        "tests/microbench/LinearAllocatorBench.cpp",
        "tests/microbench/PathParserBench.cpp",
        "tests/microbench/RenderNodeBench.cpp",
        "tests/microbench/TaskManagerBench.cpp",
    ],
}

+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include "hwui/Bitmap.h"
#include "utils/Color.h"
#include "utils/MathUtils.h"
#include "utils/TraceUtils.h"

using namespace android::uirenderer::renderthread;

+11 −41
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <SkPictureRecorder.h>
#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "thread/CommonPool.h"
#include "utils/TraceUtils.h"

#include <unistd.h>
@@ -49,10 +50,6 @@ SkiaPipeline::~SkiaPipeline() {
    unpinImages();
}

TaskManager* SkiaPipeline::getTaskManager() {
    return mRenderThread.cacheManager().getTaskManager();
}

void SkiaPipeline::onDestroyHardwareResources() {
    unpinImages();
    mRenderThread.cacheManager().trimStaleResources();
@@ -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)) {
@@ -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--;
+1 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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