aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrProcessorSet.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-03-24 12:27:17 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-24 17:05:26 +0000
commit70288c0a9179f308fc7de1b07899baef4446e444 (patch)
tree56a906cc791fc8f25c1abe32fa5918e5ae2bfad2 /src/gpu/GrProcessorSet.cpp
parentd3caa77f3c69d787ef126bf66e21ee5ebf62aa50 (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.cpp50
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;
+ }
+}