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