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