GrProcessorAnalysis.cpp revision 9513143efa734bef0c1a0c7f945022572dbc8518
1b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel/* 2b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * Copyright 2014 Google Inc. 3b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * 4b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * Use of this source code is governed by a BSD-style license that can be 5b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel * found in the LICENSE file. 6b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel */ 7b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 8b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h" 9b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 109513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrFragmentProcessor.h" 118d95ffa497091d0c9c7cda099684c7bca6714a17egdaniel#include "GrFragmentStage.h" 129513143efa734bef0c1a0c7f945022572dbc8518egdaniel#include "GrGeometryProcessor.h" 13b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 14b6cbc38702dc4a1540a17181cbdab71060c92ce7egdanielvoid GrProcOptInfo::calcWithInitialValues(const GrFragmentStage* stages, 15b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel int stageCount, 16b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel GrColor startColor, 17b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel GrColorComponentFlags flags, 18b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel bool areCoverageStages, 19b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel const GrGeometryProcessor* gp) { 20b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.reset(startColor, flags, areCoverageStages); 21b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fFirstEffectStageIndex = 0; 22b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = true; 23b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColor = startColor; 24b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fRemoveVertexAttrib = false; 25b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fReadsDst = false; 269513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsFragPosition = false; 27b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 28b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (areCoverageStages && gp) { 29b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel gp->computeInvariantOutput(&fInOut); 30b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 31b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 32b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel for (int i = 0; i < stageCount; ++i) { 33b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel const GrFragmentProcessor* processor = stages[i].getProcessor(); 34b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.resetWillUseInputColor(); 35b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel processor->computeInvariantOutput(&fInOut); 369513143efa734bef0c1a0c7f945022572dbc8518egdaniel#ifdef SK_DEBUG 37b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.validate(); 389513143efa734bef0c1a0c7f945022572dbc8518egdaniel#endif 39b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (!fInOut.willUseInputColor()) { 40b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fFirstEffectStageIndex = i; 41b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = false; 429513143efa734bef0c1a0c7f945022572dbc8518egdaniel // Reset these since we don't care if previous stages read these values 439513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsDst = false; 449513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsFragPosition = false; 45b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 46b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (processor->willReadDstColor()) { 47b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fReadsDst = true; 48b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 499513143efa734bef0c1a0c7f945022572dbc8518egdaniel if (processor->willReadFragmentPosition()) { 509513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsFragPosition = true; 519513143efa734bef0c1a0c7f945022572dbc8518egdaniel } 52b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (kRGBA_GrColorComponentFlags == fInOut.validFlags()) { 53b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fFirstEffectStageIndex = i + 1; 54b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColor = fInOut.color(); 55b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = true; 56b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fRemoveVertexAttrib = true; 57b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel // Since we are clearing all previous color stages we are in a state where we have found 58b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel // zero stages that don't multiply the inputColor. 59b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.resetNonMulStageFound(); 609513143efa734bef0c1a0c7f945022572dbc8518egdaniel // Reset these since we don't care if previous stages read these values 619513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsDst = false; 629513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsFragPosition = false; 63b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 64b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 65b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel} 669513143efa734bef0c1a0c7f945022572dbc8518egdaniel 67