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