1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker std::atomic<uint32_t> GrOp::gCurrOpClassID {GrOp::kIllegalOpID + 1}; 11*c8dee2aaSAndroid Build Coastguard Worker std::atomic<uint32_t> GrOp::gCurrOpUniqueID{GrOp::kIllegalOpID + 1}; 12*c8dee2aaSAndroid Build Coastguard Worker GrOp(uint32_t classID)13*c8dee2aaSAndroid Build Coastguard WorkerGrOp::GrOp(uint32_t classID) : fClassID(classID) { 14*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(classID == SkToU32(fClassID)); 15*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(classID); 16*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fBoundsFlags = kUninitialized_BoundsFlag); 17*c8dee2aaSAndroid Build Coastguard Worker } 18*c8dee2aaSAndroid Build Coastguard Worker combineIfPossible(GrOp * that,SkArenaAlloc * alloc,const GrCaps & caps)19*c8dee2aaSAndroid Build Coastguard WorkerGrOp::CombineResult GrOp::combineIfPossible(GrOp* that, SkArenaAlloc* alloc, const GrCaps& caps) { 20*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this != that); 21*c8dee2aaSAndroid Build Coastguard Worker if (this->classID() != that->classID()) { 22*c8dee2aaSAndroid Build Coastguard Worker return CombineResult::kCannotCombine; 23*c8dee2aaSAndroid Build Coastguard Worker } 24*c8dee2aaSAndroid Build Coastguard Worker auto result = this->onCombineIfPossible(that, alloc, caps); 25*c8dee2aaSAndroid Build Coastguard Worker if (result == CombineResult::kMerged) { 26*c8dee2aaSAndroid Build Coastguard Worker this->joinBounds(*that); 27*c8dee2aaSAndroid Build Coastguard Worker } 28*c8dee2aaSAndroid Build Coastguard Worker return result; 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker chainConcat(GrOp::Owner next)31*c8dee2aaSAndroid Build Coastguard Workervoid GrOp::chainConcat(GrOp::Owner next) { 32*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(next); 33*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->classID() == next->classID()); 34*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->isChainTail()); 35*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(next->isChainHead()); 36*c8dee2aaSAndroid Build Coastguard Worker fNextInChain = std::move(next); 37*c8dee2aaSAndroid Build Coastguard Worker fNextInChain->fPrevInChain = this; 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker cutChain()40*c8dee2aaSAndroid Build Coastguard WorkerGrOp::Owner GrOp::cutChain() { 41*c8dee2aaSAndroid Build Coastguard Worker if (fNextInChain) { 42*c8dee2aaSAndroid Build Coastguard Worker fNextInChain->fPrevInChain = nullptr; 43*c8dee2aaSAndroid Build Coastguard Worker return std::move(fNextInChain); 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG validateChain(GrOp * expectedTail) const49*c8dee2aaSAndroid Build Coastguard Workervoid GrOp::validateChain(GrOp* expectedTail) const { 50*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(this->isChainHead()); 51*c8dee2aaSAndroid Build Coastguard Worker uint32_t classID = this->classID(); 52*c8dee2aaSAndroid Build Coastguard Worker const GrOp* op = this; 53*c8dee2aaSAndroid Build Coastguard Worker while (op) { 54*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(op == this || (op->prevInChain() && op->prevInChain()->nextInChain() == op)); 55*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(classID == op->classID()); 56*c8dee2aaSAndroid Build Coastguard Worker if (op->nextInChain()) { 57*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(op->nextInChain()->prevInChain() == op); 58*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(op != expectedTail); 59*c8dee2aaSAndroid Build Coastguard Worker } else { 60*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!expectedTail || op == expectedTail); 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker op = op->nextInChain(); 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker #endif 66