Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Unified Diff: src/gpu/gl/GrGLProgram.cpp

Issue 23471008: Add a requiresVertexShader method to GrGLEffect (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLProgram.cpp
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index ac9794d4d5d3f5994cfcb427ae3293c839ff5f3f..00185b8110858511c22b918ba7de903e5fce9434 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -446,10 +446,44 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
SkASSERT(0 == fProgramID);
const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
+ const bool hasExplicitLocalCoords = -1 != header.fLocalCoordAttributeIndex;
- bool needsVertexShader = true;
+ // Get the coeffs for the Mode-based color filter, determine if color is needed.
+ SkXfermode::Coeff colorCoeff;
+ SkXfermode::Coeff filterColorCoeff;
+ SkAssertResult(
+ SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilterXfermode),
+ &filterColorCoeff,
+ &colorCoeff));
+ bool needColor, needFilterColor;
+ need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor);
- GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, needsVertexShader);
+ // Create the GL effects.
+ bool requiresVertexShader = true;
+
+ SkTArray<GrDrawEffect> colorDrawEffects(needColor ? fDesc.numColorEffects() : 0);
bsalomon 2013/09/06 14:10:03 A couple small style things.. we try to wrap at 10
Chris Dalton 2013/09/06 17:17:24 Will do.
+ if (needColor) {
+ for (int e = 0; e < fDesc.numColorEffects(); ++e) {
+ SkASSERT(NULL != colorStages[e] && NULL != colorStages[e]->getEffect());
+ SkNEW_APPEND_TO_TARRAY(&colorDrawEffects, GrDrawEffect, (*colorStages[e], hasExplicitLocalCoords));
+ fColorEffects[e].fGLEffect =
+ (*colorStages[e]->getEffect())->getFactory().createGLInstance(colorDrawEffects[e]);
+ requiresVertexShader = requiresVertexShader
+ || fColorEffects[e].fGLEffect->requiresVertexShader(colorDrawEffects[e]);
+ }
+ }
+
+ SkTArray<GrDrawEffect> coverageDrawEffects(fDesc.numCoverageEffects());
+ for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
+ SkASSERT(NULL != coverageStages[e] && NULL != coverageStages[e]->getEffect());
+ SkNEW_APPEND_TO_TARRAY(&coverageDrawEffects, GrDrawEffect, (*coverageStages[e], hasExplicitLocalCoords));
+ fCoverageEffects[e].fGLEffect =
+ (*coverageStages[e]->getEffect())->getFactory().createGLInstance(coverageDrawEffects[e]);
+ requiresVertexShader = requiresVertexShader
+ || fCoverageEffects[e].fGLEffect->requiresVertexShader(coverageDrawEffects[e]);;
+ }
+
+ GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, requiresVertexShader);
if (GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder.getVertexBuilder()) {
const char* viewMName;
@@ -486,16 +520,6 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
SkString inColor;
GrSLConstantVec knownColorValue = this->genInputColor(&builder, &inColor);
- // Get the coeffs for the Mode-based color filter, determine if color is needed.
- SkXfermode::Coeff colorCoeff;
- SkXfermode::Coeff filterColorCoeff;
- SkAssertResult(
- SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilterXfermode),
- &filterColorCoeff,
- &colorCoeff));
- bool needColor, needFilterColor;
- need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor);
-
// used in order for builder to return the per-stage uniform handles.
typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr;
int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverageEffects());
@@ -504,20 +528,17 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
if (needColor) {
for (int e = 0; e < fDesc.numColorEffects(); ++e) {
+ glEffects[e] = fColorEffects[e].fGLEffect;
effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis;
}
- builder.emitEffects(colorStages,
+ builder.emitEffects(glEffects.get(),
+ colorDrawEffects.begin(),
fDesc.effectKeys(),
fDesc.numColorEffects(),
&inColor,
&knownColorValue,
- effectUniformArrays.get(),
- glEffects.get());
-
- for (int e = 0; e < fDesc.numColorEffects(); ++e) {
- fColorEffects[e].fGLEffect = glEffects[e];
- }
+ effectUniformArrays.get());
}
// Insert the color filter. This will soon be replaced by a color effect.
@@ -548,19 +569,17 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCoverage);
for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
+ glEffects[e] = fCoverageEffects[e].fGLEffect;
effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis;
}
- builder.emitEffects(coverageStages,
+ builder.emitEffects(glEffects.get(),
+ coverageDrawEffects.begin(),
fDesc.getEffectKeys() + fDesc.numColorEffects(),
fDesc.numCoverageEffects(),
&inCoverage,
&knownCoverageValue,
- effectUniformArrays.get(),
- glEffects.get());
- for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
- fCoverageEffects[e].fGLEffect = glEffects[e];
- }
+ effectUniformArrays.get());
// discard if coverage is zero
if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) {

Powered by Google App Engine
This is Rietveld 408576698