/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/ganesh/GrProcessorAnalysis.h" #include "src/gpu/ganesh/GrCaps.h" #include "src/gpu/ganesh/GrFragmentProcessor.h" #include "src/gpu/ganesh/GrShaderCaps.h" GrColorFragmentProcessorAnalysis::GrColorFragmentProcessorAnalysis( const GrProcessorAnalysisColor& input, std::unique_ptr const fps[], int count) { fCompatibleWithCoverageAsAlpha = true; fIsOpaque = input.isOpaque(); fUsesLocalCoords = false; fWillReadDstColor = false; fProcessorsToEliminate = 0; fOutputColorKnown = input.isConstant(&fLastKnownOutputColor); for (int i = 0; i < count; ++i) { const GrFragmentProcessor* fp = fps[i].get(); if (fOutputColorKnown && fp->hasConstantOutputForConstantInput(fLastKnownOutputColor, &fLastKnownOutputColor)) { ++fProcessorsToEliminate; fIsOpaque = fLastKnownOutputColor.isOpaque(); // We reset these flags since the earlier fragment processors are being eliminated. fCompatibleWithCoverageAsAlpha = true; fUsesLocalCoords = false; fWillReadDstColor = false; continue; } fOutputColorKnown = false; if (fIsOpaque && !fp->preservesOpaqueInput()) { fIsOpaque = false; } if (fCompatibleWithCoverageAsAlpha && !fp->compatibleWithCoverageAsAlpha()) { fCompatibleWithCoverageAsAlpha = false; } if (fp->usesSampleCoords()) { fUsesLocalCoords = true; } if (fp->willReadDstColor()) { fWillReadDstColor = true; } } } bool GrColorFragmentProcessorAnalysis::requiresDstTexture(const GrCaps& caps) const { return this->willReadDstColor() && !caps.shaderCaps()->fDstReadInShaderSupport; }