/*
 * Copyright 2020 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/ganesh/GrFinishCallbacks.h"
#include "src/gpu/ganesh/GrGpu.h"

GrFinishCallbacks::GrFinishCallbacks(GrGpu* gpu) : fGpu(gpu) {}

GrFinishCallbacks::~GrFinishCallbacks() {
    this->callAll(true);
}

void GrFinishCallbacks::add(GrGpuFinishedProc finishedProc,
                            GrGpuFinishedContext finishedContext) {
    SkASSERT(finishedProc);
    FinishCallback callback;
    callback.fCallback = finishedProc;
    callback.fContext = finishedContext;
    callback.fFence = fGpu->insertFence();
    fCallbacks.push_back(callback);
}

void GrFinishCallbacks::check() {
    // Bail after the first unfinished sync since we expect they signal in the order inserted.
    while (!fCallbacks.empty() && fGpu->waitFence(fCallbacks.front().fFence)) {
        fCallbacks.front().fCallback(fCallbacks.front().fContext);
        fGpu->deleteFence(fCallbacks.front().fFence);
        fCallbacks.pop_front();
    }
}

void GrFinishCallbacks::callAll(bool doDelete) {
    while (!fCallbacks.empty()) {
        fCallbacks.front().fCallback(fCallbacks.front().fContext);
        if (doDelete) {
            fGpu->deleteFence(fCallbacks.front().fFence);
        }
        fCallbacks.pop_front();
    }
}
