blob: d354e59405e56ce5fa95371a02e65ed955e32cec [file] [log] [blame]
/*
* 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