| Index: src/gpu/gl/GrGLShaderBuilder.h
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
|
| index 9021a0dee10474e88e57e8c4067d090dd08be017..765a2edf8dbdbbe312e364136274ddcad332fe6d 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.h
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.h
|
| @@ -71,7 +71,7 @@ public:
|
|
|
| GrAssert(NULL != builder);
|
| SkString name;
|
| - name.printf("Sampler%d_", idx);
|
| + name.printf("Sampler%d", idx);
|
| fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| kSampler2D_GrSLType,
|
| name.c_str());
|
| @@ -275,16 +275,24 @@ public:
|
| /** Called after building is complete to get the final shader string. */
|
| void getShader(ShaderType, SkString*) const;
|
|
|
| - void setCurrentStage(int stageIdx) { fCurrentStageIdx = stageIdx; }
|
| - void setNonStage() { fCurrentStageIdx = kNonStageIdx; }
|
| - // TODO: move remainder of shader code generation to this class and call this privately
|
| - // Handles of sampler uniforms generated for the effect are appended to samplerHandles.
|
| - GrGLEffect* createAndEmitGLEffect(
|
| - const GrEffectStage& stage,
|
| - GrBackendEffectFactory::EffectKey key,
|
| - const char* fsInColor, // NULL means no incoming color
|
| - const char* fsOutColor,
|
| - SkTArray<GrGLUniformManager::UniformHandle, true>* samplerHandles);
|
| + /**
|
| + * Adds code for effects. effectStages contains the effects to add. effectKeys[i] is the key
|
| + * generated from effectStages[i]. An entry in effectStages can be NULL, in which case it is
|
| + * skipped. Moreover, if the corresponding key is GrGLEffect::NoEffectKey then it is skipped.
|
| + * inOutFSColor specifies the input color to the first stage and is updated to be the
|
| + * output color of the last stage. fsInOutColorKnownValue specifies whether the input color
|
| + * has a known constant value and is updated to refer to the status of the output color.
|
| + * The handles to texture samplers for effectStage[i] are added to effectSamplerHandles[i]. The
|
| + * glEffects array is updated to contain the GrGLEffect generated for each entry in
|
| + * effectStages.
|
| + */
|
| + void emitEffects(const GrEffectStage* effectStages[],
|
| + const GrBackendEffectFactory::EffectKey effectKeys[],
|
| + int effectCnt,
|
| + SkString* inOutFSColor,
|
| + GrSLConstantVec* fsInOutColorKnownValue,
|
| + SkTArray<GrGLUniformManager::UniformHandle, true>* effectSamplerHandles[],
|
| + GrGLEffect* glEffects[]);
|
|
|
| GrGLUniformManager::UniformHandle getRTHeightUniform() const { return fRTHeightUniform; }
|
| GrGLUniformManager::UniformHandle getDstCopyTopLeftUniform() const {
|
| @@ -338,9 +346,56 @@ public:
|
| VarArray fFSOutputs;
|
|
|
| private:
|
| - enum {
|
| - kNonStageIdx = -1,
|
| - };
|
| + class CodeStage : GrNoncopyable {
|
| + public:
|
| + CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {}
|
| +
|
| + bool inStageCode() const {
|
| + this->validate();
|
| + return NULL != fEffectStage;
|
| + }
|
| +
|
| + const GrEffectStage* effectStage() const {
|
| + this->validate();
|
| + return fEffectStage;
|
| + }
|
| +
|
| + int stageIndex() const {
|
| + this->validate();
|
| + return fCurrentIndex;
|
| + }
|
| +
|
| + class AutoStageRestore : GrNoncopyable {
|
| + public:
|
| + AutoStageRestore(CodeStage* codeStage, const GrEffectStage* newStage) {
|
| + GrAssert(NULL != codeStage);
|
| + fSavedIndex = codeStage->fCurrentIndex;
|
| + fSavedEffectStage = codeStage->fEffectStage;
|
| +
|
| + if (NULL == newStage) {
|
| + codeStage->fCurrentIndex = -1;
|
| + } else {
|
| + codeStage->fCurrentIndex = codeStage->fNextIndex++;
|
| + }
|
| + codeStage->fEffectStage = newStage;
|
| +
|
| + fCodeStage = codeStage;
|
| + }
|
| + ~AutoStageRestore() {
|
| + fCodeStage->fCurrentIndex = fSavedIndex;
|
| + fCodeStage->fEffectStage = fSavedEffectStage;
|
| + }
|
| + private:
|
| + CodeStage* fCodeStage;
|
| + int fSavedIndex;
|
| + const GrEffectStage* fSavedEffectStage;
|
| + };
|
| + private:
|
| + void validate() const { GrAssert((NULL == fEffectStage) == (-1 == fCurrentIndex)); }
|
| + int fNextIndex;
|
| + int fCurrentIndex;
|
| + const GrEffectStage* fEffectStage;
|
| + } fCodeStage;
|
|
|
| /**
|
| * Features that should only be enabled by GrGLShaderBuilder itself.
|
| @@ -356,6 +411,11 @@ private:
|
| // the enables separately for each shader.
|
| void addFSFeature(uint32_t featureBit, const char* extensionName);
|
|
|
| + // Generates a name for a variable. The generated string will be name prefixed by the prefix
|
| + // char (unless the prefix is '\0'). It also mangles the name to be stage-specific if we're
|
| + // generating stage code.
|
| + void nameVariable(SkString* out, char prefix, const char* name);
|
| +
|
| // Interpretation of DstReadKey when generating code
|
| enum {
|
| kNoDstRead_DstReadKey = 0,
|
| @@ -366,7 +426,6 @@ private:
|
|
|
| const GrGLContextInfo& fCtxInfo;
|
| GrGLUniformManager& fUniformManager;
|
| - int fCurrentStageIdx;
|
| uint32_t fFSFeaturesAddedMask;
|
| SkString fFSFunctions;
|
| SkString fFSExtensions;
|
|
|