diff options
Diffstat (limited to 'src/gpu')
25 files changed, 141 insertions, 84 deletions
diff --git a/src/gpu/GrProcessor.cpp b/src/gpu/GrProcessor.cpp index 3090d0f461..0eaab75b61 100644 --- a/src/gpu/GrProcessor.cpp +++ b/src/gpu/GrProcessor.cpp @@ -13,6 +13,7 @@ #include "GrMemoryPool.h" #include "GrXferProcessor.h" #include "SkSpinlock.h" +#include "gl/GrGLFragmentProcessor.h" #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS @@ -156,6 +157,15 @@ bool GrFragmentProcessor::isEqual(const GrFragmentProcessor& that, return true; } +GrGLFragmentProcessor* GrFragmentProcessor::createGLInstance() const { + GrGLFragmentProcessor* glFragProc = this->onCreateGLInstance(); + glFragProc->fChildProcessors.push_back_n(fChildProcessors.count()); + for (int i = 0; i < fChildProcessors.count(); ++i) { + glFragProc->fChildProcessors[i] = fChildProcessors[i].processor()->createGLInstance(); + } + return glFragProc; +} + void GrFragmentProcessor::addCoordTransform(const GrCoordTransform* transform) { fCoordTransforms.push_back(transform); fUsesLocalCoords = fUsesLocalCoords || transform->sourceCoords() == kLocal_GrCoordSet; diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp index d5cf03911b..e3b959da4b 100644 --- a/src/gpu/effects/GrBicubicEffect.cpp +++ b/src/gpu/effects/GrBicubicEffect.cpp @@ -25,14 +25,15 @@ public: virtual void emitCode(EmitArgs&) override; - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; - static inline void GenKey(const GrProcessor& effect, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { const GrTextureDomain& domain = effect.cast<GrBicubicEffect>().domain(); b->add32(GrTextureDomain::GLDomain::DomainKey(domain)); } +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; + private: typedef GrGLProgramDataManager::UniformHandle UniformHandle; @@ -104,7 +105,7 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) { GrGLSLExpr4(args.fInputColor)).c_str()); } -void GrGLBicubicEffect::setData(const GrGLProgramDataManager& pdman, +void GrGLBicubicEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const GrBicubicEffect& bicubicEffect = processor.cast<GrBicubicEffect>(); const GrTexture& texture = *processor.texture(0); @@ -157,7 +158,7 @@ void GrBicubicEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLBicubicEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrBicubicEffect::createGLInstance() const { +GrGLFragmentProcessor* GrBicubicEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLBicubicEffect, (*this)); } diff --git a/src/gpu/effects/GrBicubicEffect.h b/src/gpu/effects/GrBicubicEffect.h index 810e443162..f95b3f9622 100644 --- a/src/gpu/effects/GrBicubicEffect.h +++ b/src/gpu/effects/GrBicubicEffect.h @@ -27,8 +27,6 @@ public: const char* name() const override { return "Bicubic"; } - GrGLFragmentProcessor* createGLInstance() const override; - const GrTextureDomain& domain() const { return fDomain; } /** @@ -93,6 +91,8 @@ private: GrBicubicEffect(GrProcessorDataManager*, GrTexture*, const SkScalar coefficients[16], const SkMatrix &matrix, const SkRect& domain); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index c99351d6b3..4c8813d415 100644 --- a/src/gpu/effects/GrConfigConversionEffect.cpp +++ b/src/gpu/effects/GrConfigConversionEffect.cpp @@ -151,7 +151,7 @@ void GrConfigConversionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLConfigConversionEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrConfigConversionEffect::createGLInstance() const { +GrGLFragmentProcessor* GrConfigConversionEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLConfigConversionEffect, (*this)); } diff --git a/src/gpu/effects/GrConfigConversionEffect.h b/src/gpu/effects/GrConfigConversionEffect.h index ba21c160c1..fc92a04257 100644 --- a/src/gpu/effects/GrConfigConversionEffect.h +++ b/src/gpu/effects/GrConfigConversionEffect.h @@ -38,8 +38,6 @@ public: const char* name() const override { return "Config Conversion"; } - GrGLFragmentProcessor* createGLInstance() const override; - bool swapsRedAndBlue() const { return fSwapRedAndBlue; } PMConversion pmConversion() const { return fPMConversion; } @@ -59,6 +57,8 @@ private: PMConversion pmConversion, const SkMatrix& matrix); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; diff --git a/src/gpu/effects/GrConstColorProcessor.cpp b/src/gpu/effects/GrConstColorProcessor.cpp index a909104b5a..88bd82be40 100644 --- a/src/gpu/effects/GrConstColorProcessor.cpp +++ b/src/gpu/effects/GrConstColorProcessor.cpp @@ -34,7 +34,8 @@ public: } } - void setData(const GrGLProgramDataManager& pdm, const GrProcessor& processor) override { +protected: + void onSetData(const GrGLProgramDataManager& pdm, const GrProcessor& processor) override { GrColor color = processor.cast<GrConstColorProcessor>().color(); // We use the "illegal" color value as an uninit sentinel. However, ut isn't inherently // illegal to use this processor with unpremul colors. So we correctly handle the case @@ -89,7 +90,7 @@ void GrConstColorProcessor::onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKe b->add32(fMode); } -GrGLFragmentProcessor* GrConstColorProcessor::createGLInstance() const { +GrGLFragmentProcessor* GrConstColorProcessor::onCreateGLInstance() const { return SkNEW(GLConstColorProcessor); } diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp index 9c73e47322..6c477688c0 100644 --- a/src/gpu/effects/GrConvexPolyEffect.cpp +++ b/src/gpu/effects/GrConvexPolyEffect.cpp @@ -26,8 +26,6 @@ public: void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; - GrGLFragmentProcessor* createGLInstance() const override; - private: AARectEffect(GrPrimitiveEdgeType edgeType, const SkRect& rect) : fRect(rect), fEdgeType(edgeType) { @@ -35,6 +33,8 @@ private: this->setWillReadFragmentPosition(); } + GrGLFragmentProcessor* onCreateGLInstance() const override; + bool onIsEqual(const GrFragmentProcessor& other) const override { const AARectEffect& aare = other.cast<AARectEffect>(); return fRect == aare.fRect; @@ -85,7 +85,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fRectUniform; @@ -136,7 +137,7 @@ void GLAARectEffect::emitCode(EmitArgs& args) { (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")).c_str()); } -void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { +void GLAARectEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const AARectEffect& aare = processor.cast<AARectEffect>(); const SkRect& rect = aare.getRect(); if (rect != fPrevRect) { @@ -156,7 +157,7 @@ void AARectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBui GLAARectEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* AARectEffect::createGLInstance() const { +GrGLFragmentProcessor* AARectEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLAARectEffect, (*this)); } @@ -170,7 +171,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fEdgeUniform; @@ -219,7 +221,7 @@ void GrGLConvexPolyEffect::emitCode(EmitArgs& args) { (GrGLSLExpr4(args.fInputColor) * GrGLSLExpr1("alpha")).c_str()); } -void GrGLConvexPolyEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { +void GrGLConvexPolyEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { const GrConvexPolyEffect& cpe = effect.cast<GrConvexPolyEffect>(); size_t byteSize = 3 * cpe.getEdgeCount() * sizeof(SkScalar); if (0 != memcmp(fPrevEdges, cpe.getEdges(), byteSize)) { @@ -307,7 +309,7 @@ void GrConvexPolyEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLConvexPolyEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrConvexPolyEffect::createGLInstance() const { +GrGLFragmentProcessor* GrConvexPolyEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLConvexPolyEffect, (*this)); } diff --git a/src/gpu/effects/GrConvexPolyEffect.h b/src/gpu/effects/GrConvexPolyEffect.h index d18ed517ed..ead7fe4ff5 100644 --- a/src/gpu/effects/GrConvexPolyEffect.h +++ b/src/gpu/effects/GrConvexPolyEffect.h @@ -69,11 +69,11 @@ public: const SkScalar* getEdges() const { return fEdges; } - GrGLFragmentProcessor* createGLInstance() const override; - private: GrConvexPolyEffect(GrPrimitiveEdgeType edgeType, int n, const SkScalar edges[]); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor& other) const override; diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp index f99afc8619..3ab9efb049 100644 --- a/src/gpu/effects/GrConvolutionEffect.cpp +++ b/src/gpu/effects/GrConvolutionEffect.cpp @@ -19,10 +19,11 @@ public: virtual void emitCode(EmitArgs&) override; - void setData(const GrGLProgramDataManager& pdman, const GrProcessor&) override; - static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); +protected: + void onSetData(const GrGLProgramDataManager& pdman, const GrProcessor&) override; + private: int width() const { return Gr1DKernelEffect::WidthFromRadius(fRadius); } bool useBounds() const { return fUseBounds; } @@ -99,7 +100,7 @@ void GrGLConvolutionEffect::emitCode(EmitArgs& args) { fsBuilder->codeAppend(modulate.c_str()); } -void GrGLConvolutionEffect::setData(const GrGLProgramDataManager& pdman, +void GrGLConvolutionEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const GrConvolutionEffect& conv = processor.cast<GrConvolutionEffect>(); GrTexture& texture = *conv.texture(0); @@ -199,7 +200,7 @@ void GrConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLConvolutionEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrConvolutionEffect::createGLInstance() const { +GrGLFragmentProcessor* GrConvolutionEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLConvolutionEffect, (*this)); } diff --git a/src/gpu/effects/GrConvolutionEffect.h b/src/gpu/effects/GrConvolutionEffect.h index e65c4c43c9..37faa08924 100644 --- a/src/gpu/effects/GrConvolutionEffect.h +++ b/src/gpu/effects/GrConvolutionEffect.h @@ -63,8 +63,6 @@ public: const char* name() const override { return "Convolution"; } - GrGLFragmentProcessor* createGLInstance() const override; - enum { // This was decided based on the min allowed value for the max texture // samples per fragment program run in DX9SM2 (32). A sigma param of 4.0 @@ -98,6 +96,8 @@ private: bool useBounds, float bounds[2]); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp index e7023ca25d..761e177015 100644 --- a/src/gpu/effects/GrCustomXfermode.cpp +++ b/src/gpu/effects/GrCustomXfermode.cpp @@ -459,8 +459,6 @@ public: emit_custom_xfermode_code(mode, fsBuilder, args.fOutputColor, args.fInputColor, dstColor); } - void setData(const GrGLProgramDataManager&, const GrProcessor&) override {} - static void GenKey(const GrFragmentProcessor& proc, const GrGLSLCaps&, GrProcessorKeyBuilder* b) { // The background may come from the dst or from a texture. uint32_t key = proc.numTextures(); @@ -469,6 +467,9 @@ public: b->add32(key); } +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override {} + private: typedef GrGLFragmentProcessor INHERITED; }; @@ -491,7 +492,7 @@ void GrCustomXferFP::onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyB GLCustomXferFP::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrCustomXferFP::createGLInstance() const { +GrGLFragmentProcessor* GrCustomXferFP::onCreateGLInstance() const { return SkNEW_ARGS(GLCustomXferFP, (*this)); } @@ -625,7 +626,7 @@ private: void onSetData(const GrGLProgramDataManager&, const GrXferProcessor&) override {} - typedef GrGLFragmentProcessor INHERITED; + typedef GrGLXferProcessor INHERITED; }; /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/effects/GrCustomXfermodePriv.h b/src/gpu/effects/GrCustomXfermodePriv.h index 2a4006bf67..05e07b64ce 100644 --- a/src/gpu/effects/GrCustomXfermodePriv.h +++ b/src/gpu/effects/GrCustomXfermodePriv.h @@ -29,14 +29,14 @@ class GrCustomXferFP : public GrFragmentProcessor { public: GrCustomXferFP(GrProcessorDataManager*, SkXfermode::Mode mode, GrTexture* background); - GrGLFragmentProcessor* createGLInstance() const override; - const char* name() const override { return "Custom Xfermode"; } SkXfermode::Mode mode() const { return fMode; } const GrTextureAccess& backgroundAccess() const { return fBackgroundAccess; } private: + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; bool onIsEqual(const GrFragmentProcessor& other) const override; diff --git a/src/gpu/effects/GrDitherEffect.cpp b/src/gpu/effects/GrDitherEffect.cpp index 6d39450631..2b10ac0080 100644 --- a/src/gpu/effects/GrDitherEffect.cpp +++ b/src/gpu/effects/GrDitherEffect.cpp @@ -25,14 +25,14 @@ public: const char* name() const override { return "Dither"; } - GrGLFragmentProcessor* createGLInstance() const override; - private: DitherEffect() { this->initClassID<DitherEffect>(); this->setWillReadFragmentPosition(); } + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; // All dither effects are equal @@ -97,7 +97,7 @@ void DitherEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GLDitherEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* DitherEffect::createGLInstance() const { +GrGLFragmentProcessor* DitherEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLDitherEffect, (*this)); } diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp index 625a3e9dab..3da4c54ab0 100644 --- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp +++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp @@ -16,7 +16,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: typedef GrGLProgramDataManager::UniformHandle UniformHandle; @@ -110,7 +111,7 @@ void GrGLMatrixConvolutionEffect::GenKey(const GrProcessor& processor, b->add32(GrTextureDomain::GLDomain::DomainKey(m.domain())); } -void GrGLMatrixConvolutionEffect::setData(const GrGLProgramDataManager& pdman, +void GrGLMatrixConvolutionEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const GrMatrixConvolutionEffect& conv = processor.cast<GrMatrixConvolutionEffect>(); GrTexture& texture = *conv.texture(0); @@ -160,7 +161,7 @@ void GrMatrixConvolutionEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLMatrixConvolutionEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrMatrixConvolutionEffect::createGLInstance() const { +GrGLFragmentProcessor* GrMatrixConvolutionEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLMatrixConvolutionEffect, (*this)); } diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.h b/src/gpu/effects/GrMatrixConvolutionEffect.h index ff0a51ea12..f3d6b2461d 100644 --- a/src/gpu/effects/GrMatrixConvolutionEffect.h +++ b/src/gpu/effects/GrMatrixConvolutionEffect.h @@ -65,8 +65,6 @@ public: const char* name() const override { return "MatrixConvolution"; } - GrGLFragmentProcessor* createGLInstance() const override; - private: GrMatrixConvolutionEffect(GrProcessorDataManager*, GrTexture*, @@ -79,6 +77,8 @@ private: GrTextureDomain::Mode tileMode, bool convolveAlpha); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; diff --git a/src/gpu/effects/GrOvalEffect.cpp b/src/gpu/effects/GrOvalEffect.cpp index 1fb54aede3..3fb7b9029d 100644 --- a/src/gpu/effects/GrOvalEffect.cpp +++ b/src/gpu/effects/GrOvalEffect.cpp @@ -23,8 +23,6 @@ public: const char* name() const override { return "Circle"; } - GrGLFragmentProcessor* createGLInstance() const override; - const SkPoint& getCenter() const { return fCenter; } SkScalar getRadius() const { return fRadius; } @@ -33,6 +31,8 @@ public: private: CircleEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar radius); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; @@ -97,7 +97,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fCircleUniform; @@ -152,7 +153,7 @@ void GLCircleEffect::GenKey(const GrProcessor& processor, const GrGLSLCaps&, b->add32(ce.getEdgeType()); } -void GLCircleEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { +void GLCircleEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const CircleEffect& ce = processor.cast<CircleEffect>(); if (ce.getRadius() != fPrevRadius || ce.getCenter() != fPrevCenter) { SkScalar radius = ce.getRadius(); @@ -175,7 +176,7 @@ void CircleEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GLCircleEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* CircleEffect::createGLInstance() const { +GrGLFragmentProcessor* CircleEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLCircleEffect, (*this)); } @@ -190,8 +191,6 @@ public: const char* name() const override { return "Ellipse"; } - GrGLFragmentProcessor* createGLInstance() const override; - const SkPoint& getCenter() const { return fCenter; } SkVector getRadii() const { return fRadii; } @@ -200,6 +199,8 @@ public: private: EllipseEffect(GrPrimitiveEdgeType, const SkPoint& center, SkScalar rx, SkScalar ry); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; @@ -267,7 +268,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fEllipseUniform; @@ -332,7 +334,7 @@ void GLEllipseEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps&, b->add32(ee.getEdgeType()); } -void GLEllipseEffect::setData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { +void GLEllipseEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { const EllipseEffect& ee = effect.cast<EllipseEffect>(); if (ee.getRadii() != fPrevRadii || ee.getCenter() != fPrevCenter) { SkScalar invRXSqd = 1.f / (ee.getRadii().fX * ee.getRadii().fX); @@ -350,7 +352,7 @@ void EllipseEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GLEllipseEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* EllipseEffect::createGLInstance() const { +GrGLFragmentProcessor* EllipseEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLEllipseEffect, (*this)); } diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp index 271a997065..519d72cb4e 100644 --- a/src/gpu/effects/GrRRectEffect.cpp +++ b/src/gpu/effects/GrRRectEffect.cpp @@ -49,8 +49,6 @@ public: const char* name() const override { return "CircularRRect"; } - GrGLFragmentProcessor* createGLInstance() const override; - const SkRRect& getRRect() const { return fRRect; } uint32_t getCircularCornerFlags() const { return fCircularCornerFlags; } @@ -60,6 +58,8 @@ public: private: CircularRRectEffect(GrPrimitiveEdgeType, uint32_t circularCornerFlags, const SkRRect&); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor& other) const override; @@ -132,7 +132,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fInnerRectUniform; @@ -280,7 +281,7 @@ void GLCircularRRectEffect::GenKey(const GrProcessor& processor, const GrGLSLCap b->add32((crre.getCircularCornerFlags() << 3) | crre.getEdgeType()); } -void GLCircularRRectEffect::setData(const GrGLProgramDataManager& pdman, +void GLCircularRRectEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const CircularRRectEffect& crre = processor.cast<CircularRRectEffect>(); const SkRRect& rrect = crre.getRRect(); @@ -366,7 +367,7 @@ void CircularRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GLCircularRRectEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* CircularRRectEffect::createGLInstance() const { +GrGLFragmentProcessor* CircularRRectEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLCircularRRectEffect, (*this)); } @@ -380,8 +381,6 @@ public: const char* name() const override { return "EllipticalRRect"; } - GrGLFragmentProcessor* createGLInstance() const override; - const SkRRect& getRRect() const { return fRRect; } GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; } @@ -389,6 +388,8 @@ public: private: EllipticalRRectEffect(GrPrimitiveEdgeType, const SkRRect&); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor& other) const override; @@ -477,7 +478,8 @@ public: static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; private: GrGLProgramDataManager::UniformHandle fInnerRectUniform; @@ -570,7 +572,7 @@ void GLEllipticalRRectEffect::GenKey(const GrProcessor& effect, const GrGLSLCaps b->add32(erre.getRRect().getType() | erre.getEdgeType() << 3); } -void GLEllipticalRRectEffect::setData(const GrGLProgramDataManager& pdman, +void GLEllipticalRRectEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& effect) { const EllipticalRRectEffect& erre = effect.cast<EllipticalRRectEffect>(); const SkRRect& rrect = erre.getRRect(); @@ -614,7 +616,7 @@ void EllipticalRRectEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GLEllipticalRRectEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* EllipticalRRectEffect::createGLInstance() const { +GrGLFragmentProcessor* EllipticalRRectEffect::onCreateGLInstance() const { return SkNEW_ARGS(GLEllipticalRRectEffect, (*this)); } diff --git a/src/gpu/effects/GrSimpleTextureEffect.cpp b/src/gpu/effects/GrSimpleTextureEffect.cpp index e3389bbce5..0bd1fcdefc 100644 --- a/src/gpu/effects/GrSimpleTextureEffect.cpp +++ b/src/gpu/effects/GrSimpleTextureEffect.cpp @@ -42,7 +42,7 @@ void GrSimpleTextureEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLSimpleTextureEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrSimpleTextureEffect::createGLInstance() const { +GrGLFragmentProcessor* GrSimpleTextureEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLSimpleTextureEffect, (*this)); } diff --git a/src/gpu/effects/GrSimpleTextureEffect.h b/src/gpu/effects/GrSimpleTextureEffect.h index c86b1365e7..ab10ecf824 100644 --- a/src/gpu/effects/GrSimpleTextureEffect.h +++ b/src/gpu/effects/GrSimpleTextureEffect.h @@ -53,8 +53,6 @@ public: const char* name() const override { return "SimpleTexture"; } - GrGLFragmentProcessor* createGLInstance() const override; - private: GrSimpleTextureEffect(GrProcessorDataManager* procDataManager, GrTexture* texture, @@ -74,6 +72,8 @@ private: this->initClassID<GrSimpleTextureEffect>(); } + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor& other) const override { return true; } diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp index 7cc454ec0a..3810c3482f 100644 --- a/src/gpu/effects/GrTextureDomain.cpp +++ b/src/gpu/effects/GrTextureDomain.cpp @@ -176,10 +176,11 @@ public: virtual void emitCode(EmitArgs&) override; - void setData(const GrGLProgramDataManager&, const GrProcessor&) override; - static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); +protected: + void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; + private: GrTextureDomain::GLDomain fGLDomain; typedef GrGLFragmentProcessor INHERITED; @@ -198,7 +199,7 @@ void GrGLTextureDomainEffect::emitCode(EmitArgs& args) { args.fInputColor); } -void GrGLTextureDomainEffect::setData(const GrGLProgramDataManager& pdman, +void GrGLTextureDomainEffect::onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) { const GrTextureDomainEffect& textureDomainEffect = processor.cast<GrTextureDomainEffect>(); const GrTextureDomain& domain = textureDomainEffect.textureDomain(); @@ -260,7 +261,7 @@ void GrTextureDomainEffect::onGetGLProcessorKey(const GrGLSLCaps& caps, GrGLTextureDomainEffect::GenKey(*this, caps, b); } -GrGLFragmentProcessor* GrTextureDomainEffect::createGLInstance() const { +GrGLFragmentProcessor* GrTextureDomainEffect::onCreateGLInstance() const { return SkNEW_ARGS(GrGLTextureDomainEffect, (*this)); } diff --git a/src/gpu/effects/GrTextureDomain.h b/src/gpu/effects/GrTextureDomain.h index 7cf75d6c25..a2e6652e91 100644 --- a/src/gpu/effects/GrTextureDomain.h +++ b/src/gpu/effects/GrTextureDomain.h @@ -169,8 +169,6 @@ public: const char* name() const override { return "TextureDomain"; } - GrGLFragmentProcessor* createGLInstance() const override; - const GrTextureDomain& textureDomain() const { return fTextureDomain; } protected: @@ -185,6 +183,8 @@ private: GrTextureParams::FilterMode, GrCoordSet); + GrGLFragmentProcessor* onCreateGLInstance() const override; + void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor&) const override; diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp index 7d77c1f3b4..913c37e39b 100644 --- a/src/gpu/effects/GrYUVtoRGBEffect.cpp +++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp @@ -80,7 +80,8 @@ public: fsBuilder->codeAppendf(".r,\n\t\t1.0) * %s;\n", yuvMatrix); } - virtual void setData(const GrGLProgramDataManager& pdman, + protected: + virtual void onSetData(const GrGLProgramDataManager& pdman, const GrProcessor& processor) override { const YUVtoRGBEffect& yuvEffect = processor.cast<YUVtoRGBEffect>(); switch (yuvEffect.getColorSpace()) { @@ -102,10 +103,6 @@ public: typedef GrGLFragmentProcessor INHERITED; }; - GrGLFragmentProcessor* createGLInstance() const override { - return SkNEW_ARGS(GLProcessor, (*this)); - } - private: YUVtoRGBEffect(GrProcessorDataManager*, GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture, const SkMatrix yuvMatrix[3], @@ -126,6 +123,10 @@ private: this->addTextureAccess(&fVAccess); } + GrGLFragmentProcessor* onCreateGLInstance() const override { + return SkNEW_ARGS(GLProcessor, (*this)); + } + virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override { GLProcessor::GenKey(*this, caps, b); diff --git a/src/gpu/gl/GrGLFragmentProcessor.cpp b/src/gpu/gl/GrGLFragmentProcessor.cpp new file mode 100644 index 0000000000..d300da19f0 --- /dev/null +++ b/src/gpu/gl/GrGLFragmentProcessor.cpp @@ -0,0 +1,18 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrGLFragmentProcessor.h" +#include "GrFragmentProcessor.h" + +void GrGLFragmentProcessor::setData(const GrGLProgramDataManager& pdman, + const GrFragmentProcessor& processor) { + this->onSetData(pdman, processor); + SkASSERT(fChildProcessors.count() == processor.numChildProcessors()); + for (int i = 0; i < fChildProcessors.count(); ++i) { + fChildProcessors[i]->setData(pdman, processor.childProcessor(i)); + } +} diff --git a/src/gpu/gl/GrGLFragmentProcessor.h b/src/gpu/gl/GrGLFragmentProcessor.h index e130dba1e4..c7964dcc90 100644 --- a/src/gpu/gl/GrGLFragmentProcessor.h +++ b/src/gpu/gl/GrGLFragmentProcessor.h @@ -18,7 +18,11 @@ class GrGLFragmentProcessor { public: GrGLFragmentProcessor() {} - virtual ~GrGLFragmentProcessor() {} + virtual ~GrGLFragmentProcessor() { + for (int i = 0; i < fChildProcessors.count(); ++i) { + SkDELETE(fChildProcessors[i]); + } + } typedef GrGLProgramDataManager::UniformHandle UniformHandle; typedef GrGLProcessor::TransformedCoordsArray TransformedCoordsArray; @@ -66,17 +70,29 @@ public: virtual void emitCode(EmitArgs&) = 0; - /** A GrGLFragmentProcessor instance can be reused with any GrFragmentProcessor that produces - the same stage key; this function reads data from a GrFragmentProcessor and uploads any - uniform variables required by the shaders created in emitCode(). The GrFragmentProcessor - parameter is guaranteed to be of the same type that created this GrGLFragmentProcessor and - to have an identical processor key as the one that created this GrGLFragmentProcessor. */ - // TODO update this to pass in GrFragmentProcessor - virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) {} + void setData(const GrGLProgramDataManager& pdman, const GrFragmentProcessor& processor); static void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*) {} + int numChildProcessors() const { return fChildProcessors.count(); } + + GrGLFragmentProcessor* childProcessor(int index) const { + return fChildProcessors[index]; + } + +protected: + /** A GrGLFragmentProcessor instance can be reused with any GrFragmentProcessor that produces + the same stage key; this function reads data from a GrFragmentProcessor and uploads any + uniform variables required by the shaders created in emitCode(). The GrFragmentProcessor + parameter is guaranteed to be of the same type that created this GrGLFragmentProcessor and + to have an identical processor key as the one that created this GrGLFragmentProcessor. */ + // TODO update this to pass in GrFragmentProcessor + virtual void onSetData(const GrGLProgramDataManager&, const GrProcessor&) {} + private: + SkTArray<GrGLFragmentProcessor*, true> fChildProcessors; + + friend class GrFragmentProcessor; typedef GrGLProcessor INHERITED; }; diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp index 589b963a8b..5af84e0c13 100644 --- a/src/gpu/gl/GrGLProgram.cpp +++ b/src/gpu/gl/GrGLProgram.cpp @@ -107,7 +107,7 @@ void GrGLProgram::setFragmentData(const GrPrimitiveProcessor& primProc, int numProcessors = fFragmentProcessors->fProcs.count(); for (int e = 0; e < numProcessors; ++e) { const GrPendingFragmentStage& stage = pipeline.getFragmentStage(e); - const GrProcessor& processor = *stage.processor(); + const GrFragmentProcessor& processor = *stage.processor(); fFragmentProcessors->fProcs[e]->fGLProc->setData(fProgramDataManager, processor); this->setTransformData(primProc, stage, |