18072caa80384292858d31ae34b7e19768875866bjoshualitt/*
28072caa80384292858d31ae34b7e19768875866bjoshualitt * Copyright 2014 Google Inc.
38072caa80384292858d31ae34b7e19768875866bjoshualitt *
48072caa80384292858d31ae34b7e19768875866bjoshualitt * Use of this source code is governed by a BSD-style license that can be
58072caa80384292858d31ae34b7e19768875866bjoshualitt * found in the LICENSE file.
68072caa80384292858d31ae34b7e19768875866bjoshualitt */
78072caa80384292858d31ae34b7e19768875866bjoshualitt
88072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrGLPrimitiveProcessor.h"
98072caa80384292858d31ae34b7e19768875866bjoshualitt
108072caa80384292858d31ae34b7e19768875866bjoshualitt#include "builders/GrGLProgramBuilder.h"
118072caa80384292858d31ae34b7e19768875866bjoshualitt
128072caa80384292858d31ae34b7e19768875866bjoshualittSkMatrix GrGLPrimitiveProcessor::GetTransformMatrix(const SkMatrix& localMatrix,
138072caa80384292858d31ae34b7e19768875866bjoshualitt                                                    const GrCoordTransform& coordTransform) {
148072caa80384292858d31ae34b7e19768875866bjoshualitt    SkMatrix combined;
158072caa80384292858d31ae34b7e19768875866bjoshualitt    // We only apply the localmatrix to localcoords
168072caa80384292858d31ae34b7e19768875866bjoshualitt    if (kLocal_GrCoordSet == coordTransform.sourceCoords()) {
178072caa80384292858d31ae34b7e19768875866bjoshualitt        combined.setConcat(coordTransform.getMatrix(), localMatrix);
188072caa80384292858d31ae34b7e19768875866bjoshualitt    } else {
198072caa80384292858d31ae34b7e19768875866bjoshualitt        combined = coordTransform.getMatrix();
208072caa80384292858d31ae34b7e19768875866bjoshualitt    }
218072caa80384292858d31ae34b7e19768875866bjoshualitt    if (coordTransform.reverseY()) {
228072caa80384292858d31ae34b7e19768875866bjoshualitt        // combined.postScale(1,-1);
238072caa80384292858d31ae34b7e19768875866bjoshualitt        // combined.postTranslate(0,1);
248072caa80384292858d31ae34b7e19768875866bjoshualitt        combined.set(SkMatrix::kMSkewY,
258072caa80384292858d31ae34b7e19768875866bjoshualitt            combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]);
268072caa80384292858d31ae34b7e19768875866bjoshualitt        combined.set(SkMatrix::kMScaleY,
278072caa80384292858d31ae34b7e19768875866bjoshualitt            combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]);
288072caa80384292858d31ae34b7e19768875866bjoshualitt        combined.set(SkMatrix::kMTransY,
298072caa80384292858d31ae34b7e19768875866bjoshualitt            combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]);
308072caa80384292858d31ae34b7e19768875866bjoshualitt    }
318072caa80384292858d31ae34b7e19768875866bjoshualitt    return combined;
328072caa80384292858d31ae34b7e19768875866bjoshualitt}
338072caa80384292858d31ae34b7e19768875866bjoshualitt
348072caa80384292858d31ae34b7e19768875866bjoshualittvoid
358072caa80384292858d31ae34b7e19768875866bjoshualittGrGLPrimitiveProcessor::setupColorPassThrough(GrGLGPBuilder* pb,
368072caa80384292858d31ae34b7e19768875866bjoshualitt                                              GrGPInput inputType,
378072caa80384292858d31ae34b7e19768875866bjoshualitt                                              const char* outputName,
388072caa80384292858d31ae34b7e19768875866bjoshualitt                                              const GrGeometryProcessor::Attribute* colorAttr,
398072caa80384292858d31ae34b7e19768875866bjoshualitt                                              UniformHandle* colorUniform) {
4029bee0fe657fabf7c396502b69c9167fba13eaaaegdaniel    GrGLFragmentBuilder* fs = pb->getFragmentShaderBuilder();
418072caa80384292858d31ae34b7e19768875866bjoshualitt    if (kUniform_GrGPInput == inputType) {
428072caa80384292858d31ae34b7e19768875866bjoshualitt        SkASSERT(colorUniform);
438072caa80384292858d31ae34b7e19768875866bjoshualitt        const char* stagedLocalVarName;
448072caa80384292858d31ae34b7e19768875866bjoshualitt        *colorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
458072caa80384292858d31ae34b7e19768875866bjoshualitt                                       kVec4f_GrSLType,
468072caa80384292858d31ae34b7e19768875866bjoshualitt                                       kDefault_GrSLPrecision,
478072caa80384292858d31ae34b7e19768875866bjoshualitt                                       "Color",
488072caa80384292858d31ae34b7e19768875866bjoshualitt                                       &stagedLocalVarName);
498072caa80384292858d31ae34b7e19768875866bjoshualitt        fs->codeAppendf("%s = %s;", outputName, stagedLocalVarName);
508072caa80384292858d31ae34b7e19768875866bjoshualitt    } else if (kAttribute_GrGPInput == inputType) {
518072caa80384292858d31ae34b7e19768875866bjoshualitt        SkASSERT(colorAttr);
528072caa80384292858d31ae34b7e19768875866bjoshualitt        pb->addPassThroughAttribute(colorAttr, outputName);
538072caa80384292858d31ae34b7e19768875866bjoshualitt    } else if (kAllOnes_GrGPInput == inputType) {
548072caa80384292858d31ae34b7e19768875866bjoshualitt        fs->codeAppendf("%s = vec4(1);", outputName);
558072caa80384292858d31ae34b7e19768875866bjoshualitt    }
568072caa80384292858d31ae34b7e19768875866bjoshualitt}
578072caa80384292858d31ae34b7e19768875866bjoshualitt
588072caa80384292858d31ae34b7e19768875866bjoshualittvoid GrGLPrimitiveProcessor::addUniformViewMatrix(GrGLGPBuilder* pb) {
598072caa80384292858d31ae34b7e19768875866bjoshualitt    fViewMatrixUniform = pb->addUniform(GrGLProgramBuilder::kVertex_Visibility,
60c375b0b5c5c03d381111bf7bff12507d5ed24769senorblanco                                        kMat33f_GrSLType, kHigh_GrSLPrecision,
618072caa80384292858d31ae34b7e19768875866bjoshualitt                                        "uViewM",
628072caa80384292858d31ae34b7e19768875866bjoshualitt                                        &fViewMatrixName);
638072caa80384292858d31ae34b7e19768875866bjoshualitt}
648072caa80384292858d31ae34b7e19768875866bjoshualitt
658072caa80384292858d31ae34b7e19768875866bjoshualittvoid GrGLPrimitiveProcessor::setUniformViewMatrix(const GrGLProgramDataManager& pdman,
668072caa80384292858d31ae34b7e19768875866bjoshualitt                                                  const SkMatrix& viewMatrix) {
67dd2198701b0ec9da61ecf73418cad03642d715e7joshualitt    if (!viewMatrix.isIdentity() && !fViewMatrix.cheapEqualTo(viewMatrix)) {
688072caa80384292858d31ae34b7e19768875866bjoshualitt        SkASSERT(fViewMatrixUniform.isValid());
698072caa80384292858d31ae34b7e19768875866bjoshualitt        fViewMatrix = viewMatrix;
708072caa80384292858d31ae34b7e19768875866bjoshualitt
718072caa80384292858d31ae34b7e19768875866bjoshualitt        GrGLfloat viewMatrix[3 * 3];
728072caa80384292858d31ae34b7e19768875866bjoshualitt        GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
738072caa80384292858d31ae34b7e19768875866bjoshualitt        pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
748072caa80384292858d31ae34b7e19768875866bjoshualitt    }
758072caa80384292858d31ae34b7e19768875866bjoshualitt}
76