blob: 4c0abf9d3badfcb8819708942af834abdb582dd8 [file] [log] [blame]
/*
* 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/GrFinishCallbacks.h"
#include "src/gpu/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();
}
}