Add a requiresVertexShader method to GrGLEffect
Adds requiresVertexShader to GrGLEffect and updates the necessary
effects to override it and return true. Also reworks GrGLProgram
and GrGLShaderBuilder so the program creates all the GL effects
at the beginning, and determines if it needs a vertex shader before
creating the shader builder.
R=bsalomon@google.com
Author: cdalton@nvidia.com
Review URL: https://chromiumcodereview.appspot.com/23471008
git-svn-id: http://skia.googlecode.com/svn/trunk@11140 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
index 28f1b38..42df62a 100644
--- a/src/gpu/gl/GrGLShaderBuilder.h
+++ b/src/gpu/gl/GrGLShaderBuilder.h
@@ -107,7 +107,7 @@
GrGLShaderBuilder(const GrGLContextInfo&,
GrGLUniformManager&,
const GrGLProgramDesc&,
- bool needsVertexShader);
+ bool hasVertexShaderEffects);
/**
* Use of these features may require a GLSL extension to be enabled. Shaders may not compile
@@ -256,13 +256,13 @@
* glEffects array is updated to contain the GrGLEffect generated for each entry in
* effectStages.
*/
- void emitEffects(const GrEffectStage* effectStages[],
+ void emitEffects(GrGLEffect* const glEffects[],
+ const GrDrawEffect drawEffects[],
const GrBackendEffectFactory::EffectKey effectKeys[],
int effectCnt,
SkString* inOutFSColor,
GrSLConstantVec* fsInOutColorKnownValue,
- SkTArray<GrGLUniformManager::UniformHandle, true>* effectSamplerHandles[],
- GrGLEffect* glEffects[]);
+ SkTArray<GrGLUniformManager::UniformHandle, true>* effectSamplerHandles[]);
GrGLUniformManager::UniformHandle getRTHeightUniform() const { return fRTHeightUniform; }
GrGLUniformManager::UniformHandle getDstCopyTopLeftUniform() const {
@@ -388,16 +388,16 @@
private:
class CodeStage : GrNoncopyable {
public:
- CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {}
+ CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffect(NULL) {}
bool inStageCode() const {
this->validate();
- return NULL != fEffectStage;
+ return NULL != fEffect;
}
- const GrEffectStage* effectStage() const {
+ const GrEffectRef* effect() const {
this->validate();
- return fEffectStage;
+ return fEffect;
}
int stageIndex() const {
@@ -407,34 +407,34 @@
class AutoStageRestore : GrNoncopyable {
public:
- AutoStageRestore(CodeStage* codeStage, const GrEffectStage* newStage) {
+ AutoStageRestore(CodeStage* codeStage, const GrEffectRef* effect) {
SkASSERT(NULL != codeStage);
fSavedIndex = codeStage->fCurrentIndex;
- fSavedEffectStage = codeStage->fEffectStage;
+ fSavedEffect = codeStage->fEffect;
- if (NULL == newStage) {
+ if (NULL == effect) {
codeStage->fCurrentIndex = -1;
} else {
codeStage->fCurrentIndex = codeStage->fNextIndex++;
}
- codeStage->fEffectStage = newStage;
+ codeStage->fEffect = effect;
fCodeStage = codeStage;
}
~AutoStageRestore() {
fCodeStage->fCurrentIndex = fSavedIndex;
- fCodeStage->fEffectStage = fSavedEffectStage;
+ fCodeStage->fEffect = fSavedEffect;
}
private:
- CodeStage* fCodeStage;
- int fSavedIndex;
- const GrEffectStage* fSavedEffectStage;
+ CodeStage* fCodeStage;
+ int fSavedIndex;
+ const GrEffectRef* fSavedEffect;
};
private:
- void validate() const { SkASSERT((NULL == fEffectStage) == (-1 == fCurrentIndex)); }
- int fNextIndex;
- int fCurrentIndex;
- const GrEffectStage* fEffectStage;
+ void validate() const { SkASSERT((NULL == fEffect) == (-1 == fCurrentIndex)); }
+ int fNextIndex;
+ int fCurrentIndex;
+ const GrEffectRef* fEffect;
} fCodeStage;
/**