/*
 * 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 "GrProcOptInfo.h"

#include "GrGeometryProcessor.h"
#include "GrFragmentStage.h"

void GrProcOptInfo::calcWithInitialValues(const GrFragmentStage* stages,
                                          int stageCount,
                                          GrColor startColor,
                                          GrColorComponentFlags flags,
                                          bool areCoverageStages,
                                          const GrGeometryProcessor* gp) {
    fInOut.reset(startColor, flags, areCoverageStages);
    fFirstEffectStageIndex = 0;
    fInputColorIsUsed = true;
    fInputColor = startColor;
    fRemoveVertexAttrib = false;
    fReadsDst = false;

    if (areCoverageStages && gp) {
        gp->computeInvariantOutput(&fInOut);
    }

    for (int i = 0; i < stageCount; ++i) {
        const GrFragmentProcessor* processor = stages[i].getProcessor();
        fInOut.resetWillUseInputColor();
        processor->computeInvariantOutput(&fInOut);
        #ifdef SK_DEBUG
        fInOut.validate();
        #endif
        if (!fInOut.willUseInputColor()) {
            fFirstEffectStageIndex = i;
            fInputColorIsUsed = false;
            fReadsDst = false; // Reset this since we don't care if previous stages read dst
        }
        if (processor->willReadDstColor()) {
            fReadsDst = true;
        }
        if (kRGBA_GrColorComponentFlags == fInOut.validFlags()) {
            fFirstEffectStageIndex = i + 1;
            fInputColor = fInOut.color();
            fInputColorIsUsed = true;
            fRemoveVertexAttrib = true;
            // Since we are clearing all previous color stages we are in a state where we have found
            // zero stages that don't multiply the inputColor.
            fInOut.resetNonMulStageFound();
            fReadsDst = false; // Reset this since we don't care if previous stages read dst
        }
    }
}
