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

#ifndef skgpu_graphite_task_Task_DEFINED
#define skgpu_graphite_task_Task_DEFINED

#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/private/SkLog.h"
#include "src/gpu/Token.h"
#include "src/gpu/graphite/DebugUtils.h"
#include "src/gpu/graphite/RuntimeEffectDictionary.h"

#include <functional>

namespace skgpu::graphite {

class CommandBuffer;
class Context;
class GraphicsPipeline;
class ResourceProvider;
class ScratchResourceManager;
class Texture;
class TextureProxy;

class Task : public SkRefCnt {
public:
    // Holds a render target and translation to use in the task's work, if necessary.
    struct ReplayTargetData {
        const Texture* fTarget;
        SkIVector fTranslation;
        SkIRect fClip;
    };

    enum class Status {
        // The task step (prepareResources or addCommands) succeeded, proceed to the next task.
        // If the Recording is replayed, this task should be executed again.
        kSuccess,
        // The task step succeeded, but it was a one-time-only operation and should be removed from
        // the task list. If this is returned from prepareResources(), the task is removed before
        // addCommands() will ever be called. If this is returned from addCommands(), it will not
        // be part of any replayed Recording, but any added commands from the first call will be
        // executed once.
        //
        // NOTE: If a task step needs to be conditionally processed but repeatable, it should
        // internally skip work and still return kSuccess instead of kDiscard.
        kDiscard,
        // The step failed and cannot be recovered so the Recording is invalidated.
        kFail
    };

    // Instantiate and prepare any Resources that must happen while the Task is still on the
    // Recorder.
    virtual Status prepareResources(ResourceProvider*,
                                    ScratchResourceManager*,
                                    sk_sp<const RuntimeEffectDictionary>) = 0;

    // Returns true on success; false on failure.
    virtual Status addCommands(Context*, CommandBuffer*, ReplayTargetData) = 0;

    // Visit all pipelines or proxies until `visitor` returns false to end early. By default assume
    // the task uses none. Because these are functions are virtual, they cannot be templated.
    //
    // WARNING: These visit functions will visit all tasks and their children, including revisiting
    // anything that was added multiple times. Ideally the task graph should be visited after
    // prepareResources() has been called because that will clean out cycles and re-references.
    virtual bool visitPipelines(const std::function<bool(const GraphicsPipeline*)>& visitor) {
        return true;
    }

    virtual bool visitProxies(const std::function<bool(const TextureProxy*)>& visitor,
                                                       bool readsOnly) {
        return true;
    }

#if defined(SK_DUMP_TASKS)
    virtual void dump(int index, const char* prefix = "") const {
        const char* taskName = this->getTaskName();
        if (index >= 0) {
            SkDebugf("%s%d: %s\n", prefix, index, taskName);
        } else {
            SkDebugf("%s%s\n", prefix, taskName);
        }
    }

    skgpu::Token fFlushToken = skgpu::Token::InvalidToken();

    virtual const char* getTaskName() const { return "Base Task (unknown type)"; }
#endif
};

} // namespace skgpu::graphite

#endif // skgpu_graphite_task_Task_DEFINED
