Index: src/gpu/gl/GrGLPrimitiveProcessor.cpp |
diff --git a/src/gpu/gl/GrGLPrimitiveProcessor.cpp b/src/gpu/gl/GrGLPrimitiveProcessor.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..335dc4fe5f973ea25d42771e5fb75aefed2402f2 |
--- /dev/null |
+++ b/src/gpu/gl/GrGLPrimitiveProcessor.cpp |
@@ -0,0 +1,75 @@ |
+/* |
+ * 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 "GrGLPrimitiveProcessor.h" |
+ |
+#include "builders/GrGLProgramBuilder.h" |
+ |
+SkMatrix GrGLPrimitiveProcessor::GetTransformMatrix(const SkMatrix& localMatrix, |
+ const GrCoordTransform& coordTransform) { |
+ SkMatrix combined; |
+ // We only apply the localmatrix to localcoords |
+ if (kLocal_GrCoordSet == coordTransform.sourceCoords()) { |
+ combined.setConcat(coordTransform.getMatrix(), localMatrix); |
+ } else { |
+ combined = coordTransform.getMatrix(); |
+ } |
+ if (coordTransform.reverseY()) { |
+ // combined.postScale(1,-1); |
+ // combined.postTranslate(0,1); |
+ combined.set(SkMatrix::kMSkewY, |
+ combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]); |
+ combined.set(SkMatrix::kMScaleY, |
+ combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]); |
+ combined.set(SkMatrix::kMTransY, |
+ combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]); |
+ } |
+ return combined; |
+} |
+ |
+void |
+GrGLPrimitiveProcessor::setupColorPassThrough(GrGLGPBuilder* pb, |
+ GrGPInput inputType, |
+ const char* outputName, |
+ const GrGeometryProcessor::Attribute* colorAttr, |
+ UniformHandle* colorUniform) { |
+ GrGLGPFragmentBuilder* fs = pb->getFragmentShaderBuilder(); |
+ if (kUniform_GrGPInput == inputType) { |
+ SkASSERT(colorUniform); |
+ const char* stagedLocalVarName; |
+ *colorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ kVec4f_GrSLType, |
+ kDefault_GrSLPrecision, |
+ "Color", |
+ &stagedLocalVarName); |
+ fs->codeAppendf("%s = %s;", outputName, stagedLocalVarName); |
+ } else if (kAttribute_GrGPInput == inputType) { |
+ SkASSERT(colorAttr); |
+ pb->addPassThroughAttribute(colorAttr, outputName); |
+ } else if (kAllOnes_GrGPInput == inputType) { |
+ fs->codeAppendf("%s = vec4(1);", outputName); |
+ } |
+} |
+ |
+void GrGLPrimitiveProcessor::addUniformViewMatrix(GrGLGPBuilder* pb) { |
+ fViewMatrixUniform = pb->addUniform(GrGLProgramBuilder::kVertex_Visibility, |
+ kMat33f_GrSLType, kDefault_GrSLPrecision, |
+ "uViewM", |
+ &fViewMatrixName); |
+} |
+ |
+void GrGLPrimitiveProcessor::setUniformViewMatrix(const GrGLProgramDataManager& pdman, |
+ const SkMatrix& viewMatrix) { |
+ if (!fViewMatrix.cheapEqualTo(viewMatrix)) { |
+ SkASSERT(fViewMatrixUniform.isValid()); |
+ fViewMatrix = viewMatrix; |
+ |
+ GrGLfloat viewMatrix[3 * 3]; |
+ GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
+ pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
+ } |
+} |