this->initClassID<DCFP>();
}
- void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {}
-
GrGLFragmentProcessor* createGLInstance() const override {
class DCGLFP : public GrGLFragmentProcessor {
void emitCode(EmitArgs& args) override {
}
private:
+ void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {}
+
bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
GrCoordTransform fDeviceTransform;
: INHERITED()
, fUsesLocalCoords(false) {}
- /** Implemented using GLFragmentProcessor::GenKey as described in this class's comment. */
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const = 0;
-
/** Returns a new instance of the appropriate *GL* implementation class
for the given GrFragmentProcessor; caller is responsible for deleting
the object. */
in generated shader code. */
virtual const char* name() const = 0;
+ void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+ this->onGetGLProcessorKey(caps, b);
+ for (int i = 0; i < fChildProcessors.count(); ++i) {
+ fChildProcessors[i]->getGLProcessorKey(caps, b);
+ }
+ }
+
int numTransforms() const { return fCoordTransforms.count(); }
+ int numTransformsIncludeChildProcs() const {
+ int numTransforms = fCoordTransforms.count();
+ for (int i = 0; i < fChildProcessors.count(); ++i) {
+ numTransforms += fChildProcessors[i]->numTransformsIncludeChildProcs();
+ }
+ return numTransforms;
+ }
+
/** Returns the coordinate transformation at index. index must be valid according to
numTransforms(). */
const GrCoordTransform& coordTransform(int index) const { return *fCoordTransforms[index]; }
return fCoordTransforms;
}
+ int numChildProcessors() const { return fChildProcessors.count(); }
+
+ GrFragmentProcessor* childProcessor(int index) const { return fChildProcessors[index]; }
+
+ const SkTArray<GrFragmentProcessor*, false>& childProcessors() const {
+ return fChildProcessors;
+ }
+
+ int numTexturesIncludeChildProcs() const {
+ int numTextures = this->numTextures();
+ for (int i = 0; i < fChildProcessors.count(); ++i) {
+ numTextures += fChildProcessors[i]->numTexturesIncludeChildProcs();
+ }
+ return numTextures;
+ }
+
/** Do any of the coordtransforms for this processor require local coords? */
bool usesLocalCoords() const { return fUsesLocalCoords; }
void addCoordTransform(const GrCoordTransform*);
/**
+ * FragmentProcessor subclasses call this to register any child FragmentProcessors they have.
+ * This is for processors whose shader code will be composed of nested processors whose output
+ * colors will be combined somehow to produce its output color. Registering these child
+ * processors will allow the ProgramBuilder to automatically add their transformed coords and
+ * texture accesses and mangle their uniform and output color names and
+ */
+ void registerChildProcessor(GrFragmentProcessor* child);
+
+ /**
* Subclass implements this to support getConstantColorComponents(...).
*/
virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const = 0;
private:
+ /** Implemented using GLFragmentProcessor::GenKey as described in this class's comment. */
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const = 0;
+
/**
* Subclass implements this to support isEqual(). It will only be called if it is known that
* the two processors are of the same subclass (i.e. they return the same object from
SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms;
bool fUsesLocalCoords;
+ SkTArray<GrFragmentProcessor*, false> fChildProcessors;
typedef GrProcessor INHERITED;
};
const char* name() const override { return "Color"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
GrColor color() const { return fColor; }
this->initClassID<GrConstColorProcessor>();
}
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
float innerThreshold() const { return fInnerThreshold; }
float outerThreshold() const { return fOuterThreshold; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
this->addTextureAccess(&fMaskTextureAccess);
}
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
///////////////////////////////////////////////////////////////////////////////
-void AlphaThresholdEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void AlphaThresholdEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLAlphaThresholdEffect::GenKey(*this, caps, b);
}
this->addTextureAccess(&fBackgroundAccess);
}
-void GrArithmeticFP::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void GrArithmeticFP::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GLArithmeticFP::GenKey(*this, caps, b);
}
const char* name() const override { return "Arithmetic"; }
- void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
float k1() const { return fK1; }
bool enforcePMColor() const { return fEnforcePMColor; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
const char* name() const override { return "RectBlur"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
/**
private:
GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile);
+
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
GrRectBlurEffect::~GrRectBlurEffect() {
}
-void GrRectBlurEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLRectBlurEffect::GenKey(*this, caps, b);
}
const SkRRect& getRRect() const { return fRRect; }
float getSigma() const { return fSigma; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture);
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
pdman.set1f(fCornerRadiusUniform, radius);
}
-void GrRRectBlurEffect::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void GrRRectBlurEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GrGLRRectBlurEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "ColorCube"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
int colorCubeSize() const { return fColorCubeAccess.getTexture()->width(); }
};
private:
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
GrColorCubeEffect(GrTexture* colorCube);
GrColorCubeEffect::~GrColorCubeEffect() {
}
-void GrColorCubeEffect::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void GrColorCubeEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GLProcessor::GenKey(*this, caps, b);
}
return true;
}
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GLProcessor::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GLProcessor, (*this));
}
this->initClassID<ModeColorFilterEffect>();
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GLProcessor::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor& other) const override {
const ModeColorFilterEffect& s = other.cast<ModeColorFilterEffect>();
return fMode == s.fMode && fColor == s.fColor;
const char* name() const override { return "Color Matrix"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GLProcessor::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GLProcessor, (*this));
}
this->initClassID<ColorMatrixEffect>();
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GLProcessor::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor& s) const override {
const ColorMatrixEffect& cme = s.cast<ColorMatrixEffect>();
return cme.fMatrix == fMatrix;
virtual ~GrDisplacementMapEffect();
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GrGLDisplacementMapEffect::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GrGLDisplacementMapEffect, (*this));
}
const GrTextureDomain& domain() const { return fDomain; }
private:
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GrGLDisplacementMapEffect::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
const char* name() const override { return "DiffuseLighting"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
SkScalar kd() const { return fKD; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
GrDiffuseLightingEffect(GrProcessorDataManager*,
const char* name() const override { return "SpecularLighting"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
SkScalar ks() const { return fKS; }
SkScalar shininess() const { return fShininess; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
GrSpecularLightingEffect(GrProcessorDataManager*,
this->kd() == s.kd();
}
-void GrDiffuseLightingEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrDiffuseLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLDiffuseLightingEffect::GenKey(*this, caps, b);
}
this->shininess() == s.shininess();
}
-void GrSpecularLightingEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrSpecularLightingEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLSpecularLightingEffect::GenKey(*this, caps, b);
}
GrGLFragmentProcessor* createGLInstance() const override { return SkNEW(LightingGLFP); }
- void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
+ void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
LightingGLFP::GenKey(*this, caps, b);
}
const char* name() const override { return "Luminance-to-Alpha"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GLProcessor::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GLProcessor, (*this));
}
this->initClassID<LumaColorFilterEffect>();
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GLProcessor::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
const char* name() const override { return "Magnifier"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const SkRect& bounds() const { return fBounds; } // Bounds of source image.
this->initClassID<GrMagnifierEffect>();
}
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
/////////////////////////////////////////////////////////////////////
-void GrMagnifierEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrMagnifierEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLMagnifierEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Morphology"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
protected:
float fRange[2];
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
GrMorphologyEffect::~GrMorphologyEffect() {
}
-void GrMorphologyEffect::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void GrMorphologyEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GrGLMorphologyEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "PerlinNoise"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GrGLPerlinNoise::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GrGLPerlinNoise, (*this));
}
uint8_t alpha() const { return fAlpha; }
private:
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GrGLPerlinNoise::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const GrPerlinNoiseEffect& s = sBase.cast<GrPerlinNoiseEffect>();
return fType == s.fType &&
const char* name() const override { return "ColorTable"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const GrTextureStripAtlas* atlas() const { return fAtlas; }
int atlasRow() const { return fRow; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
}
}
-void ColorTableEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void ColorTableEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLColorTableEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Linear Gradient"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GrGLLinearGradient::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GrGLLinearGradient, (*this));
}
: INHERITED(ctx, procDataManager, shader, matrix, tm) {
this->initClassID<GrLinearGradient>();
}
+
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GrGLLinearGradient::GenKey(*this, caps, b);
+ }
+
GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
typedef GrGradientEffect INHERITED;
const char* name() const override { return "Radial Gradient"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GrGLRadialGradient::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GrGLRadialGradient, (*this));
}
this->initClassID<GrRadialGradient>();
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GrGLRadialGradient::GenKey(*this, caps, b);
+ }
+
GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
typedef GrGradientEffect INHERITED;
const char* name() const override { return "Sweep Gradient"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GrGLSweepGradient::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GrGLSweepGradient, (*this));
}
: INHERITED(ctx, procDataManager, shader, matrix, SkShader::kClamp_TileMode) {
this->initClassID<GrSweepGradient>();
}
+
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GrGLSweepGradient::GenKey(*this, caps, b);
+ }
+
GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
typedef GrGradientEffect INHERITED;
return "Two-Point Conical Gradient Edge Touching";
}
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
// The radial gradient parameters can collapse to a linear (instead of quadratic) equation.
SkScalar radius() const { return fRadius0; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>();
return (INHERITED::onIsEqual(sBase) &&
};
-void Edge2PtConicalEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void Edge2PtConicalEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLEdge2PtConicalEffect::GenKey(*this, caps, b);
}
return "Two-Point Conical Gradient Focal Outside";
}
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
bool isFlipped() const { return fIsFlipped; }
SkScalar focal() const { return fFocalX; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConicalEffect>();
return (INHERITED::onIsEqual(sBase) &&
};
-void FocalOutside2PtConicalEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void FocalOutside2PtConicalEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLFocalOutside2PtConicalEffect::GenKey(*this, caps, b);
}
return "Two-Point Conical Gradient Focal Inside";
}
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
SkScalar focal() const { return fFocalX; }
typedef GLFocalInside2PtConicalEffect GLProcessor;
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalEffect>();
return (INHERITED::onIsEqual(sBase) &&
};
-void FocalInside2PtConicalEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void FocalInside2PtConicalEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLFocalInside2PtConicalEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Two-Point Conical Gradient Inside"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
SkScalar C() const { return fInfo.fC; }
private:
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConicalEffect>();
return (INHERITED::onIsEqual(sBase) &&
};
-void CircleInside2PtConicalEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void CircleInside2PtConicalEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLCircleInside2PtConicalEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Two-Point Conical Gradient Outside"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
bool isFlipped() const { return fIsFlipped; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConicalEffect>();
return (INHERITED::onIsEqual(sBase) &&
};
-void CircleOutside2PtConicalEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void CircleOutside2PtConicalEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLCircleOutside2PtConicalEffect::GenKey(*this, caps, b);
}
SkDEBUGCODE(transform->setInProcessor();)
}
+void GrFragmentProcessor::registerChildProcessor(GrFragmentProcessor* child) {
+ fChildProcessors.push_back(child);
+}
+
bool GrFragmentProcessor::hasSameTransforms(const GrFragmentProcessor& that) const {
if (fCoordTransforms.count() != that.fCoordTransforms.count()) {
return false;
GrBicubicEffect::~GrBicubicEffect() {
}
-void GrBicubicEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrBicubicEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLBicubicEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Bicubic"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const GrTextureDomain& domain() const { return fDomain; }
const SkMatrix &matrix, const SkShader::TileMode tileModes[2]);
GrBicubicEffect(GrProcessorDataManager*, GrTexture*, const SkScalar coefficients[16],
const SkMatrix &matrix, const SkRect& domain);
+
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
///////////////////////////////////////////////////////////////////////////////
-void GrConfigConversionEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrConfigConversionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLConfigConversionEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Config Conversion"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
bool swapsRedAndBlue() const { return fSwapRedAndBlue; }
PMConversion pmConversion,
const SkMatrix& matrix);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
}
}
-void GrConstColorProcessor::getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder* b) const {
+void GrConstColorProcessor::onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder* b) const {
b->add32(fMode);
}
const char* name() const override { return "AARect"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
GrGLFragmentProcessor* createGLInstance() const override;
b->add32(aare.getEdgeType());
}
-void AARectEffect::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void AARectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GLAARectEffect::GenKey(*this, caps, b);
}
inout->mulByUnknownSingleComponent();
}
-void GrConvexPolyEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrConvexPolyEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLConvexPolyEffect::GenKey(*this, caps, b);
}
const SkScalar* getEdges() const { return fEdges; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
GrConvexPolyEffect(GrPrimitiveEdgeType edgeType, int n, const SkScalar edges[]);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
GrConvolutionEffect::~GrConvolutionEffect() {
}
-void GrConvolutionEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLConvolutionEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Convolution"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
enum {
bool useBounds,
float bounds[2]);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
this->addTextureAccess(&fBackgroundAccess);
}
-void GrCustomXferFP::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
+void GrCustomXferFP::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
GLCustomXferFP::GenKey(*this, caps, b);
}
public:
GrCustomXferFP(GrProcessorDataManager*, SkXfermode::Mode mode, GrTexture* background);
- void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const char* name() const override { return "Custom Xfermode"; }
const GrTextureAccess& backgroundAccess() const { return fBackgroundAccess; }
private:
+ void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
const char* name() const override { return "Dither"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
this->setWillReadFragmentPosition();
}
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
// All dither effects are equal
bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
//////////////////////////////////////////////////////////////////////////////
-void DitherEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void DitherEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLDitherEffect::GenKey(*this, caps, b);
}
GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() {
}
-void GrMatrixConvolutionEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrMatrixConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLMatrixConvolutionEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "MatrixConvolution"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
GrTextureDomain::Mode tileMode,
bool convolveAlpha);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
const char* name() const override { return "Circle"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const SkPoint& getCenter() const { return fCenter; }
private:
CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
///////////////////////////////////////////////////////////////////////////////////////////////////
-void CircleEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void CircleEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLCircleEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "Ellipse"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const SkPoint& getCenter() const { return fCenter; }
private:
EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
///////////////////////////////////////////////////////////////////////////////////////////////////
-void EllipseEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void EllipseEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLEllipseEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "CircularRRect"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const SkRRect& getRRect() const { return fRRect; }
private:
CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const SkRRect&);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
////////////////////////////////////////////////////////////////////////////////////////////////////
-void CircularRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void CircularRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLCircularRRectEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "EllipticalRRect"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const SkRRect& getRRect() const { return fRRect; }
private:
EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
////////////////////////////////////////////////////////////////////////////////////////////////////
-void EllipticalRRectEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void EllipticalRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GLEllipticalRRectEffect::GenKey(*this, caps, b);
}
this->updateInvariantOutputForModulation(inout);
}
-void GrSimpleTextureEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrSimpleTextureEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLSimpleTextureEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "SimpleTexture"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
private:
this->initClassID<GrSimpleTextureEffect>();
}
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor& other) const override { return true; }
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
}
-void GrTextureDomainEffect::getGLProcessorKey(const GrGLSLCaps& caps,
+void GrTextureDomainEffect::onGetGLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const {
GrGLTextureDomainEffect::GenKey(*this, caps, b);
}
const char* name() const override { return "TextureDomain"; }
- void getGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
-
GrGLFragmentProcessor* createGLInstance() const override;
const GrTextureDomain& textureDomain() const { return fTextureDomain; }
GrTextureParams::FilterMode,
GrCoordSet);
+ void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
+
bool onIsEqual(const GrFragmentProcessor&) const override;
void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
typedef GrGLFragmentProcessor INHERITED;
};
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GLProcessor::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GLProcessor, (*this));
}
this->addTextureAccess(&fVAccess);
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GLProcessor::GenKey(*this, caps, b);
+ }
+
bool onIsEqual(const GrFragmentProcessor& sBase) const override {
const YUVtoRGBEffect& s = sBase.cast<YUVtoRGBEffect>();
return fColorSpace == s.getColorSpace();
for (int s = 0; s < pipeline.numFragmentStages(); ++s) {
const GrPendingFragmentStage& fps = pipeline.getFragmentStage(s);
const GrFragmentProcessor& fp = *fps.processor();
+
fp.getGLProcessorKey(*gpu->glCaps().glslCaps(), &b);
+
//**** use glslCaps here?
if (!get_meta_key(fp, gpu->glCaps(), primProc.getTransformKey(fp.coordTransforms()), &b)) {
glDesc->key().reset();
return fGpu->ctxInfo();
}
+static void append_gr_fp_coord_transforms(const GrFragmentProcessor* processor,
+ SkTArray<const GrCoordTransform*, true>* procCoords) {
+ // add the coord transforms of this processor
+ for (int i = 0; i < processor->numTransforms(); ++i) {
+ procCoords->push_back(&processor->coordTransform(i));
+ }
+ // recursively add the coord transforms of this processor's child processors
+ for (int i = 0; i < processor->numChildProcessors(); ++i) {
+ append_gr_fp_coord_transforms(processor->childProcessor(i), procCoords);
+ }
+}
+
bool GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage) {
// First we loop over all of the installed processors and collect coord transforms. These will
// be sent to the GrGLPrimitiveProcessor in its emitCode function
for (int i = 0; i < this->pipeline().numFragmentStages(); i++) {
const GrFragmentProcessor* processor = this->pipeline().getFragmentStage(i).processor();
SkSTArray<2, const GrCoordTransform*, true>& procCoords = fCoordTransforms.push_back();
- for (int t = 0; t < processor->numTransforms(); t++) {
- procCoords.push_back(&processor->coordTransform(t));
- }
- totalTextures += processor->numTextures();
+ append_gr_fp_coord_transforms(processor, &procCoords);
+
+ totalTextures += processor->numTexturesIncludeChildProcs();
if (totalTextures >= maxTextureUnits) {
GrCapsDebugf(fGpu->caps(), "Program would use too many texture units\n");
return false;
const GrFragmentProcessor& fp = *fs.processor();
ifp->fGLProc.reset(fp.createGLInstance());
- SkSTArray<4, GrGLProcessor::TextureSampler> samplers(fp.numTextures());
+ SkSTArray<4, GrGLProcessor::TextureSampler> samplers(fp.numTexturesIncludeChildProcs());
this->emitSamplers(fp, &samplers, ifp);
GrGLFragmentProcessor::EmitArgs args(this, fp, outColor, inColor, fOutCoords[index], samplers);
const char* name() const override { return "Big Ole Key"; }
- virtual void getGLProcessorKey(const GrGLSLCaps& caps,
- GrProcessorKeyBuilder* b) const override {
- GLBigKeyProcessor::GenKey(*this, caps, b);
- }
-
GrGLFragmentProcessor* createGLInstance() const override {
return SkNEW_ARGS(GLBigKeyProcessor, (*this));
}
BigKeyProcessor() {
this->initClassID<BigKeyProcessor>();
}
+ virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
+ GrProcessorKeyBuilder* b) const override {
+ GLBigKeyProcessor::GenKey(*this, caps, b);
+ }
bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
void onComputeInvariantOutput(GrInvariantOutput* inout) const override { }