121aed57023bad4b04076c59e37097c7563efc028egdaniel/*
221aed57023bad4b04076c59e37097c7563efc028egdaniel * Copyright 2014 Google Inc.
321aed57023bad4b04076c59e37097c7563efc028egdaniel *
421aed57023bad4b04076c59e37097c7563efc028egdaniel * Use of this source code is governed by a BSD-style license that can be
521aed57023bad4b04076c59e37097c7563efc028egdaniel * found in the LICENSE file.
621aed57023bad4b04076c59e37097c7563efc028egdaniel */
721aed57023bad4b04076c59e37097c7563efc028egdaniel
821aed57023bad4b04076c59e37097c7563efc028egdaniel#include "GrRODrawState.h"
93658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
1021aed57023bad4b04076c59e37097c7563efc028egdaniel#include "GrDrawTargetCaps.h"
113658f382cc129e463d7f40a7e68214d04d50fe14egdaniel#include "GrRenderTarget.h"
1221aed57023bad4b04076c59e37097c7563efc028egdaniel
1321aed57023bad4b04076c59e37097c7563efc028egdaniel////////////////////////////////////////////////////////////////////////////////
1421aed57023bad4b04076c59e37097c7563efc028egdaniel
153658f382cc129e463d7f40a7e68214d04d50fe14egdanielGrRODrawState::GrRODrawState(const GrRODrawState& drawState) : INHERITED() {
163658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    fRenderTarget.setResource(SkSafeRef(drawState.fRenderTarget.getResource()),
1745725db1d82615d43408ec488549aec6218f80e4bsalomon                              GrIORef::kWrite_IOType);
183658f382cc129e463d7f40a7e68214d04d50fe14egdaniel}
193658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2021aed57023bad4b04076c59e37097c7563efc028egdanielbool GrRODrawState::isEqual(const GrRODrawState& that) const {
2121aed57023bad4b04076c59e37097c7563efc028egdaniel    bool usingVertexColors = this->hasColorVertexAttribute();
2221aed57023bad4b04076c59e37097c7563efc028egdaniel    if (!usingVertexColors && this->fColor != that.fColor) {
2321aed57023bad4b04076c59e37097c7563efc028egdaniel        return false;
2421aed57023bad4b04076c59e37097c7563efc028egdaniel    }
2521aed57023bad4b04076c59e37097c7563efc028egdaniel
262a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    if (this->getRenderTarget() != that.getRenderTarget() ||
2721aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fColorStages.count() != that.fColorStages.count() ||
2821aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fCoverageStages.count() != that.fCoverageStages.count() ||
2921aed57023bad4b04076c59e37097c7563efc028egdaniel        !this->fViewMatrix.cheapEqualTo(that.fViewMatrix) ||
3021aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fSrcBlend != that.fSrcBlend ||
3121aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fDstBlend != that.fDstBlend ||
3221aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fBlendConstant != that.fBlendConstant ||
3321aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fFlagBits != that.fFlagBits ||
3421aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fVACount != that.fVACount ||
357b3d5ee72c2238aa239bce4d5b3aea98a437ca7aegdaniel        this->fVAStride != that.fVAStride ||
3621aed57023bad4b04076c59e37097c7563efc028egdaniel        memcmp(this->fVAPtr, that.fVAPtr, this->fVACount * sizeof(GrVertexAttrib)) ||
3721aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fStencilSettings != that.fStencilSettings ||
3821aed57023bad4b04076c59e37097c7563efc028egdaniel        this->fDrawFace != that.fDrawFace) {
3921aed57023bad4b04076c59e37097c7563efc028egdaniel        return false;
4021aed57023bad4b04076c59e37097c7563efc028egdaniel    }
4121aed57023bad4b04076c59e37097c7563efc028egdaniel
4221aed57023bad4b04076c59e37097c7563efc028egdaniel    bool usingVertexCoverage = this->hasCoverageVertexAttribute();
4321aed57023bad4b04076c59e37097c7563efc028egdaniel    if (!usingVertexCoverage && this->fCoverage != that.fCoverage) {
4421aed57023bad4b04076c59e37097c7563efc028egdaniel        return false;
4521aed57023bad4b04076c59e37097c7563efc028egdaniel    }
4621aed57023bad4b04076c59e37097c7563efc028egdaniel
4721aed57023bad4b04076c59e37097c7563efc028egdaniel    bool explicitLocalCoords = this->hasLocalCoordAttribute();
48bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    if (this->hasGeometryProcessor()) {
49bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt        if (!that.hasGeometryProcessor()) {
505a80be22418176a2d15b0d3bd33215e28b516b24joshualitt            return false;
51b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        } else if (!GrProcessorStage::AreCompatible(*this->getGeometryProcessor(),
52b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                    *that.getGeometryProcessor(),
53b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                    explicitLocalCoords)) {
545a80be22418176a2d15b0d3bd33215e28b516b24joshualitt            return false;
55bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt        }
56bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    } else if (that.hasGeometryProcessor()) {
575a80be22418176a2d15b0d3bd33215e28b516b24joshualitt        return false;
58bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    }
59bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt
6021aed57023bad4b04076c59e37097c7563efc028egdaniel    for (int i = 0; i < this->numColorStages(); i++) {
61b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        if (!GrProcessorStage::AreCompatible(this->getColorStage(i), that.getColorStage(i),
62b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                             explicitLocalCoords)) {
6321aed57023bad4b04076c59e37097c7563efc028egdaniel            return false;
6421aed57023bad4b04076c59e37097c7563efc028egdaniel        }
6521aed57023bad4b04076c59e37097c7563efc028egdaniel    }
6621aed57023bad4b04076c59e37097c7563efc028egdaniel    for (int i = 0; i < this->numCoverageStages(); i++) {
67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        if (!GrProcessorStage::AreCompatible(this->getCoverageStage(i), that.getCoverageStage(i),
68b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                             explicitLocalCoords)) {
6921aed57023bad4b04076c59e37097c7563efc028egdaniel            return false;
7021aed57023bad4b04076c59e37097c7563efc028egdaniel        }
7121aed57023bad4b04076c59e37097c7563efc028egdaniel    }
7221aed57023bad4b04076c59e37097c7563efc028egdaniel
7321aed57023bad4b04076c59e37097c7563efc028egdaniel    SkASSERT(0 == memcmp(this->fFixedFunctionVertexAttribIndices,
7421aed57023bad4b04076c59e37097c7563efc028egdaniel                            that.fFixedFunctionVertexAttribIndices,
7521aed57023bad4b04076c59e37097c7563efc028egdaniel                            sizeof(this->fFixedFunctionVertexAttribIndices)));
7621aed57023bad4b04076c59e37097c7563efc028egdaniel
7721aed57023bad4b04076c59e37097c7563efc028egdaniel    return true;
7821aed57023bad4b04076c59e37097c7563efc028egdaniel}
7921aed57023bad4b04076c59e37097c7563efc028egdaniel
8021aed57023bad4b04076c59e37097c7563efc028egdaniel////////////////////////////////////////////////////////////////////////////////
8121aed57023bad4b04076c59e37097c7563efc028egdaniel
8221aed57023bad4b04076c59e37097c7563efc028egdanielbool GrRODrawState::validateVertexAttribs() const {
8321aed57023bad4b04076c59e37097c7563efc028egdaniel    // check consistency of effects and attributes
8421aed57023bad4b04076c59e37097c7563efc028egdaniel    GrSLType slTypes[kMaxVertexAttribCnt];
8521aed57023bad4b04076c59e37097c7563efc028egdaniel    for (int i = 0; i < kMaxVertexAttribCnt; ++i) {
8621aed57023bad4b04076c59e37097c7563efc028egdaniel        slTypes[i] = static_cast<GrSLType>(-1);
8721aed57023bad4b04076c59e37097c7563efc028egdaniel    }
88bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt
89bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    if (this->hasGeometryProcessor()) {
90b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrGeometryStage& stage = *this->getGeometryProcessor();
91b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrGeometryProcessor* gp = stage.getGeometryProcessor();
92b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        SkASSERT(gp);
9321aed57023bad4b04076c59e37097c7563efc028egdaniel        // make sure that any attribute indices have the correct binding type, that the attrib
9421aed57023bad4b04076c59e37097c7563efc028egdaniel        // type and effect's shader lang type are compatible, and that attributes shared by
9521aed57023bad4b04076c59e37097c7563efc028egdaniel        // multiple effects use the same shader lang type.
96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrGeometryProcessor::VertexAttribArray& s = gp->getVertexAttribs();
9721aed57023bad4b04076c59e37097c7563efc028egdaniel
98249af15fb82833d2274850c589812b6e69df0033joshualitt        int effectIndex = 0;
99249af15fb82833d2274850c589812b6e69df0033joshualitt        for (int index = 0; index < fVACount; index++) {
100b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            if (kGeometryProcessor_GrVertexAttribBinding != fVAPtr[index].fBinding) {
101249af15fb82833d2274850c589812b6e69df0033joshualitt                // we only care about effect bindings
102249af15fb82833d2274850c589812b6e69df0033joshualitt                continue;
103249af15fb82833d2274850c589812b6e69df0033joshualitt            }
104249af15fb82833d2274850c589812b6e69df0033joshualitt            SkASSERT(effectIndex < s.count());
105249af15fb82833d2274850c589812b6e69df0033joshualitt            GrSLType effectSLType = s[effectIndex].getType();
106249af15fb82833d2274850c589812b6e69df0033joshualitt            GrVertexAttribType attribType = fVAPtr[index].fType;
10721aed57023bad4b04076c59e37097c7563efc028egdaniel            int slVecCount = GrSLTypeVectorCount(effectSLType);
10821aed57023bad4b04076c59e37097c7563efc028egdaniel            int attribVecCount = GrVertexAttribTypeVectorCount(attribType);
10921aed57023bad4b04076c59e37097c7563efc028egdaniel            if (slVecCount != attribVecCount ||
110249af15fb82833d2274850c589812b6e69df0033joshualitt                (static_cast<GrSLType>(-1) != slTypes[index] && slTypes[index] != effectSLType)) {
11121aed57023bad4b04076c59e37097c7563efc028egdaniel                return false;
11221aed57023bad4b04076c59e37097c7563efc028egdaniel            }
113249af15fb82833d2274850c589812b6e69df0033joshualitt            slTypes[index] = effectSLType;
114249af15fb82833d2274850c589812b6e69df0033joshualitt            effectIndex++;
11521aed57023bad4b04076c59e37097c7563efc028egdaniel        }
116249af15fb82833d2274850c589812b6e69df0033joshualitt        // Make sure all attributes are consumed and we were able to find everything
117249af15fb82833d2274850c589812b6e69df0033joshualitt        SkASSERT(s.count() == effectIndex);
11821aed57023bad4b04076c59e37097c7563efc028egdaniel    }
11921aed57023bad4b04076c59e37097c7563efc028egdaniel
12021aed57023bad4b04076c59e37097c7563efc028egdaniel    return true;
12121aed57023bad4b04076c59e37097c7563efc028egdaniel}
12221aed57023bad4b04076c59e37097c7563efc028egdaniel
12321aed57023bad4b04076c59e37097c7563efc028egdanielbool GrRODrawState::hasSolidCoverage() const {
12421aed57023bad4b04076c59e37097c7563efc028egdaniel    // If we're drawing coverage directly then coverage is effectively treated as color.
12521aed57023bad4b04076c59e37097c7563efc028egdaniel    if (this->isCoverageDrawing()) {
12621aed57023bad4b04076c59e37097c7563efc028egdaniel        return true;
12721aed57023bad4b04076c59e37097c7563efc028egdaniel    }
12821aed57023bad4b04076c59e37097c7563efc028egdaniel
12921aed57023bad4b04076c59e37097c7563efc028egdaniel    GrColor coverage;
13021aed57023bad4b04076c59e37097c7563efc028egdaniel    uint32_t validComponentFlags;
13121aed57023bad4b04076c59e37097c7563efc028egdaniel    // Initialize to an unknown starting coverage if per-vertex coverage is specified.
13221aed57023bad4b04076c59e37097c7563efc028egdaniel    if (this->hasCoverageVertexAttribute()) {
13321aed57023bad4b04076c59e37097c7563efc028egdaniel        validComponentFlags = 0;
13421aed57023bad4b04076c59e37097c7563efc028egdaniel    } else {
13521aed57023bad4b04076c59e37097c7563efc028egdaniel        coverage = fCoverage;
13621aed57023bad4b04076c59e37097c7563efc028egdaniel        validComponentFlags = kRGBA_GrColorComponentFlags;
13721aed57023bad4b04076c59e37097c7563efc028egdaniel    }
13821aed57023bad4b04076c59e37097c7563efc028egdaniel
13921aed57023bad4b04076c59e37097c7563efc028egdaniel    // Run through the coverage stages and see if the coverage will be all ones at the end.
140bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    if (this->hasGeometryProcessor()) {
141b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrGeometryProcessor* gp = fGeometryProcessor->getGeometryProcessor();
142b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        gp->getConstantColorComponents(&coverage, &validComponentFlags);
143bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    }
14421aed57023bad4b04076c59e37097c7563efc028egdaniel    for (int s = 0; s < this->numCoverageStages(); ++s) {
145b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrProcessor* processor = this->getCoverageStage(s).getProcessor();
146b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        processor->getConstantColorComponents(&coverage, &validComponentFlags);
14721aed57023bad4b04076c59e37097c7563efc028egdaniel    }
14821aed57023bad4b04076c59e37097c7563efc028egdaniel    return (kRGBA_GrColorComponentFlags == validComponentFlags) && (0xffffffff == coverage);
14921aed57023bad4b04076c59e37097c7563efc028egdaniel}
15021aed57023bad4b04076c59e37097c7563efc028egdaniel
15121aed57023bad4b04076c59e37097c7563efc028egdaniel////////////////////////////////////////////////////////////////////////////////
15221aed57023bad4b04076c59e37097c7563efc028egdaniel
15321aed57023bad4b04076c59e37097c7563efc028egdanielbool GrRODrawState::willEffectReadDstColor() const {
15421aed57023bad4b04076c59e37097c7563efc028egdaniel    if (!this->isColorWriteDisabled()) {
15521aed57023bad4b04076c59e37097c7563efc028egdaniel        for (int s = 0; s < this->numColorStages(); ++s) {
156b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            if (this->getColorStage(s).getFragmentProcessor()->willReadDstColor()) {
15721aed57023bad4b04076c59e37097c7563efc028egdaniel                return true;
15821aed57023bad4b04076c59e37097c7563efc028egdaniel            }
15921aed57023bad4b04076c59e37097c7563efc028egdaniel        }
16021aed57023bad4b04076c59e37097c7563efc028egdaniel    }
16121aed57023bad4b04076c59e37097c7563efc028egdaniel    for (int s = 0; s < this->numCoverageStages(); ++s) {
162b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        if (this->getCoverageStage(s).getFragmentProcessor()->willReadDstColor()) {
163bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt            return true;
164bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt        }
165bd769d0f1c8cf6ccbb2738dfad1624a4c828e4ebjoshualitt    }
16621aed57023bad4b04076c59e37097c7563efc028egdaniel    return false;
16721aed57023bad4b04076c59e37097c7563efc028egdaniel}
16821aed57023bad4b04076c59e37097c7563efc028egdaniel
16921aed57023bad4b04076c59e37097c7563efc028egdaniel////////////////////////////////////////////////////////////////////////////////
17021aed57023bad4b04076c59e37097c7563efc028egdaniel
1713658f382cc129e463d7f40a7e68214d04d50fe14egdanielGrRODrawState::BlendOptFlags GrRODrawState::getBlendOpts(bool forceCoverage,
1723658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                                                         GrBlendCoeff* srcCoeff,
1733658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                                                         GrBlendCoeff* dstCoeff) const {
1743658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    GrBlendCoeff bogusSrcCoeff, bogusDstCoeff;
1753658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (NULL == srcCoeff) {
1763658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        srcCoeff = &bogusSrcCoeff;
1773658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
1783658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (NULL == dstCoeff) {
1793658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        dstCoeff = &bogusDstCoeff;
1803658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
1813658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
1823658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    *srcCoeff = this->getSrcBlendCoeff();
1833658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    *dstCoeff = this->getDstBlendCoeff();
1843658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
1853658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (this->isColorWriteDisabled()) {
1863658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        *srcCoeff = kZero_GrBlendCoeff;
1873658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        *dstCoeff = kOne_GrBlendCoeff;
1883658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
1893658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
1903658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    bool srcAIsOne = this->srcAlphaWillBeOne();
1913658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff ||
1923658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                         (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne);
1933658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff ||
1943658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                         (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne);
1953658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
1963658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // When coeffs are (0,1) there is no reason to draw at all, unless
1973658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // stenciling is enabled. Having color writes disabled is effectively
1983658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // (0,1).
1993658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne)) {
2003658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (this->getStencil().doesWrite()) {
2013658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            return kEmitCoverage_BlendOptFlag;
2023658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        } else {
203170f90b4576f291879371ecd6ae4bc2b1d85c64aegdaniel            *dstCoeff = kOne_GrBlendCoeff;
2043658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            return kSkipDraw_BlendOptFlag;
2053658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
2063658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
2073658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2083658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    bool hasCoverage = forceCoverage || !this->hasSolidCoverage();
2093658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2103658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // if we don't have coverage we can check whether the dst
2113658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // has to read at all. If not, we'll disable blending.
2123658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (!hasCoverage) {
2133658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (dstCoeffIsZero) {
2143658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            if (kOne_GrBlendCoeff == *srcCoeff) {
2153658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // if there is no coverage and coeffs are (1,0) then we
2163658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // won't need to read the dst at all, it gets replaced by src
2173658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                *dstCoeff = kZero_GrBlendCoeff;
2183658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                return kNone_BlendOpt;
2193658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            } else if (kZero_GrBlendCoeff == *srcCoeff) {
2203658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // if the op is "clear" then we don't need to emit a color
2213658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // or blend, just write transparent black into the dst.
2223658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                *srcCoeff = kOne_GrBlendCoeff;
2233658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                *dstCoeff = kZero_GrBlendCoeff;
2243658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                return kEmitTransBlack_BlendOptFlag;
2253658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            }
2263658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
2273658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    } else if (this->isCoverageDrawing()) {
2283658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // we have coverage but we aren't distinguishing it from alpha by request.
2293658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        return kCoverageAsAlpha_BlendOptFlag;
2303658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    } else {
2313658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // check whether coverage can be safely rolled into alpha
2323658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // of if we can skip color computation and just emit coverage
2333658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (this->canTweakAlphaForCoverage()) {
2343658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            return kCoverageAsAlpha_BlendOptFlag;
2353658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
2363658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (dstCoeffIsZero) {
2373658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            if (kZero_GrBlendCoeff == *srcCoeff) {
2383658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // the source color is not included in the blend
2393658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // the dst coeff is effectively zero so blend works out to:
2403658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // (c)(0)D + (1-c)D = (1-c)D.
2413658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                *dstCoeff = kISA_GrBlendCoeff;
2423658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                return  kEmitCoverage_BlendOptFlag;
2433658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            } else if (srcAIsOne) {
2443658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // the dst coeff is effectively zero so blend works out to:
2453658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // cS + (c)(0)D + (1-c)D = cS + (1-c)D.
2463658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // If Sa is 1 then we can replace Sa with c
2473658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                // and set dst coeff to 1-Sa.
2483658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                *dstCoeff = kISA_GrBlendCoeff;
2493658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                return  kCoverageAsAlpha_BlendOptFlag;
2503658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            }
2513658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        } else if (dstCoeffIsOne) {
2523658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            // the dst coeff is effectively one so blend works out to:
2533658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            // cS + (c)(1)D + (1-c)D = cS + D.
2543658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            *dstCoeff = kOne_GrBlendCoeff;
2553658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            return  kCoverageAsAlpha_BlendOptFlag;
2563658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
2573658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
2583658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2593658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    return kNone_BlendOpt;
2603658f382cc129e463d7f40a7e68214d04d50fe14egdaniel}
2613658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2623658f382cc129e463d7f40a7e68214d04d50fe14egdaniel////////////////////////////////////////////////////////////////////////////////
2633658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
26421aed57023bad4b04076c59e37097c7563efc028egdaniel// Some blend modes allow folding a fractional coverage value into the color's alpha channel, while
26521aed57023bad4b04076c59e37097c7563efc028egdaniel// others will blend incorrectly.
26621aed57023bad4b04076c59e37097c7563efc028egdanielbool GrRODrawState::canTweakAlphaForCoverage() const {
26721aed57023bad4b04076c59e37097c7563efc028egdaniel    /*
26821aed57023bad4b04076c59e37097c7563efc028egdaniel     The fractional coverage is f.
26921aed57023bad4b04076c59e37097c7563efc028egdaniel     The src and dst coeffs are Cs and Cd.
27021aed57023bad4b04076c59e37097c7563efc028egdaniel     The dst and src colors are S and D.
27121aed57023bad4b04076c59e37097c7563efc028egdaniel     We want the blend to compute: f*Cs*S + (f*Cd + (1-f))D. By tweaking the source color's alpha
27221aed57023bad4b04076c59e37097c7563efc028egdaniel     we're replacing S with S'=fS. It's obvious that that first term will always be ok. The second
27321aed57023bad4b04076c59e37097c7563efc028egdaniel     term can be rearranged as [1-(1-Cd)f]D. By substituting in the various possibilities for Cd we
27421aed57023bad4b04076c59e37097c7563efc028egdaniel     find that only 1, ISA, and ISC produce the correct destination when applied to S' and D.
27521aed57023bad4b04076c59e37097c7563efc028egdaniel     Also, if we're directly rendering coverage (isCoverageDrawing) then coverage is treated as
27621aed57023bad4b04076c59e37097c7563efc028egdaniel     color by definition.
27721aed57023bad4b04076c59e37097c7563efc028egdaniel     */
27821aed57023bad4b04076c59e37097c7563efc028egdaniel    return kOne_GrBlendCoeff == fDstBlend ||
27921aed57023bad4b04076c59e37097c7563efc028egdaniel           kISA_GrBlendCoeff == fDstBlend ||
28021aed57023bad4b04076c59e37097c7563efc028egdaniel           kISC_GrBlendCoeff == fDstBlend ||
28121aed57023bad4b04076c59e37097c7563efc028egdaniel           this->isCoverageDrawing();
28221aed57023bad4b04076c59e37097c7563efc028egdaniel}
28321aed57023bad4b04076c59e37097c7563efc028egdaniel
2842a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomonvoid GrRODrawState::convertToPendingExec() {
2852a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    fRenderTarget.markPendingIO();
2862a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    fRenderTarget.removeRef();
2872a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    for (int i = 0; i < fColorStages.count(); ++i) {
2882a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon        fColorStages[i].convertToPendingExec();
2892a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    }
2902a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    if (fGeometryProcessor) {
2912a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon        fGeometryProcessor->convertToPendingExec();
2922a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    }
2932a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    for (int i = 0; i < fCoverageStages.count(); ++i) {
2942a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon        fCoverageStages[i].convertToPendingExec();
2952a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon    }
2962a9ca782ba5db5a7ebdc315655d9a30dcd6d9845bsalomon}
2973658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
2983658f382cc129e463d7f40a7e68214d04d50fe14egdanielbool GrRODrawState::srcAlphaWillBeOne() const {
2993658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    uint32_t validComponentFlags;
3003658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    GrColor color;
3013658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // Check if per-vertex or constant color may have partial alpha
3023658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (this->hasColorVertexAttribute()) {
3033658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (fHints & kVertexColorsAreOpaque_Hint) {
3043658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            validComponentFlags = kA_GrColorComponentFlag;
3053658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            color = 0xFF << GrColor_SHIFT_A;
3063658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        } else {
3073658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            validComponentFlags = 0;
3083658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            color = 0; // not strictly necessary but we get false alarms from tools about uninit.
3093658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
3103658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    } else {
3113658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        validComponentFlags = kRGBA_GrColorComponentFlags;
3123658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        color = this->getColor();
3133658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
3143658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3153658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // Run through the color stages
3163658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    for (int s = 0; s < this->numColorStages(); ++s) {
317b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        const GrProcessor* processor = this->getColorStage(s).getProcessor();
318b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt        processor->getConstantColorComponents(&color, &validComponentFlags);
3193658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
3203658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3213658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    // Check whether coverage is treated as color. If so we run through the coverage computation.
3223658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    if (this->isCoverageDrawing()) {
3233658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // The shader generated for coverage drawing runs the full coverage computation and then
3243658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // makes the shader output be the multiplication of color and coverage. We mirror that here.
3253658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        GrColor coverage;
3263658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        uint32_t coverageComponentFlags;
3273658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        if (this->hasCoverageVertexAttribute()) {
3283658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            coverageComponentFlags = 0;
3293658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            coverage = 0; // suppresses any warnings.
3303658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        } else {
3313658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            coverageComponentFlags = kRGBA_GrColorComponentFlags;
3323658f382cc129e463d7f40a7e68214d04d50fe14egdaniel            coverage = this->getCoverageColor();
3333658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
3343658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3353658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // Run through the coverage stages
3363658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        for (int s = 0; s < this->numCoverageStages(); ++s) {
337b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            const GrProcessor* processor = this->getCoverageStage(s).getProcessor();
338b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt            processor->getConstantColorComponents(&coverage, &coverageComponentFlags);
3393658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        }
3403658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3413658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // Since the shader will multiply coverage and color, the only way the final A==1 is if
3423658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        // coverage and color both have A==1.
3433658f382cc129e463d7f40a7e68214d04d50fe14egdaniel        return (kA_GrColorComponentFlag & validComponentFlags & coverageComponentFlags) &&
3443658f382cc129e463d7f40a7e68214d04d50fe14egdaniel                0xFF == GrColorUnpackA(color) && 0xFF == GrColorUnpackA(coverage);
3453658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3463658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    }
3473658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
3483658f382cc129e463d7f40a7e68214d04d50fe14egdaniel    return (kA_GrColorComponentFlag & validComponentFlags) && 0xFF == GrColorUnpackA(color);
3493658f382cc129e463d7f40a7e68214d04d50fe14egdaniel}
3503658f382cc129e463d7f40a7e68214d04d50fe14egdaniel
351