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