Don't perform analysis twice in InstancedRendering::Op
Change-Id: Ie0aeeb7bf63090b0c27a9b062cce0cdc561a1d7e
Reviewed-on: https://skia-review.googlesource.com/10583
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/instanced/InstancedRendering.cpp b/src/gpu/instanced/InstancedRendering.cpp
index 2550f9d..f6ea628 100644
--- a/src/gpu/instanced/InstancedRendering.cpp
+++ b/src/gpu/instanced/InstancedRendering.cpp
@@ -6,7 +6,7 @@
*/
#include "InstancedRendering.h"
-
+#include "GrAppliedClip.h"
#include "GrCaps.h"
#include "GrOpFlushState.h"
#include "GrPipeline.h"
@@ -122,8 +122,6 @@
op->fInfo.setAAType(aaType);
op->fInfo.fShapeTypes = GetShapeFlag(type);
op->fInfo.fCannotDiscard = true;
- op->fDrawColorsAreOpaque = GrColorIsOpaque(color);
- op->fDrawColorsAreSame = true;
Instance& instance = op->getSingleInstance();
instance.fInfo = (int)type << kShapeType_InfoBit;
@@ -343,6 +341,8 @@
}
fProcessors.analyzeAndEliminateFragmentProcessors(&analysis, this->getSingleInstance().fColor,
coverageInput, clip, caps);
+ fAnalysisColor = analysis.outputColor();
+
Draw& draw = this->getSingleDraw(); // This will assert if we have > 1 command.
SkASSERT(draw.fGeometry.isEmpty());
SkASSERT(SkIsPow2(fInfo.fShapeTypes));
@@ -407,9 +407,7 @@
this->joinBounds(*that);
fInfo = combinedInfo;
fPixelLoad += that->fPixelLoad;
- fDrawColorsAreOpaque = fDrawColorsAreOpaque && that->fDrawColorsAreOpaque;
- fDrawColorsAreSame = fDrawColorsAreSame && that->fDrawColorsAreSame &&
- fHeadDraw->fInstance.fColor == that->fHeadDraw->fInstance.fColor;
+ fAnalysisColor = GrPipelineAnalysisColor::Combine(fAnalysisColor, that->fAnalysisColor);
// Adopt the other op's draws.
fNumDraws += that->fNumDraws;
fNumChangesInGeometry += that->fNumChangesInGeometry;
@@ -466,28 +464,20 @@
state->gpu()->handleDirtyContext();
- // TODO: Don't reanalyze the processors.
- GrProcessorSet::FragmentProcessorAnalysis analysis;
- GrPipelineAnalysisCoverage coverageInput;
- if (GrAAType::kCoverage == fInfo.aaType() ||
- (GrAAType::kNone == fInfo.aaType() && !fInfo.isSimpleRects() && fInfo.fCannotDiscard)) {
- coverageInput = GrPipelineAnalysisCoverage::kSingleChannel;
- } else {
- coverageInput = GrPipelineAnalysisCoverage::kNone;
- }
- GrPipelineAnalysisColor colorInput;
- if (fDrawColorsAreSame) {
- colorInput = fHeadDraw->fInstance.fColor;
- } else if (fDrawColorsAreOpaque) {
- colorInput = GrPipelineAnalysisColor::Opaque::kYes;
- }
const GrAppliedClip* clip = state->drawOpArgs().fAppliedClip;
- analysis.init(colorInput, coverageInput, fProcessors, clip, state->caps());
+ GrPipelineAnalysisCoverage coverage;
+ if (GrAAType::kCoverage == fInfo.aaType() ||
+ (clip && clip->clipCoverageFragmentProcessor()) ||
+ (GrAAType::kNone == fInfo.aaType() && !fInfo.isSimpleRects() && fInfo.fCannotDiscard)) {
+ coverage = GrPipelineAnalysisCoverage::kSingleChannel;
+ } else {
+ coverage = GrPipelineAnalysisCoverage::kNone;
+ }
GrPipeline pipeline;
GrPipeline::InitArgs args;
- args.fInputColor = analysis.outputColor();
- args.fInputCoverage = analysis.outputCoverage();
+ args.fInputColor = fAnalysisColor;
+ args.fInputCoverage = coverage;
args.fAppliedClip = clip;
args.fCaps = &state->caps();
args.fProcessors = &fProcessors;