Allow GrEffects with multiple textures.
It will work as long as the total number of textures sis less than GrDrawState::kNumStages. That will be fixed in a follow up CL.
Review URL: https://codereview.appspot.com/7040052
git-svn-id: http://skia.googlecode.com/svn/trunk@7023 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index 8239740..c00cf91 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -412,3 +412,39 @@
void GrGLShaderBuilder::finished(GrGLuint programID) {
fUniformManager.getUniformLocations(programID, fUniforms);
}
+
+GrGLEffect* GrGLShaderBuilder::createAndEmitGLEffect(
+ const GrEffectStage& stage,
+ GrGLEffect::EffectKey key,
+ const char* fsInColor,
+ const char* fsOutColor,
+ const char* vsInCoord,
+ SkTArray<GrGLUniformManager::UniformHandle, true>* samplerHandles) {
+ GrAssert(NULL != stage.getEffect());
+
+ const GrEffect& effect = *stage.getEffect();
+ int numTextures = effect.numTextures();
+ SkSTArray<8, GrGLShaderBuilder::TextureSampler> textureSamplers;
+ textureSamplers.push_back_n(numTextures);
+ for (int i = 0; i < numTextures; ++i) {
+ textureSamplers[i].init(this, &effect.textureAccess(i), i);
+ samplerHandles->push_back(textureSamplers[i].fSamplerUniform);
+ }
+
+ GrGLEffect* glEffect = effect.getFactory().createGLInstance(effect);
+
+ // Enclose custom code in a block to avoid namespace conflicts
+ this->fVSCode.appendf("\t{ // %s\n", glEffect->name());
+ this->fFSCode.appendf("\t{ // %s \n", glEffect->name());
+ glEffect->emitCode(this,
+ stage,
+ key,
+ vsInCoord,
+ fsOutColor,
+ fsInColor,
+ textureSamplers);
+ this->fVSCode.appendf("\t}\n");
+ this->fFSCode.appendf("\t}\n");
+
+ return glEffect;
+}