/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gl/GrGLVaryingHandler.h"

#include "gl/GrGLGpu.h"
#include "gl/builders/GrGLProgramBuilder.h"


GrGLSLVaryingHandler::VaryingHandle GrGLVaryingHandler::addPathProcessingVarying(
                                                                       const char* name,
                                                                       GrGLSLVarying* v) {
#ifdef SK_DEBUG
    GrGLProgramBuilder* glPB = (GrGLProgramBuilder*) fProgramBuilder;
    // This call is not used for non-NVPR backends.
    SkASSERT(glPB->gpu()->glCaps().shaderCaps()->pathRenderingSupport() &&
             glPB->fPrimProc.isPathRendering() &&
             !glPB->fPrimProc.willUseGeoShader() &&
             glPB->fPrimProc.numAttribs() == 0);
#endif
    this->addVarying(name, v);
    auto varyingInfo = fPathProcVaryingInfos.push_back();
    varyingInfo.fLocation = fPathProcVaryingInfos.count() - 1;
    return VaryingHandle(varyingInfo.fLocation);
}

void GrGLVaryingHandler::onFinalize() {
    SkASSERT(fPathProcVaryingInfos.empty() || fPathProcVaryingInfos.count() == fFragInputs.count());
    for (int i = 0; i < fPathProcVaryingInfos.count(); ++i) {
        fPathProcVaryingInfos[i].fVariable = fFragInputs[i];
    }
}
