| Index: src/gpu/GrDrawState.cpp
|
| diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp
|
| index 51ef6cf5d3c8302c815aacb2ba356278c35c25f5..a91a43c44e5f003b874a5efe7941496c3fc90b7a 100644
|
| --- a/src/gpu/GrDrawState.cpp
|
| +++ b/src/gpu/GrDrawState.cpp
|
| @@ -15,11 +15,6 @@
|
| #include "effects/GrPorterDuffXferProcessor.h"
|
|
|
| bool GrDrawState::isEqual(const GrDrawState& that) const {
|
| - bool usingVertexColors = this->hasColorVertexAttribute();
|
| - if (!usingVertexColors && this->fColor != that.fColor) {
|
| - return false;
|
| - }
|
| -
|
| if (this->getRenderTarget() != that.getRenderTarget() ||
|
| this->fColorStages.count() != that.fColorStages.count() ||
|
| this->fCoverageStages.count() != that.fCoverageStages.count() ||
|
| @@ -30,11 +25,6 @@ bool GrDrawState::isEqual(const GrDrawState& that) const {
|
| return false;
|
| }
|
|
|
| - bool usingVertexCoverage = this->hasCoverageVertexAttribute();
|
| - if (!usingVertexCoverage && this->fCoverage != that.fCoverage) {
|
| - return false;
|
| - }
|
| -
|
| bool explicitLocalCoords = this->hasLocalCoordAttribute();
|
| if (this->hasGeometryProcessor()) {
|
| if (!that.hasGeometryProcessor()) {
|
| @@ -83,11 +73,9 @@ GrDrawState::GrDrawState(const GrDrawState& state, const SkMatrix& preConcatMatr
|
|
|
| GrDrawState& GrDrawState::operator=(const GrDrawState& that) {
|
| fRenderTarget.reset(SkSafeRef(that.fRenderTarget.get()));
|
| - fColor = that.fColor;
|
| fViewMatrix = that.fViewMatrix;
|
| fFlagBits = that.fFlagBits;
|
| fStencilSettings = that.fStencilSettings;
|
| - fCoverage = that.fCoverage;
|
| fDrawFace = that.fDrawFace;
|
| fGeometryProcessor.reset(SkSafeRef(that.fGeometryProcessor.get()));
|
| fXPFactory.reset(SkRef(that.getXPFactory()));
|
| @@ -116,7 +104,6 @@ void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
|
| fColorStages.reset();
|
| fCoverageStages.reset();
|
|
|
| - fColor = 0xffffffff;
|
| if (NULL == initialViewMatrix) {
|
| fViewMatrix.reset();
|
| } else {
|
| @@ -124,7 +111,6 @@ void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
|
| }
|
| fFlagBits = 0x0;
|
| fStencilSettings.setDisabled();
|
| - fCoverage = 0xff;
|
| fDrawFace = kBoth_DrawFace;
|
|
|
| fHints = 0;
|
| @@ -181,29 +167,34 @@ void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
|
| // Enable the clip bit
|
| this->enableState(GrDrawState::kClip_StateBit);
|
|
|
| - this->setColor(paint.getColor());
|
| this->setState(GrDrawState::kDither_StateBit, paint.isDither());
|
| this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias());
|
|
|
| - this->setCoverage(0xFF);
|
| fColorProcInfoValid = false;
|
| fCoverageProcInfoValid = false;
|
| +
|
| + fColorCache = GrColor_ILLEGAL;
|
| + fCoverageCache = GrColor_ILLEGAL;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -bool GrDrawState::couldApplyCoverage(const GrDrawTargetCaps& caps) const {
|
| +bool GrDrawState::canUseFracCoveragePrimProc(GrColor color, const GrDrawTargetCaps& caps) const {
|
| if (caps.dualSourceBlendingSupport()) {
|
| return true;
|
| }
|
|
|
| - this->calcColorInvariantOutput();
|
| - this->calcCoverageInvariantOutput();
|
| + this->calcColorInvariantOutput(color);
|
| +
|
| + // The coverage isn't actually white, its unknown, but this will produce the same effect
|
| + // TODO we want to cache the result of this call, but we can probably clean up the interface
|
| + // so we don't have to pass in a seemingly known coverage
|
| + this->calcCoverageInvariantOutput(GrColor_WHITE);
|
| return fXPFactory->canApplyCoverage(fColorProcInfo, fCoverageProcInfo,
|
| this->isCoverageDrawing(), this->isColorWriteDisabled());
|
| }
|
|
|
| -bool GrDrawState::hasSolidCoverage() const {
|
| +bool GrDrawState::hasSolidCoverage(GrColor coverage) const {
|
| // If we're drawing coverage directly then coverage is effectively treated as color.
|
| if (this->isCoverageDrawing()) {
|
| return true;
|
| @@ -213,15 +204,15 @@ bool GrDrawState::hasSolidCoverage() const {
|
| return false;
|
| }
|
|
|
| - this->calcCoverageInvariantOutput();
|
| + this->calcCoverageInvariantOutput(coverage);
|
| return fCoverageProcInfo.isSolidWhite();
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////s
|
|
|
| -bool GrDrawState::willEffectReadDstColor() const {
|
| - this->calcColorInvariantOutput();
|
| - this->calcCoverageInvariantOutput();
|
| +bool GrDrawState::willEffectReadDstColor(GrColor color, GrColor coverage) const {
|
| + this->calcColorInvariantOutput(color);
|
| + this->calcCoverageInvariantOutput(coverage);
|
| // TODO: Remove need to create the XP here.
|
| // Also once all custom blends are turned into XPs we can remove the need
|
| // to check other stages since only xp's will be able to read dst
|
| @@ -378,25 +369,24 @@ GrDrawState::~GrDrawState() {
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -bool GrDrawState::srcAlphaWillBeOne() const {
|
| - this->calcColorInvariantOutput();
|
| +bool GrDrawState::srcAlphaWillBeOne(GrColor color, GrColor coverage) const {
|
| + this->calcColorInvariantOutput(color);
|
| if (this->isCoverageDrawing()) {
|
| - this->calcCoverageInvariantOutput();
|
| + this->calcCoverageInvariantOutput(coverage);
|
| return (fColorProcInfo.isOpaque() && fCoverageProcInfo.isOpaque());
|
| }
|
| return fColorProcInfo.isOpaque();
|
| }
|
|
|
| -bool GrDrawState::willBlendWithDst() const {
|
| - this->calcColorInvariantOutput();
|
| - this->calcCoverageInvariantOutput();
|
| +bool GrDrawState::willBlendWithDst(GrColor color, GrColor coverage) const {
|
| + this->calcColorInvariantOutput(color);
|
| + this->calcCoverageInvariantOutput(coverage);
|
| return fXPFactory->willBlendWithDst(fColorProcInfo, fCoverageProcInfo,
|
| this->isCoverageDrawing(), this->isColorWriteDisabled());
|
| }
|
|
|
| -void GrDrawState::calcColorInvariantOutput() const {
|
| - if (!fColorProcInfoValid) {
|
| - GrColor color;
|
| +void GrDrawState::calcColorInvariantOutput(GrColor color) const {
|
| + if (!fColorProcInfoValid || color != fColorCache) {
|
| GrColorComponentFlags flags;
|
| if (this->hasColorVertexAttribute()) {
|
| if (fHints & kVertexColorsAreOpaque_Hint) {
|
| @@ -408,28 +398,27 @@ void GrDrawState::calcColorInvariantOutput() const {
|
| }
|
| } else {
|
| flags = kRGBA_GrColorComponentFlags;
|
| - color = this->getColor();
|
| }
|
| fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(),
|
| color, flags, false);
|
| fColorProcInfoValid = true;
|
| + fColorCache = color;
|
| }
|
| }
|
|
|
| -void GrDrawState::calcCoverageInvariantOutput() const {
|
| - if (!fCoverageProcInfoValid) {
|
| - GrColor color;
|
| +void GrDrawState::calcCoverageInvariantOutput(GrColor coverage) const {
|
| + if (!fCoverageProcInfoValid || coverage != fCoverageCache) {
|
| GrColorComponentFlags flags;
|
| // Check if per-vertex or constant color may have partial alpha
|
| if (this->hasCoverageVertexAttribute()) {
|
| flags = static_cast<GrColorComponentFlags>(0);
|
| - color = 0;
|
| + coverage = 0;
|
| } else {
|
| flags = kRGBA_GrColorComponentFlags;
|
| - color = this->getCoverageColor();
|
| }
|
| fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->numCoverageStages(),
|
| - color, flags, true, fGeometryProcessor.get());
|
| + coverage, flags, true, fGeometryProcessor.get());
|
| fCoverageProcInfoValid = true;
|
| + fCoverageCache = coverage;
|
| }
|
| }
|
|
|