Index: src/gpu/gl/builders/GrGLNvprProgramBuilder.cpp |
diff --git a/src/gpu/gl/builders/GrGLNvprProgramBuilder.cpp b/src/gpu/gl/builders/GrGLNvprProgramBuilder.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e5eae9d884cd8014cc0406946c1b37d0e20bfb31 |
--- /dev/null |
+++ b/src/gpu/gl/builders/GrGLNvprProgramBuilder.cpp |
@@ -0,0 +1,84 @@ |
+/* |
+ * 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 "GrGLNvprProgramBuilder.h" |
+#include "../GrGpuGL.h" |
+ |
+#define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) |
+#define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) |
+ |
+GrGLNvprProgramBuilder::GrGLNvprProgramBuilder(GrGpuGL* gpu, |
+ const GrOptDrawState& optState, |
+ const GrGLProgramDesc& desc) |
+ : INHERITED(gpu, optState, desc) |
+ , fSeparableVaryingInfos(kVarsPerBlock) { |
+} |
+ |
+void GrGLNvprProgramBuilder::emitTransforms(const GrProcessorStage& processorStage, |
+ GrGLProcessor::TransformedCoordsArray* outCoords, |
+ GrGLInstalledProcessors* installedProcessors) { |
+ const GrProcessor* effect = processorStage.getProcessor(); |
+ int numTransforms = effect->numTransforms(); |
+ |
+ SkTArray<GrGLInstalledProcessors::Transform, true>& transforms = |
+ installedProcessors->addTransforms(); |
+ transforms.push_back_n(numTransforms); |
+ |
+ for (int t = 0; t < numTransforms; t++) { |
+ GrSLType varyingType = |
+ processorStage.isPerspectiveCoordTransform(t, false) ? |
+ kVec3f_GrSLType : |
+ kVec2f_GrSLType; |
+ |
+ 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; |
+ transforms[t].fHandle = this->addSeparableVarying(varyingType, varyingName, |
+ &vsVaryingName, &fsVaryingName); |
+ transforms[t].fType = varyingType; |
+ |
+ SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords, |
+ (SkString(fsVaryingName), varyingType)); |
+ } |
+} |
+ |
+GrGLInstalledProcessors::ShaderVarHandle |
+GrGLNvprProgramBuilder::addSeparableVarying(GrSLType type, |
+ const char* name, |
+ const char** vsOutName, |
+ const char** fsInName) { |
+ addVarying(type, name, vsOutName, fsInName); |
+ SeparableVaryingInfo& varying = fSeparableVaryingInfos.push_back(); |
+ varying.fVariable = fFS.fInputs.back(); |
+ return GrGLInstalledProcessors::ShaderVarHandle(fSeparableVaryingInfos.count() - 1); |
+} |
+ |
+void GrGLNvprProgramBuilder::resolveSeparableVaryings(GrGLuint programId) { |
+ int count = fSeparableVaryingInfos.count(); |
+ for (int i = 0; i < count; ++i) { |
+ GrGLint location; |
+ GL_CALL_RET(location, |
+ GetProgramResourceLocation(programId, |
+ GR_GL_FRAGMENT_INPUT, |
+ fSeparableVaryingInfos[i].fVariable.c_str())); |
+ fSeparableVaryingInfos[i].fLocation = location; |
+ } |
+} |
+ |
+GrGLProgram* GrGLNvprProgramBuilder::createProgram(GrGLuint programID) { |
+ // this is just for nvpr es, which has separable varyings that are plugged in after |
+ // building |
+ this->resolveSeparableVaryings(programID); |
+ return SkNEW_ARGS(GrGLNvprProgram, (fGpu, fDesc, fUniformHandles, programID, fUniforms, |
+ fColorEffects, fCoverageEffects, fSeparableVaryingInfos)); |
+} |