diff options
author | Brian Salomon <bsalomon@google.com> | 2017-03-24 12:27:17 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-24 17:05:26 +0000 |
commit | 70288c0a9179f308fc7de1b07899baef4446e444 (patch) | |
tree | 56a906cc791fc8f25c1abe32fa5918e5ae2bfad2 /src/gpu/GrProcessorSet.cpp | |
parent | d3caa77f3c69d787ef126bf66e21ee5ebf62aa50 (diff) |
Add function to perform color fragment processor elimination while performing FP analysis.
Use this in path and instanced ops.
Change-Id: I6c2d3fc9b3aaa0220c560c70aa1b85515bd35a6d
Reviewed-on: https://skia-review.googlesource.com/10059
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu/GrProcessorSet.cpp')
-rw-r--r-- | src/gpu/GrProcessorSet.cpp | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/src/gpu/GrProcessorSet.cpp b/src/gpu/GrProcessorSet.cpp index 94e2004546..a8423b6894 100644 --- a/src/gpu/GrProcessorSet.cpp +++ b/src/gpu/GrProcessorSet.cpp @@ -39,13 +39,11 @@ GrProcessorSet::GrProcessorSet(GrPaint&& paint) { } GrProcessorSet::~GrProcessorSet() { - if (this->isPendingExecution()) { - for (auto fp : fFragmentProcessors) { - fp->completedExecution(); - } - } else { - for (auto fp : fFragmentProcessors) { - fp->unref(); + for (int i = fFragmentProcessorOffset; i < fFragmentProcessors.count(); ++i) { + if (this->isPendingExecution()) { + fFragmentProcessors[i]->completedExecution(); + } else { + fFragmentProcessors[i]->unref(); } } } @@ -53,20 +51,24 @@ GrProcessorSet::~GrProcessorSet() { void GrProcessorSet::makePendingExecution() { SkASSERT(!(kPendingExecution_Flag & fFlags)); fFlags |= kPendingExecution_Flag; - for (int i = 0; i < fFragmentProcessors.count(); ++i) { + for (int i = fFragmentProcessorOffset; i < fFragmentProcessors.count(); ++i) { fFragmentProcessors[i]->addPendingExecution(); fFragmentProcessors[i]->unref(); } } bool GrProcessorSet::operator==(const GrProcessorSet& that) const { + int fpCount = this->numFragmentProcessors(); if (((fFlags ^ that.fFlags) & ~kPendingExecution_Flag) || - fFragmentProcessors.count() != that.fFragmentProcessors.count() || + fpCount != that.numFragmentProcessors() || fColorFragmentProcessorCnt != that.fColorFragmentProcessorCnt) { return false; } - for (int i = 0; i < fFragmentProcessors.count(); ++i) { - if (!fFragmentProcessors[i]->isEqual(*that.fFragmentProcessors[i])) { + + for (int i = 0; i < fpCount; ++i) { + int a = i + fFragmentProcessorOffset; + int b = i + that.fFragmentProcessorOffset; + if (!fFragmentProcessors[a]->isEqual(*that.fFragmentProcessors[b])) { return false; } } @@ -87,7 +89,8 @@ void GrProcessorSet::FragmentProcessorAnalysis::internalInit(const GrPipelineInp fCompatibleWithCoverageAsAlpha = !coverageInput.isLCDCoverage(); fValidInputColor = colorInput.isConstant(&fInputColor); - const GrFragmentProcessor* const* fps = processors.fFragmentProcessors.get(); + const GrFragmentProcessor* const* fps = + processors.fFragmentProcessors.get() + processors.fFragmentProcessorOffset; colorInfo.analyzeProcessors(fps, processors.fColorFragmentProcessorCnt); fCompatibleWithCoverageAsAlpha &= colorInfo.allProcessorsCompatibleWithCoverageAsAlpha(); fps += processors.fColorFragmentProcessorCnt; @@ -147,3 +150,26 @@ GrProcessorSet::FragmentProcessorAnalysis::FragmentProcessorAnalysis( : FragmentProcessorAnalysis() { this->internalInit(colorInput, coverageInput, GrProcessorSet(GrPaint()), nullptr, caps); } + +void GrProcessorSet::analyzeAndEliminateFragmentProcessors(FragmentProcessorAnalysis* analysis, + const GrPipelineInput& colorInput, + const GrPipelineInput coverageInput, + const GrAppliedClip* clip, + const GrCaps& caps) { + analysis->init(colorInput, coverageInput, *this, clip, caps); + if (analysis->fInitialColorProcessorsToEliminate > 0) { + for (unsigned i = 0; i < analysis->fInitialColorProcessorsToEliminate; ++i) { + if (this->isPendingExecution()) { + fFragmentProcessors[i + fFragmentProcessorOffset]->completedExecution(); + } else { + fFragmentProcessors[i + fFragmentProcessorOffset]->unref(); + } + fFragmentProcessors[i + fFragmentProcessorOffset] = nullptr; + } + fFragmentProcessorOffset += analysis->fInitialColorProcessorsToEliminate; + fColorFragmentProcessorCnt -= analysis->fInitialColorProcessorsToEliminate; + SkASSERT(fFragmentProcessorOffset + fColorFragmentProcessorCnt <= + fFragmentProcessors.count()); + analysis->fInitialColorProcessorsToEliminate = 0; + } +} |