1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorAnalysis.h" 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrFragmentProcessor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h" 12*c8dee2aaSAndroid Build Coastguard Worker GrColorFragmentProcessorAnalysis(const GrProcessorAnalysisColor & input,std::unique_ptr<GrFragmentProcessor> const fps[],int count)13*c8dee2aaSAndroid Build Coastguard WorkerGrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis( 14*c8dee2aaSAndroid Build Coastguard Worker const GrProcessorAnalysisColor& input, 15*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GrFragmentProcessor> const fps[], 16*c8dee2aaSAndroid Build Coastguard Worker int count) { 17*c8dee2aaSAndroid Build Coastguard Worker fCompatibleWithCoverageAsAlpha = true; 18*c8dee2aaSAndroid Build Coastguard Worker fIsOpaque = input.isOpaque(); 19*c8dee2aaSAndroid Build Coastguard Worker fUsesLocalCoords = false; 20*c8dee2aaSAndroid Build Coastguard Worker fWillReadDstColor = false; 21*c8dee2aaSAndroid Build Coastguard Worker fProcessorsToEliminate = 0; 22*c8dee2aaSAndroid Build Coastguard Worker fOutputColorKnown = input.isConstant(&fLastKnownOutputColor); 23*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < count; ++i) { 24*c8dee2aaSAndroid Build Coastguard Worker const GrFragmentProcessor* fp = fps[i].get(); 25*c8dee2aaSAndroid Build Coastguard Worker if (fOutputColorKnown && fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, 26*c8dee2aaSAndroid Build Coastguard Worker &fLastKnownOutputColor)) { 27*c8dee2aaSAndroid Build Coastguard Worker ++fProcessorsToEliminate; 28*c8dee2aaSAndroid Build Coastguard Worker fIsOpaque = fLastKnownOutputColor.isOpaque(); 29*c8dee2aaSAndroid Build Coastguard Worker // We reset these flags since the earlier fragment processors are being eliminated. 30*c8dee2aaSAndroid Build Coastguard Worker fCompatibleWithCoverageAsAlpha = true; 31*c8dee2aaSAndroid Build Coastguard Worker fUsesLocalCoords = false; 32*c8dee2aaSAndroid Build Coastguard Worker fWillReadDstColor = false; 33*c8dee2aaSAndroid Build Coastguard Worker continue; 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker fOutputColorKnown = false; 37*c8dee2aaSAndroid Build Coastguard Worker if (fIsOpaque && !fp->preservesOpaqueInput()) { 38*c8dee2aaSAndroid Build Coastguard Worker fIsOpaque = false; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) { 41*c8dee2aaSAndroid Build Coastguard Worker fCompatibleWithCoverageAsAlpha = false; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker if (fp->usesSampleCoords()) { 44*c8dee2aaSAndroid Build Coastguard Worker fUsesLocalCoords = true; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker if (fp->willReadDstColor()) { 47*c8dee2aaSAndroid Build Coastguard Worker fWillReadDstColor = true; 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker requiresDstTexture(const GrCaps & caps) const52*c8dee2aaSAndroid Build Coastguard Workerbool GrColorFragmentProcessorAnalysis::requiresDstTexture(const GrCaps& caps) const { 53*c8dee2aaSAndroid Build Coastguard Worker return this->willReadDstColor() && !caps.shaderCaps()->fDstReadInShaderSupport; 54*c8dee2aaSAndroid Build Coastguard Worker } 55