Index: src/gpu/gl/GrGLProgramEffects.h |
diff --git a/src/gpu/gl/GrGLProgramEffects.h b/src/gpu/gl/GrGLProgramEffects.h |
index dd3feab8435147f1aebc99572ffc573901349948..8b870d4410c7bfe5510bc5a265f4e8be75b77d77 100644 |
--- a/src/gpu/gl/GrGLProgramEffects.h |
+++ b/src/gpu/gl/GrGLProgramEffects.h |
@@ -31,19 +31,6 @@ public: |
typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
typedef GrGLProgramDataManager::VaryingHandle VaryingHandle; |
- /** |
- * This class emits some of the code inserted into the shaders for an effect. The code it |
- * creates may be dependent on properties of the effect that the effect itself doesn't use |
- * in its key (e.g. the pixel format of textures used). So this class inserts a meta-key for |
- * every effect using this function. It is also responsible for inserting the effect's class ID |
- * which must be different for every GrEffect subclass. It can fail if an effect uses too many |
- * textures, attributes, etc for the space allotted in the meta-key. |
- */ |
- static bool GenEffectMetaKey(const GrEffectStage&, |
- bool, |
- const GrGLCaps&, |
- GrEffectKeyBuilder*); |
- |
virtual ~GrGLProgramEffects(); |
/** |
@@ -60,80 +47,13 @@ public: |
const GrGLProgramDataManager&, |
const GrEffectStage* effectStages[]) = 0; |
- virtual void setData(GrGpuGL*, |
- GrGpu::DrawType, |
- const GrGLProgramDataManager&, |
- const GrEffectStage* effectStages) { SkFAIL("DO NOT USE"); } |
- |
- void addEffect(GrGLEffect* effect) { fGLEffects.push_back(effect); } |
- |
- /** |
- * Passed to GrGLEffects so they can add transformed coordinates to their shader code. |
- */ |
- class TransformedCoords { |
- public: |
- TransformedCoords(const SkString& name, GrSLType type) |
- : fName(name), fType(type) { |
- } |
- |
- const char* c_str() const { return fName.c_str(); } |
- GrSLType type() const { return fType; } |
- const SkString& getName() const { return fName; } |
- |
- private: |
- SkString fName; |
- GrSLType fType; |
- }; |
- |
- typedef SkTArray<TransformedCoords> TransformedCoordsArray; |
- |
- /** |
- * Passed to GrGLEffects so they can add texture reads to their shader code. |
- */ |
- class TextureSampler { |
- public: |
- TextureSampler(UniformHandle uniform, const GrTextureAccess& access) |
- : fSamplerUniform(uniform) |
- , fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) { |
- SkASSERT(0 != fConfigComponentMask); |
- memcpy(fSwizzle, access.getSwizzle(), 5); |
- } |
- |
- UniformHandle samplerUniform() const { return fSamplerUniform; } |
- // bitfield of GrColorComponentFlags present in the texture's config. |
- uint32_t configComponentMask() const { return fConfigComponentMask; } |
- const char* swizzle() const { return fSwizzle; } |
- |
- private: |
- UniformHandle fSamplerUniform; |
- uint32_t fConfigComponentMask; |
- char fSwizzle[5]; |
- }; |
- |
- typedef SkTArray<TextureSampler> TextureSamplerArray; |
- |
protected: |
- |
- /** |
- * Helpers for GenEffectMetaKey. |
- */ |
- static uint32_t GenAttribKey(const GrEffect*); |
- static uint32_t GenTransformKey(const GrEffectStage&, bool useExplicitLocalCoords); |
- static uint32_t GenTextureKey(const GrEffect*, const GrGLCaps&); |
- |
GrGLProgramEffects(int reserveCount) |
: fGLEffects(reserveCount) |
, fSamplers(reserveCount) { |
} |
/** |
- * Helper for emitEffect() in a subclasses. Emits uniforms for an effect's texture accesses and |
- * appends the necessary data to the TextureSamplerArray* object so effects can add texture |
- * lookups to their code. This method is only meant to be called during the construction phase. |
- */ |
- void emitSamplers(GrGLProgramBuilder*, const GrEffect&, TextureSamplerArray*); |
- |
- /** |
* Helper for setData(). Binds all the textures for an effect. |
*/ |
void bindTextures(GrGpuGL*, const GrEffect&, int effectIdx); |
@@ -144,27 +64,21 @@ protected: |
int fTextureUnit; |
}; |
+ /* |
+ * Helpers for shader builders to build up program effects objects alongside shader code |
+ */ |
+ void addEffect(GrGLEffect* effect) { fGLEffects.push_back(effect); } |
+ SkTArray<Sampler, true>& addSamplers() { return fSamplers.push_back(); } |
+ |
SkTArray<GrGLEffect*> fGLEffects; |
SkTArray<SkSTArray<4, Sampler, true> > fSamplers; |
private: |
- typedef SkRefCnt INHERITED; |
-}; |
+ friend class GrGLProgramBuilder; |
+ friend class GrGLFullProgramBuilder; |
+ friend class GrGLFragmentOnlyShaderBuilder; |
-/** |
- * This is an abstract base class for constructing different types of GrGLProgramEffects objects. |
- */ |
-class GrGLProgramEffectsBuilder { |
-public: |
- virtual ~GrGLProgramEffectsBuilder() { } |
- /** |
- * Emits the effect's shader code, and stores the necessary uniforms internally. |
- */ |
- virtual void emitEffect(const GrEffectStage&, |
- const GrEffectKey&, |
- const char* outColor, |
- const char* inColor, |
- int stageIndex) = 0; |
+ typedef SkRefCnt INHERITED; |
}; |
//////////////////////////////////////////////////////////////////////////////// |
@@ -179,52 +93,12 @@ public: |
const GrGLProgramDataManager&, |
const GrEffectStage* effectStages[]) SK_OVERRIDE; |
- virtual void setData(GrGpuGL*, |
- GrGpu::DrawType, |
- const GrGLProgramDataManager&, |
- const GrEffectStage* effectStages) SK_OVERRIDE; |
- |
private: |
- friend class GrGLFullProgramBuilder; |
- |
GrGLVertexProgramEffects(int reserveCount, bool explicitLocalCoords) |
: INHERITED(reserveCount) |
, fTransforms(reserveCount) |
, fHasExplicitLocalCoords(explicitLocalCoords) { |
} |
- /** |
- * This method is meant to only be called during the construction phase. |
- */ |
- void emitEffect(GrGLFullProgramBuilder*, |
- const GrEffectStage&, |
- const GrEffectKey&, |
- const char* outColor, |
- const char* inColor, |
- int stageIndex); |
- |
- /** |
- * Helper for emitEffect(). Emits any attributes an effect may have. |
- */ |
- void emitAttributes(GrGLFullProgramBuilder*, const GrEffectStage&); |
- |
- /** |
- * Helper for emitEffect(). Emits code to implement an effect's coord transforms in the VS. |
- * Varyings are added as an outputs of the VS and inputs to the FS. The varyings may be either a |
- * vec2f or vec3f depending upon whether perspective interpolation is required or not. The names |
- * of the varyings in the VS and FS as well their types are appended to the |
- * TransformedCoordsArray* object, which is in turn passed to the effect's emitCode() function. |
- */ |
- void emitTransforms(GrGLFullProgramBuilder*, |
- const GrEffectStage&, |
- TransformedCoordsArray*); |
- |
- /** |
- * Helper for setData(). Sets all the transform matrices for an effect. |
- */ |
- void setTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, const GrEffectStage&, |
- int effectIdx); |
- void setPathTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, const GrEffectStage&, |
- int effectIdx); |
struct Transform { |
Transform() { fCurrentValue = SkMatrix::InvalidMatrix(); } |
@@ -239,38 +113,30 @@ private: |
GrSLType fType; |
}; |
+ /* |
+ * These functions are used by the builders to build up program effects along side the shader |
+ * code itself |
+ */ |
+ SkSTArray<2, Transform, true>& addTransforms() { return fTransforms.push_back(); } |
+ SkTArray<PathTransform, true>& addPathTransforms() { return fPathTransforms.push_back(); } |
+ |
+ /** |
+ * Helper for setData(). Sets all the transform matrices for an effect. |
+ */ |
+ void setTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, const GrEffectStage&, |
+ int effectIdx); |
+ void setPathTransformData(GrGpuGL* gpu, const GrGLProgramDataManager&, const GrEffectStage&, |
+ int effectIdx); |
+ |
SkTArray<SkSTArray<2, Transform, true> > fTransforms; |
SkTArray<SkTArray<PathTransform, true> > fPathTransforms; |
bool fHasExplicitLocalCoords; |
- friend class GrGLVertexProgramEffectsBuilder; |
+ friend class GrGLFullProgramBuilder; |
typedef GrGLProgramEffects INHERITED; |
}; |
-/** |
- * This class is used to construct a GrGLVertexProgramEffects* object. |
- */ |
-class GrGLVertexProgramEffectsBuilder : public GrGLProgramEffectsBuilder { |
-public: |
- GrGLVertexProgramEffectsBuilder(GrGLFullProgramBuilder*, int reserveCount); |
- virtual ~GrGLVertexProgramEffectsBuilder() { } |
- virtual void emitEffect(const GrEffectStage&, |
- const GrEffectKey&, |
- const char* outColor, |
- const char* inColor, |
- int stageIndex) SK_OVERRIDE; |
- /** |
- * Finalizes the building process and returns the effect array. After this call, the builder |
- * becomes invalid. |
- */ |
- GrGLProgramEffects* finish() { return fProgramEffects.detach(); } |
-private: |
- GrGLFullProgramBuilder* fBuilder; |
- SkAutoTDelete<GrGLVertexProgramEffects> fProgramEffects; |
- typedef GrGLProgramEffectsBuilder INHERITED; |
-}; |
- |
//////////////////////////////////////////////////////////////////////////////// |
/** |
@@ -285,75 +151,34 @@ public: |
const GrEffectStage* effectStages[]) SK_OVERRIDE; |
private: |
- friend class GrGLFragmentOnlyProgramBuilder; |
- |
GrGLPathTexGenProgramEffects(int reserveCount) |
: INHERITED(reserveCount) |
, fTransforms(reserveCount) { |
} |
/** |
- * This method is meant to only be called during the construction phase. |
- */ |
- void emitEffect(GrGLFragmentOnlyProgramBuilder*, |
- const GrEffectStage&, |
- const GrEffectKey&, |
- const char* outColor, |
- const char* inColor, |
- int stageIndex); |
- |
- /** |
- * Helper for emitEffect(). Allocates texture units from the builder for each transform in an |
- * effect. The transforms all use adjacent texture units. They either use two or three of the |
- * coordinates at a given texture unit, depending on if they need perspective interpolation. |
- * The expressions to access the transformed coords (i.e. 'vec2(gl_TexCoord[0])') as well as the |
- * types are appended to the TransformedCoordsArray* object, which is in turn passed to the |
- * effect's emitCode() function. |
- */ |
- void setupPathTexGen(GrGLFragmentOnlyProgramBuilder*, |
- const GrEffectStage&, |
- TransformedCoordsArray*); |
- |
- /** |
* Helper for setData(). Sets the PathTexGen state for each transform in an effect. |
*/ |
void setPathTexGenState(GrGpuGL*, const GrEffectStage&, int effectIdx); |
struct Transforms { |
- Transforms(uint32_t transformKey, int texCoordIndex) |
- : fTransformKey(transformKey), fTexCoordIndex(texCoordIndex) {} |
- uint32_t fTransformKey; |
- int fTexCoordIndex; |
+ Transforms(int texCoordIndex) |
+ : fTexCoordIndex(texCoordIndex) {} |
+ int fTexCoordIndex; |
}; |
+ /* |
+ * Helper for fragment only shader builder to build up the program effects alongside the shader |
+ */ |
+ void addTransforms(int coordIndex) { |
+ fTransforms.push_back(Transforms(coordIndex)); |
+ } |
+ |
SkTArray<Transforms> fTransforms; |
- friend class GrGLPathTexGenProgramEffectsBuilder; |
- typedef GrGLProgramEffects INHERITED; |
-}; |
+ friend class GrGLFragmentOnlyProgramBuilder; |
-/** |
- * This class is used to construct a GrGLPathTexGenProgramEffects* object. |
- */ |
-class GrGLPathTexGenProgramEffectsBuilder : public GrGLProgramEffectsBuilder { |
-public: |
- GrGLPathTexGenProgramEffectsBuilder(GrGLFragmentOnlyProgramBuilder*, int reserveCount); |
- virtual ~GrGLPathTexGenProgramEffectsBuilder() { } |
- virtual void emitEffect(const GrEffectStage&, |
- const GrEffectKey&, |
- const char* outColor, |
- const char* inColor, |
- int stageIndex) SK_OVERRIDE; |
- /** |
- * Finalizes the building process and returns the effect array. After this call, the builder |
- * becomes invalid. |
- */ |
- GrGLProgramEffects* finish() { return fProgramEffects.detach(); } |
-private: |
- GrGLFragmentOnlyProgramBuilder* fBuilder; |
- SkAutoTDelete<GrGLPathTexGenProgramEffects> fProgramEffects; |
- typedef GrGLProgramEffectsBuilder INHERITED; |
+ typedef GrGLProgramEffects INHERITED; |
}; |
- |
#endif |