/*
 * Copyright 2021 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/gpu/graphite/TaskGraph.h"

namespace skgpu::graphite {

TaskGraph::TaskGraph() {}
TaskGraph::~TaskGraph() {}

void TaskGraph::add(sk_sp<Task> task) {
    fTasks.emplace_back(std::move(task));
}

void TaskGraph::prepend(sk_sp<Task> task) {
    fTasks.emplace(fTasks.begin(), std::move(task));
}

bool TaskGraph::prepareResources(ResourceProvider* resourceProvider,
                                 const RuntimeEffectDictionary* runtimeDict) {
    for (const auto& task: fTasks) {
        if (!task->prepareResources(resourceProvider, runtimeDict)) {
            return false;
        }
    }

    return true;
}

bool TaskGraph::addCommands(Context* context,
                            CommandBuffer* commandBuffer,
                            Task::ReplayTargetData replayData) {
    for (const auto& task: fTasks) {
        if (!task->addCommands(context, commandBuffer, replayData)) {
            return false;
        }
    }

    return true;
}

void TaskGraph::reset() {
    fTasks.clear();
}

} // namespace skgpu::graphite
