Allow multiple closed observers on GrOpsTask.
Bug: skia:10188
Change-Id: Ibed96f10c07feddbbf1e78d014c8ea346c91e53c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/287002
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrOpsTask.cpp b/src/gpu/GrOpsTask.cpp
index 976a186..c811883 100644
--- a/src/gpu/GrOpsTask.cpp
+++ b/src/gpu/GrOpsTask.cpp
@@ -378,7 +378,15 @@
this->deleteOps();
}
-////////////////////////////////////////////////////////////////////////////////
+void GrOpsTask::removeClosedObserver(GrOpsTaskClosedObserver* observer) {
+ SkASSERT(observer);
+ for (int i = 0; i < fClosedObservers.count(); ++i) {
+ if (fClosedObservers[i] == observer) {
+ fClosedObservers.removeShuffle(i);
+ --i;
+ }
+ }
+}
void GrOpsTask::endFlush() {
fLastClipStackGenID = SK_InvalidUniqueID;
@@ -877,11 +885,11 @@
GrRenderTask::ExpectedOutcome GrOpsTask::onMakeClosed(
const GrCaps& caps, SkIRect* targetUpdateBounds) {
this->forwardCombine(caps);
- SkScopeExit triggerObserver([&] {
- if (fClosedObserver) {
- fClosedObserver->wasClosed(*this);
- fClosedObserver = nullptr;
+ SkScopeExit triggerObservers([&] {
+ for (const auto& o : fClosedObservers) {
+ o->wasClosed(*this);
}
+ fClosedObservers.reset();
});
if (!this->isNoOp()) {
GrSurfaceProxy* proxy = fTargetView.proxy();