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 "GrGeometryProcessor.h" 11b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 1216b991390bb988b194a868ab8de66db4c21c7c13bsalomon#include "batches/GrDrawBatch.h" 1374417824cd988f7d6114858e09720ba00416ce11joshualitt 14ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomonvoid GrProcOptInfo::calcWithInitialValues(const GrFragmentProcessor * const processors[], 15ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon int cnt, 16b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel GrColor startColor, 17b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel GrColorComponentFlags flags, 18723b0501e22373bb3e6c306daaceae02cda8a124egdaniel bool areCoverageStages, 19723b0501e22373bb3e6c306daaceae02cda8a124egdaniel bool isLCD) { 2056995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt GrInitInvariantOutput out; 2156995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt out.fIsSingleComponent = areCoverageStages; 2256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt out.fColor = startColor; 2356995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt out.fValidFlags = flags; 24723b0501e22373bb3e6c306daaceae02cda8a124egdaniel out.fIsLCDCoverage = isLCD; 2556995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt fInOut.reset(out); 26ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon this->internalCalc(processors, cnt, false); 2756995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt} 2856995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt 29ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholasvoid GrProcOptInfo::initUsingInvariantOutput(GrInitInvariantOutput invOutput) { 30ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas fInOut.reset(invOutput); 31ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas} 32ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas 33ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholasvoid GrProcOptInfo::completeCalculations(const GrFragmentProcessor * const processors[], int cnt) { 34ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas this->internalCalc(processors, cnt, false); 35ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas} 36ff2103200bad7abcf8929ae22ac78a9f4f725142ethannicholas 37ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomonvoid GrProcOptInfo::internalCalc(const GrFragmentProcessor* const processors[], 38ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon int cnt, 3956995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt bool initWillReadFragmentPosition) { 40ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon fFirstEffectiveProcessorIndex = 0; 41b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = true; 4256995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt fInputColor = fInOut.color(); 4356995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt fReadsFragPosition = initWillReadFragmentPosition; 44b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel 45ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon for (int i = 0; i < cnt; ++i) { 46ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon const GrFragmentProcessor* processor = processors[i]; 47b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.resetWillUseInputColor(); 48b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel processor->computeInvariantOutput(&fInOut); 4956995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt SkDEBUGCODE(fInOut.validate()); 50b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (!fInOut.willUseInputColor()) { 51ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon fFirstEffectiveProcessorIndex = i; 52b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = false; 539513143efa734bef0c1a0c7f945022572dbc8518egdaniel // Reset these since we don't care if previous stages read these values 5456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt fReadsFragPosition = initWillReadFragmentPosition; 55b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 569513143efa734bef0c1a0c7f945022572dbc8518egdaniel if (processor->willReadFragmentPosition()) { 579513143efa734bef0c1a0c7f945022572dbc8518egdaniel fReadsFragPosition = true; 589513143efa734bef0c1a0c7f945022572dbc8518egdaniel } 59b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel if (kRGBA_GrColorComponentFlags == fInOut.validFlags()) { 60ac856c97acc84dcb54d9cdb068ec8a02b8869647bsalomon fFirstEffectiveProcessorIndex = i + 1; 61b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColor = fInOut.color(); 62b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInputColorIsUsed = true; 63b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel // Since we are clearing all previous color stages we are in a state where we have found 64b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel // zero stages that don't multiply the inputColor. 65b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel fInOut.resetNonMulStageFound(); 669513143efa734bef0c1a0c7f945022572dbc8518egdaniel // Reset these since we don't care if previous stages read these values 6756995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt fReadsFragPosition = initWillReadFragmentPosition; 68b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 69b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel } 70b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel} 71