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

#ifndef GrFinishCallbacks_DEFINED
#define GrFinishCallbacks_DEFINED

#include "include/gpu/GrTypes.h"
#include "include/private/GrTypesPriv.h"

#include <list>

class GrGpu;

/**
 * Maintains a list of callbacks to be called when work on the GPU is complete.
 */

class GrFinishCallbacks {
public:
    GrFinishCallbacks(GrGpu* gpu);
   ~GrFinishCallbacks();

    /**
     * Call all the callbacks in the list. This will block until all work is done.
     *
     * @param doDelete        delete the contained fence object.
     */
    void callAll(bool doDelete);

    /**
     * Add a new callback to the list.
     *
     * @param finishedProc    The function to call when GPU work is complete.
     * @param finishedContext The context object to pass back to the callback.
     */
    void add(GrGpuFinishedProc finishedProc, GrGpuFinishedContext finishedContext);

    /**
     * Check if any GPU work is complete, and call the associated callbacks.
     * This call is non-blocking.
     */
    void check();

    /**
     * Returns true if the callback list is empty.
     */
    bool empty() const { return fCallbacks.empty(); }

private:
    struct FinishCallback {
        GrGpuFinishedProc     fCallback;
        GrGpuFinishedContext  fContext;
        GrFence               fFence;
    };

    GrGpu*                    fGpu;
    std::list<FinishCallback> fCallbacks;
};

#endif
