aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrProcessor.cpp10
-rw-r--r--src/gpu/effects/GrBicubicEffect.cpp9
-rw-r--r--src/gpu/effects/GrBicubicEffect.h4
-rw-r--r--src/gpu/effects/GrConfigConversionEffect.cpp2
-rw-r--r--src/gpu/effects/GrConfigConversionEffect.h4
-rw-r--r--src/gpu/effects/GrConstColorProcessor.cpp5
-rw-r--r--src/gpu/effects/GrConvexPolyEffect.cpp18
-rw-r--r--src/gpu/effects/GrConvexPolyEffect.h4
-rw-r--r--src/gpu/effects/GrConvolutionEffect.cpp9
-rw-r--r--src/gpu/effects/GrConvolutionEffect.h4
-rw-r--r--src/gpu/effects/GrCustomXfermode.cpp9
-rw-r--r--src/gpu/effects/GrCustomXfermodePriv.h4
-rw-r--r--src/gpu/effects/GrDitherEffect.cpp6
-rw-r--r--src/gpu/effects/GrMatrixConvolutionEffect.cpp7
-rw-r--r--src/gpu/effects/GrMatrixConvolutionEffect.h4
-rw-r--r--src/gpu/effects/GrOvalEffect.cpp22
-rw-r--r--src/gpu/effects/GrRRectEffect.cpp22
-rw-r--r--src/gpu/effects/GrSimpleTextureEffect.cpp2
-rw-r--r--src/gpu/effects/GrSimpleTextureEffect.h4
-rw-r--r--src/gpu/effects/GrTextureDomain.cpp9
-rw-r--r--src/gpu/effects/GrTextureDomain.h4
-rw-r--r--src/gpu/effects/GrYUVtoRGBEffect.cpp11
-rw-r--r--src/gpu/gl/GrGLFragmentProcessor.cpp18
-rw-r--r--src/gpu/gl/GrGLFragmentProcessor.h32
-rw-r--r--src/gpu/gl/GrGLProgram.cpp2
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,