| Index: include/gpu/GrProcessor.h
|
| diff --git a/include/gpu/GrEffect.h b/include/gpu/GrProcessor.h
|
| similarity index 73%
|
| rename from include/gpu/GrEffect.h
|
| rename to include/gpu/GrProcessor.h
|
| index e9259979f0af3946deddf5523ed93d2fd194ecce..7053872bbe4a75d6e0039c0c646daf00af8043a9 100644
|
| --- a/include/gpu/GrEffect.h
|
| +++ b/include/gpu/GrProcessor.h
|
| @@ -5,18 +5,19 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| -#ifndef GrEffect_DEFINED
|
| -#define GrEffect_DEFINED
|
| +#ifndef GrProcessor_DEFINED
|
| +#define GrProcessor_DEFINED
|
|
|
| +#include "GrBackendProcessorFactory.h"
|
| #include "GrColor.h"
|
| -#include "GrEffectUnitTest.h"
|
| +#include "GrProcessorUnitTest.h"
|
| #include "GrProgramElement.h"
|
| #include "GrShaderVar.h"
|
| #include "GrTextureAccess.h"
|
| #include "GrTypesPriv.h"
|
| #include "SkString.h"
|
|
|
| -class GrBackendEffectFactory;
|
| +class GrBackendProcessorFactory;
|
| class GrContext;
|
| class GrCoordTransform;
|
|
|
| @@ -24,17 +25,17 @@ class GrCoordTransform;
|
| Ganesh shading pipeline.
|
| Subclasses must have a function that produces a human-readable name:
|
| static const char* Name();
|
| - GrEffect objects *must* be immutable: after being constructed, their fields may not change.
|
| + GrProcessor objects *must* be immutable: after being constructed, their fields may not change.
|
|
|
| - Dynamically allocated GrEffects are managed by a per-thread memory pool. The ref count of an
|
| + Dynamically allocated GrProcessors are managed by a per-thread memory pool. The ref count of an
|
| effect must reach 0 before the thread terminates and the pool is destroyed. To create a static
|
| effect use the macro GR_CREATE_STATIC_EFFECT declared below.
|
| */
|
| -class GrEffect : public GrProgramElement {
|
| +class GrProcessor : public GrProgramElement {
|
| public:
|
| - SK_DECLARE_INST_COUNT(GrEffect)
|
| + SK_DECLARE_INST_COUNT(GrProcessor)
|
|
|
| - virtual ~GrEffect();
|
| + virtual ~GrProcessor();
|
|
|
| /**
|
| * This function is used to perform optimizations. When called the color and validFlags params
|
| @@ -45,17 +46,14 @@ public:
|
| */
|
| virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const = 0;
|
|
|
| - /** Will this effect read the source color value? */
|
| - bool willUseInputColor() const { return fWillUseInputColor; }
|
| -
|
| /** This object, besides creating back-end-specific helper objects, is used for run-time-type-
|
| identification. The factory should be an instance of templated class,
|
| - GrTBackendEffectFactory. It is templated on the subclass of GrEffect. The subclass must have
|
| - a nested type (or typedef) named GLEffect which will be the subclass of GrGLEffect created
|
| - by the factory.
|
| + GrTBackendEffectFactory. It is templated on the subclass of GrProcessor. The subclass must
|
| + have a nested type (or typedef) named GLProcessor which will be the subclass of
|
| + GrGLProcessor created by the factory.
|
|
|
| Example:
|
| - class MyCustomEffect : public GrEffect {
|
| + class MyCustomEffect : public GrProcessor {
|
| ...
|
| virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE {
|
| return GrTBackendEffectFactory<MyCustomEffect>::getInstance();
|
| @@ -63,7 +61,7 @@ public:
|
| ...
|
| };
|
| */
|
| - virtual const GrBackendEffectFactory& getFactory() const = 0;
|
| + virtual const GrBackendProcessorFactory& getFactory() const = 0;
|
|
|
| /** Returns true if this and other effect conservatively draw identically. It can only return
|
| true when the two effects are of the same subclass (i.e. they return the same object from
|
| @@ -73,7 +71,7 @@ public:
|
| generate the same shader code. To test for identical code generation use the effects' keys
|
| computed by the GrBackendEffectFactory.
|
| */
|
| - bool isEqual(const GrEffect& other) const {
|
| + bool isEqual(const GrProcessor& other) const {
|
| if (&this->getFactory() != &other.getFactory()) {
|
| return false;
|
| }
|
| @@ -105,21 +103,9 @@ public:
|
| /** Shortcut for textureAccess(index).texture(); */
|
| GrTexture* texture(int index) const { return this->textureAccess(index).getTexture(); }
|
|
|
| - /** Will this effect read the destination pixel value? */
|
| - bool willReadDstColor() const { return fWillReadDstColor; }
|
| -
|
| /** Will this effect read the fragment position? */
|
| bool willReadFragmentPosition() const { return fWillReadFragmentPosition; }
|
|
|
| - /** Will this effect emit custom vertex shader code?
|
| - (To set this value the effect must inherit from GrEffect.) */
|
| - bool requiresVertexShader() const { return fRequiresVertexShader; }
|
| -
|
| - static const int kMaxVertexAttribs = 2;
|
| - typedef SkSTArray<kMaxVertexAttribs, GrShaderVar, true> VertexAttribArray;
|
| -
|
| - const VertexAttribArray& getVertexAttribs() const { return fVertexAttribs; }
|
| -
|
| void* operator new(size_t size);
|
| void operator delete(void* target);
|
|
|
| @@ -131,7 +117,7 @@ public:
|
| }
|
|
|
| /**
|
| - * Helper for down-casting to a GrEffect subclass
|
| + * Helper for down-casting to a GrProcessor subclass
|
| */
|
| template <typename T> const T& cast() const { return *static_cast<const T*>(this); }
|
|
|
| @@ -139,32 +125,23 @@ protected:
|
| /**
|
| * Subclasses call this from their constructor to register coordinate transformations. The
|
| * effect subclass manages the lifetime of the transformations (this function only stores a
|
| - * pointer). The GrCoordTransform is typically a member field of the GrEffect subclass. When the
|
| - * matrix has perspective, the transformed coordinates will have 3 components. Otherwise they'll
|
| - * have 2. This must only be called from the constructor because GrEffects are immutable.
|
| + * pointer). The GrCoordTransform is typically a member field of the GrProcessor subclass. When
|
| + * the matrix has perspective, the transformed coordinates will have 3 components. Otherwise
|
| + * they'll have 2. This must only be called from the constructor because GrProcessors are
|
| + * immutable.
|
| */
|
| void addCoordTransform(const GrCoordTransform* coordTransform);
|
|
|
| /**
|
| * Subclasses call this from their constructor to register GrTextureAccesses. The effect
|
| * subclass manages the lifetime of the accesses (this function only stores a pointer). The
|
| - * GrTextureAccess is typically a member field of the GrEffect subclass. This must only be
|
| - * called from the constructor because GrEffects are immutable.
|
| + * GrTextureAccess is typically a member field of the GrProcessor subclass. This must only be
|
| + * called from the constructor because GrProcessors are immutable.
|
| */
|
| void addTextureAccess(const GrTextureAccess* textureAccess);
|
|
|
| - GrEffect()
|
| - : fWillReadDstColor(false)
|
| - , fWillReadFragmentPosition(false)
|
| - , fWillUseInputColor(true)
|
| - , fRequiresVertexShader(false) {}
|
| -
|
| - /**
|
| - * If the effect subclass will read the destination pixel value then it must call this function
|
| - * from its constructor. Otherwise, when its generated backend-specific effect class attempts
|
| - * to generate code that reads the destination pixel it will fail.
|
| - */
|
| - void setWillReadDstColor() { fWillReadDstColor = true; }
|
| + GrProcessor()
|
| + : fWillReadFragmentPosition(false) {}
|
|
|
| /**
|
| * If the effect will generate a backend-specific effect that will read the fragment position
|
| @@ -173,41 +150,68 @@ protected:
|
| */
|
| void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; }
|
|
|
| - /**
|
| - * If the effect will generate a result that does not depend on the input color value then it must
|
| - * call this function from its constructor. Otherwise, when its generated backend-specific code
|
| - * might fail during variable binding due to unused variables.
|
| - */
|
| - void setWillNotUseInputColor() { fWillUseInputColor = false; }
|
| -
|
| private:
|
| - SkDEBUGCODE(void assertEquality(const GrEffect& other) const;)
|
| + SkDEBUGCODE(void assertEquality(const GrProcessor& other) const;)
|
|
|
| /** Subclass implements this to support isEqual(). It will only be called if it is known that
|
| the two effects are of the same subclass (i.e. they return the same object from
|
| getFactory()).*/
|
| - virtual bool onIsEqual(const GrEffect& other) const = 0;
|
| + virtual bool onIsEqual(const GrProcessor& other) const = 0;
|
|
|
| friend class GrGeometryProcessor; // to set fRequiresVertexShader and build fVertexAttribTypes.
|
|
|
| SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms;
|
| SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses;
|
| - VertexAttribArray fVertexAttribs;
|
| - bool fWillReadDstColor;
|
| bool fWillReadFragmentPosition;
|
| - bool fWillUseInputColor;
|
| - bool fRequiresVertexShader;
|
|
|
| typedef GrProgramElement INHERITED;
|
| };
|
|
|
| +class GrFragmentProcessor : public GrProcessor {
|
| +public:
|
| + GrFragmentProcessor()
|
| + : INHERITED()
|
| + , fWillReadDstColor(false)
|
| + , fWillUseInputColor(true) {}
|
| +
|
| + virtual const GrBackendFragmentProcessorFactory& getFactory() const = 0;
|
| +
|
| + /** Will this effect read the destination pixel value? */
|
| + bool willReadDstColor() const { return fWillReadDstColor; }
|
| +
|
| + /** Will this effect read the source color value? */
|
| + bool willUseInputColor() const { return fWillUseInputColor; }
|
| +
|
| +protected:
|
| + /**
|
| + * If the effect subclass will read the destination pixel value then it must call this function
|
| + * from its constructor. Otherwise, when its generated backend-specific effect class attempts
|
| + * to generate code that reads the destination pixel it will fail.
|
| + */
|
| + void setWillReadDstColor() { fWillReadDstColor = true; }
|
| +
|
| + /**
|
| + * If the effect will generate a result that does not depend on the input color value then it
|
| + * must call this function from its constructor. Otherwise, when its generated backend-specific
|
| + * code might fail during variable binding due to unused variables.
|
| + */
|
| + void setWillNotUseInputColor() { fWillUseInputColor = false; }
|
| +
|
| +private:
|
| + bool fWillReadDstColor;
|
| + bool fWillUseInputColor;
|
| +
|
| + typedef GrProcessor INHERITED;
|
| +};
|
| +
|
| /**
|
| * This creates an effect outside of the effect memory pool. The effect's destructor will be called
|
| - * at global destruction time. NAME will be the name of the created GrEffect.
|
| + * at global destruction time. NAME will be the name of the created GrProcessor.
|
| */
|
| -#define GR_CREATE_STATIC_EFFECT(NAME, EFFECT_CLASS, ARGS) \
|
| +#define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS) \
|
| static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage; \
|
| -static GrEffect* NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS); \
|
| -static SkAutoTDestroy<GrEffect> NAME##_ad(NAME);
|
| +static GrFragmentProcessor* \
|
| +NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS); \
|
| +static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME);
|
|
|
| #endif
|
|
|