| Index: src/gpu/GrDrawState.cpp
|
| diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp
|
| index 513c3bf9e9eb7549c8e7d4e11666d947ea5a65b4..6558b0d5facc8785587116f9c19b255b3a40fc86 100644
|
| --- a/src/gpu/GrDrawState.cpp
|
| +++ b/src/gpu/GrDrawState.cpp
|
| @@ -8,9 +8,9 @@
|
| #include "GrDrawState.h"
|
|
|
| #include "GrBlend.h"
|
| -#include "GrInvariantOutput.h"
|
| #include "GrOptDrawState.h"
|
| #include "GrPaint.h"
|
| +#include "GrProcOptInfo.h"
|
|
|
| //////////////////////////////////////////////////////////////////////////////s
|
|
|
| @@ -151,6 +151,15 @@ GrDrawState& GrDrawState::operator=(const GrDrawState& that) {
|
|
|
| fHints = that.fHints;
|
|
|
| + fColorProcInfoValid = that.fColorProcInfoValid;
|
| + fCoverageProcInfoValid = that.fCoverageProcInfoValid;
|
| + if (fColorProcInfoValid) {
|
| + fColorProcInfo = that.fColorProcInfo;
|
| + }
|
| + if (fCoverageProcInfoValid) {
|
| + fCoverageProcInfo = that.fCoverageProcInfo;
|
| + }
|
| +
|
| memcpy(fFixedFunctionVertexAttribIndices,
|
| that.fFixedFunctionVertexAttribIndices,
|
| sizeof(fFixedFunctionVertexAttribIndices));
|
| @@ -184,6 +193,9 @@ void GrDrawState::onReset(const SkMatrix* initialViewMatrix) {
|
| fDrawFace = kBoth_DrawFace;
|
|
|
| fHints = 0;
|
| +
|
| + fColorProcInfoValid = false;
|
| + fCoverageProcInfoValid = false;
|
| }
|
|
|
| bool GrDrawState::setIdentityViewMatrix() {
|
| @@ -239,6 +251,8 @@ void GrDrawState::setFromPaint(const GrPaint& paint, const SkMatrix& vm, GrRende
|
|
|
| this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff());
|
| this->setCoverage(0xFF);
|
| + fColorProcInfoValid = false;
|
| + fCoverageProcInfoValid = false;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -336,6 +350,8 @@ void GrDrawState::internalSetVertexAttribs(const GrVertexAttrib* attribs, int co
|
| overlapCheck |= (mask << offsetShift);
|
| #endif
|
| }
|
| + fColorProcInfoValid = false;
|
| + fCoverageProcInfoValid = false;
|
| // Positions must be specified.
|
| SkASSERT(-1 != fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding]);
|
| }
|
| @@ -355,6 +371,8 @@ void GrDrawState::setDefaultVertexAttribs() {
|
| 0xff,
|
| sizeof(fFixedFunctionVertexAttribIndices));
|
| fFixedFunctionVertexAttribIndices[kPosition_GrVertexAttribBinding] = 0;
|
| + fColorProcInfoValid = false;
|
| + fCoverageProcInfoValid = false;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -384,24 +402,8 @@ bool GrDrawState::hasSolidCoverage() const {
|
| return false;
|
| }
|
|
|
| - GrColor color;
|
| - GrColorComponentFlags flags;
|
| - // Initialize to an unknown starting coverage if per-vertex coverage is specified.
|
| - if (this->hasCoverageVertexAttribute()) {
|
| - color = 0;
|
| - flags = static_cast<GrColorComponentFlags>(0);
|
| - } else {
|
| - color = this->getCoverageColor();
|
| - flags = kRGBA_GrColorComponentFlags;
|
| - }
|
| - GrInvariantOutput inout(color, flags, true);
|
| -
|
| - // check the coverage output from the GP
|
| - if (this->hasGeometryProcessor()) {
|
| - fGeometryProcessor->computeInvariantOutput(&inout);
|
| - }
|
| -
|
| - return inout.isSolidWhite();
|
| + this->calcCoverageInvariantOutput();
|
| + return fCoverageProcInfo.isSolidWhite();
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
| @@ -419,18 +421,13 @@ GrDrawState::AutoVertexAttribRestore::AutoVertexAttribRestore(GrDrawState* drawS
|
|
|
| bool GrDrawState::willEffectReadDstColor() const {
|
| if (!this->isColorWriteDisabled()) {
|
| - for (int s = 0; s < this->numColorStages(); ++s) {
|
| - if (this->getColorStage(s).getProcessor()->willReadDstColor()) {
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| - for (int s = 0; s < this->numCoverageStages(); ++s) {
|
| - if (this->getCoverageStage(s).getProcessor()->willReadDstColor()) {
|
| + this->calcColorInvariantOutput();
|
| + if (fColorProcInfo.readsDst()) {
|
| return true;
|
| }
|
| }
|
| - return false;
|
| + this->calcCoverageInvariantOutput();
|
| + return fCoverageProcInfo.readsDst();
|
| }
|
|
|
| void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) {
|
| @@ -451,6 +448,10 @@ void GrDrawState::AutoRestoreEffects::set(GrDrawState* ds) {
|
| int n = fDrawState->numCoverageStages() - fCoverageEffectCnt;
|
| SkASSERT(n >= 0);
|
| fDrawState->fCoverageStages.pop_back_n(n);
|
| + if (m + n > 0) {
|
| + fDrawState->fColorProcInfoValid = false;
|
| + fDrawState->fCoverageProcInfoValid = false;
|
| + }
|
| SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
|
| }
|
| fDrawState = ds;
|
| @@ -689,60 +690,13 @@ GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage,
|
| return kNone_BlendOpt;
|
| }
|
|
|
| -
|
| bool GrDrawState::srcAlphaWillBeOne() const {
|
| - GrColor color;
|
| - GrColorComponentFlags flags;
|
| - // Check if per-vertex or constant color may have partial alpha
|
| - if (this->hasColorVertexAttribute()) {
|
| - if (fHints & kVertexColorsAreOpaque_Hint) {
|
| - flags = kA_GrColorComponentFlag;
|
| - color = 0xFF << GrColor_SHIFT_A;
|
| - } else {
|
| - flags = static_cast<GrColorComponentFlags>(0);
|
| - color = 0;
|
| - }
|
| - } else {
|
| - flags = kRGBA_GrColorComponentFlags;
|
| - color = this->getColor();
|
| - }
|
| - GrInvariantOutput inoutColor(color, flags, false);
|
| -
|
| - // Run through the color stages
|
| - for (int s = 0; s < this->numColorStages(); ++s) {
|
| - const GrProcessor* processor = this->getColorStage(s).getProcessor();
|
| - processor->computeInvariantOutput(&inoutColor);
|
| - }
|
| -
|
| - // Check whether coverage is treated as color. If so we run through the coverage computation.
|
| + this->calcColorInvariantOutput();
|
| if (this->isCoverageDrawing()) {
|
| - // The shader generated for coverage drawing runs the full coverage computation and then
|
| - // makes the shader output be the multiplication of color and coverage. We mirror that here.
|
| - if (this->hasCoverageVertexAttribute()) {
|
| - flags = static_cast<GrColorComponentFlags>(0);
|
| - color = 0;
|
| - } else {
|
| - flags = kRGBA_GrColorComponentFlags;
|
| - color = this->getCoverageColor();
|
| - }
|
| - GrInvariantOutput inoutCoverage(color, flags, true);
|
| -
|
| - if (this->hasGeometryProcessor()) {
|
| - fGeometryProcessor->computeInvariantOutput(&inoutCoverage);
|
| - }
|
| -
|
| - // Run through the coverage stages
|
| - for (int s = 0; s < this->numCoverageStages(); ++s) {
|
| - const GrProcessor* processor = this->getCoverageStage(s).getProcessor();
|
| - processor->computeInvariantOutput(&inoutCoverage);
|
| - }
|
| -
|
| - // Since the shader will multiply coverage and color, the only way the final A==1 is if
|
| - // coverage and color both have A==1.
|
| - return (inoutColor.isOpaque() && inoutCoverage.isOpaque());
|
| + this->calcCoverageInvariantOutput();
|
| + return (fColorProcInfo.isOpaque() && fCoverageProcInfo.isOpaque());
|
| }
|
| -
|
| - return inoutColor.isOpaque();
|
| + return fColorProcInfo.isOpaque();
|
| }
|
|
|
| bool GrDrawState::willBlendWithDst() const {
|
| @@ -767,3 +721,43 @@ bool GrDrawState::willBlendWithDst() const {
|
| return false;
|
| }
|
|
|
| +void GrDrawState::calcColorInvariantOutput() const {
|
| + if (!fColorProcInfoValid) {
|
| + GrColor color;
|
| + GrColorComponentFlags flags;
|
| + if (this->hasColorVertexAttribute()) {
|
| + if (fHints & kVertexColorsAreOpaque_Hint) {
|
| + flags = kA_GrColorComponentFlag;
|
| + color = 0xFF << GrColor_SHIFT_A;
|
| + } else {
|
| + flags = static_cast<GrColorComponentFlags>(0);
|
| + color = 0;
|
| + }
|
| + } else {
|
| + flags = kRGBA_GrColorComponentFlags;
|
| + color = this->getColor();
|
| + }
|
| + fColorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(),
|
| + color, flags, false);
|
| + fColorProcInfoValid = true;
|
| + }
|
| +}
|
| +
|
| +void GrDrawState::calcCoverageInvariantOutput() const {
|
| + if (!fCoverageProcInfoValid) {
|
| + GrColor color;
|
| + GrColorComponentFlags flags;
|
| + // Check if per-vertex or constant color may have partial alpha
|
| + if (this->hasCoverageVertexAttribute()) {
|
| + flags = static_cast<GrColorComponentFlags>(0);
|
| + color = 0;
|
| + } else {
|
| + flags = kRGBA_GrColorComponentFlags;
|
| + color = this->getCoverageColor();
|
| + }
|
| + fCoverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->numCoverageStages(),
|
| + color, flags, true, fGeometryProcessor.get());
|
| + fCoverageProcInfoValid = true;
|
| + }
|
| +}
|
| +
|
|
|