/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrOpList.h" #include "GrRenderTargetOpList.h" #include "GrSurface.h" #include "GrSurfaceProxy.h" GrOpList::GrOpList(GrSurfaceProxy* surfaceProxy, GrAuditTrail* auditTrail) : fFlags(0) , fTarget(surfaceProxy) , fAuditTrail(auditTrail) { surfaceProxy->setLastOpList(this); #ifdef SK_DEBUG static int debugID = 0; fDebugID = debugID++; #endif } GrOpList::~GrOpList() { if (fTarget && this == fTarget->getLastOpList()) { fTarget->setLastOpList(nullptr); } } // Add a GrOpList-based dependency void GrOpList::addDependency(GrOpList* dependedOn) { SkASSERT(!dependedOn->dependsOn(this)); // loops are bad if (this->dependsOn(dependedOn)) { return; // don't add duplicate dependencies } *fDependencies.push() = dependedOn; } // Convert from a GrSurface-based dependency to a GrOpList one void GrOpList::addDependency(GrSurface* dependedOn) { if (dependedOn->getLastOpList()) { // If it is still receiving dependencies, this GrOpList shouldn't be closed SkASSERT(!this->isClosed()); GrOpList* opList = dependedOn->getLastOpList(); if (opList == this) { // self-read - presumably for dst reads } else { this->addDependency(opList); // Can't make it closed in the self-read case opList->makeClosed(); } } } #ifdef SK_DEBUG void GrOpList::dump() const { SkDebugf("--------------------------------------------------------------\n"); SkDebugf("node: %d -> RT: %d\n", fDebugID, fTarget ? fTarget->uniqueID().asUInt() : -1); SkDebugf("relies On (%d): ", fDependencies.count()); for (int i = 0; i < fDependencies.count(); ++i) { SkDebugf("%d, ", fDependencies[i]->fDebugID); } SkDebugf("\n"); } #endif