Index: src/gpu/gl/builders/GrGLSkiaProgramBuilder.cpp |
diff --git a/src/gpu/gl/builders/GrGLSkiaProgramBuilder.cpp b/src/gpu/gl/builders/GrGLSkiaProgramBuilder.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..262af30921cfe421778947f11c85afa447890490 |
--- /dev/null |
+++ b/src/gpu/gl/builders/GrGLSkiaProgramBuilder.cpp |
@@ -0,0 +1,76 @@ |
+/* |
+ * 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 "GrGLSkiaProgramBuilder.h" |
+#include "../GrGLProgram.h" |
+ |
+GrGLSkiaProgramBuilder::GrGLSkiaProgramBuilder(GrGpuGL* gpu, |
+ const GrGLProgramDesc& desc) |
+ : INHERITED(gpu, desc) { |
+} |
+ |
+void GrGLSkiaProgramBuilder::emitTransforms(const GrProcessorStage& effectStage, |
+ GrGLProcessor::TransformedCoordsArray* outCoords, |
+ GrGLInstalledProcessors* installedProcessors) { |
+ SkTArray<GrGLInstalledProcessors::Transform, true>& transforms = |
+ installedProcessors->addTransforms(); |
+ const GrProcessor* effect = effectStage.getProcessor(); |
+ int numTransforms = effect->numTransforms(); |
+ transforms.push_back_n(numTransforms); |
+ |
+ for (int t = 0; t < numTransforms; t++) { |
+ const char* uniName = "StageMatrix"; |
+ GrSLType varyingType = |
+ effectStage.isPerspectiveCoordTransform(t, fVS.hasExplicitLocalCoords()) ? |
+ kVec3f_GrSLType : |
+ kVec2f_GrSLType; |
+ |
+ SkString suffixedUniName; |
+ if (0 != t) { |
+ suffixedUniName.append(uniName); |
+ suffixedUniName.appendf("_%i", t); |
+ uniName = suffixedUniName.c_str(); |
+ } |
+ transforms[t].fHandle = this->addUniform(GrGLProgramBuilder::kVertex_Visibility, |
+ kMat33f_GrSLType, |
+ uniName, |
+ &uniName).toShaderBuilderIndex(); |
+ |
+ const char* varyingName = "MatrixCoord"; |
+ SkString suffixedVaryingName; |
+ if (0 != t) { |
+ suffixedVaryingName.append(varyingName); |
+ suffixedVaryingName.appendf("_%i", t); |
+ varyingName = suffixedVaryingName.c_str(); |
+ } |
+ const char* vsVaryingName; |
+ const char* fsVaryingName; |
+ this->addVarying(varyingType, varyingName, &vsVaryingName, &fsVaryingName); |
+ |
+ const GrGLShaderVar& coords = |
+ kPosition_GrCoordSet == effect->coordTransform(t).sourceCoords() ? |
+ fVS.positionAttribute() : |
+ fVS.localCoordsAttribute(); |
+ |
+ // varying = matrix * coords (logically) |
+ SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType); |
+ if (kVec2f_GrSLType == varyingType) { |
+ fVS.codeAppendf("%s = (%s * vec3(%s, 1)).xy;", |
+ vsVaryingName, uniName, coords.c_str()); |
+ } else { |
+ fVS.codeAppendf("%s = %s * vec3(%s, 1);", |
+ vsVaryingName, uniName, coords.c_str()); |
+ } |
+ SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords, |
+ (SkString(fsVaryingName), varyingType)); |
+ } |
+} |
+ |
+GrGLProgram* GrGLSkiaProgramBuilder::createProgram(GrGLuint programID) { |
+ return SkNEW_ARGS(GrGLSkiaProgram, (fGpu, fDesc, fUniformHandles, programID, fUniforms, |
+ fGeometryProcessor, fColorEffects, fCoverageEffects)); |
+} |