Index: src/gpu/gl/builders/GrGLProgramBuilder.h |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h |
index a8293545b20d6cada3a847a950ba5e3fcdc4fb3e..6141058152b88546f12bb9c2aefc29eb9c151a73 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h |
@@ -13,6 +13,8 @@ |
#include "GrGLVertexShaderBuilder.h" |
#include "../GrGLProgramDataManager.h" |
#include "../GrGLUniformHandle.h" |
+ |
+class GrGLInstalledProcessors; |
/* |
* This is the base class for a series of interfaces. This base class *MUST* remain abstract with |
@@ -96,11 +98,6 @@ |
*/ |
}; |
-struct GrGLInstalledProc; |
-struct GrGLInstalledGeoProc; |
-struct GrGLInstalledFragProc; |
-struct GrGLInstalledFragProcs; |
- |
/* |
* Please note - no diamond problems because of virtual inheritance. Also, both base classes |
* are pure virtual with no data members. This is the base class for program building. |
@@ -121,6 +118,9 @@ |
static GrGLProgram* CreateProgram(const GrOptDrawState&, |
const GrGLProgramDesc&, |
GrGpu::DrawType, |
+ const GrGeometryStage* inGeometryProcessor, |
+ const GrFragmentStage* inColorStages[], |
+ const GrFragmentStage* inCoverageStages[], |
GrGpuGL* gpu); |
virtual UniformHandle addUniform(uint32_t visibility, |
@@ -150,12 +150,11 @@ |
virtual GrGLFPFragmentBuilder* getFragmentShaderBuilder() SK_OVERRIDE { return &fFS; } |
virtual GrGLVertexBuilder* getVertexShaderBuilder() SK_OVERRIDE { return &fVS; } |
- virtual void addVarying( |
- GrSLType type, |
- const char* name, |
- const char** vsOutName = NULL, |
- const char** fsInName = NULL, |
- GrGLShaderVar::Precision fsPrecision=GrGLShaderVar::kDefault_Precision) SK_OVERRIDE; |
+ virtual void addVarying(GrSLType type, |
+ const char* name, |
+ const char** vsOutName = NULL, |
+ const char** fsInName = NULL, |
+ GrGLShaderVar::Precision fsPrecision=GrGLShaderVar::kDefault_Precision); |
// Handles for program uniforms (other than per-effect uniforms) |
struct BuiltinUniformHandles { |
@@ -175,10 +174,6 @@ |
}; |
protected: |
- typedef GrGLProgramDesc::ProcKeyProvider ProcKeyProvider; |
- typedef GrGLProgramDataManager::UniformInfo UniformInfo; |
- typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; |
- |
static GrGLProgramBuilder* CreateProgramBuilder(const GrGLProgramDesc&, |
const GrOptDrawState&, |
GrGpu::DrawType, |
@@ -196,40 +191,32 @@ |
// generating stage code. |
void nameVariable(SkString* out, char prefix, const char* name); |
void setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage); |
- void emitAndInstallProcs(const GrOptDrawState& optState, |
- GrGLSLExpr4* inputColor, |
- GrGLSLExpr4* inputCoverage); |
- void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut); |
- template <class Proc> |
- void emitAndInstallProc(const Proc&, |
- int index, |
- const ProcKeyProvider, |
- const GrGLSLExpr4& input, |
- GrGLSLExpr4* output); |
- |
- // these emit functions help to keep the createAndEmitProcessors template general |
- void emitAndInstallProc(const GrFragmentStage&, |
- const GrProcessorKey&, |
- const char* outColor, |
- const char* inColor); |
- void emitAndInstallProc(const GrGeometryProcessor&, |
- const GrProcessorKey&, |
- const char* outColor, |
- const char* inColor); |
+ void createAndEmitProcessors(const GrGeometryStage* geometryProcessor, |
+ const GrFragmentStage* colorStages[], |
+ const GrFragmentStage* coverageStages[], |
+ GrGLSLExpr4* inputColor, |
+ GrGLSLExpr4* inputCoverage); |
+ template <class ProcessorStage> |
+ void createAndEmitProcessors(const ProcessorStage*[], |
+ int effectCnt, |
+ const GrGLProgramDesc::EffectKeyProvider&, |
+ GrGLSLExpr4* fsInOutColor, |
+ GrGLInstalledProcessors*); |
void verify(const GrGeometryProcessor&); |
void verify(const GrFragmentProcessor&); |
void emitSamplers(const GrProcessor&, |
GrGLProcessor::TextureSamplerArray* outSamplers, |
- GrGLInstalledProc*); |
+ GrGLInstalledProcessors*); |
// each specific program builder has a distinct transform and must override this function |
- virtual void emitTransforms(const GrFragmentStage&, |
+ virtual void emitTransforms(const GrProcessorStage&, |
GrGLProcessor::TransformedCoordsArray* outCoords, |
- GrGLInstalledFragProc*); |
+ GrGLInstalledProcessors*); |
GrGLProgram* finalize(); |
void bindUniformLocations(GrGLuint programID); |
bool checkLinkStatus(GrGLuint programID); |
void resolveUniformLocations(GrGLuint programID); |
+ |
void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs); |
void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs); |
@@ -269,6 +256,10 @@ |
void enterStage() { fOutOfStage = false; } |
int stageIndex() const { return fStageIndex; } |
+ typedef GrGLProgramDesc::EffectKeyProvider EffectKeyProvider; |
+ typedef GrGLProgramDataManager::UniformInfo UniformInfo; |
+ typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; |
+ |
// number of each input/output type in a single allocation block, used by many builders |
static const int kVarsPerBlock; |
@@ -279,8 +270,9 @@ |
bool fOutOfStage; |
int fStageIndex; |
- GrGLInstalledGeoProc* fGeometryProcessor; |
- SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors; |
+ SkAutoTUnref<GrGLInstalledProcessors> fGeometryProcessor; |
+ SkAutoTUnref<GrGLInstalledProcessors> fColorEffects; |
+ SkAutoTUnref<GrGLInstalledProcessors> fCoverageEffects; |
const GrOptDrawState& fOptState; |
const GrGLProgramDesc& fDesc; |
@@ -294,26 +286,32 @@ |
}; |
/** |
- * The below structs represent processors installed in programs. All processors can have texture |
- * samplers, but only frag processors have coord transforms, hence the need for different structs |
+ * This class encapsulates an array of GrGLProcessors and their supporting data (coord transforms |
+ * and textures). It is built by GrGLProgramBuilder, then used to manage the necessary GL |
+ * state and shader uniforms in GLPrograms. Its just Plain old data, and as such is entirely public |
+ * |
+ * TODO We really don't need this class to have an array of processors. It makes sense for it |
+ * to just have one, also break out the transforms |
*/ |
-struct GrGLInstalledProc { |
- typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
- |
- struct Sampler { |
- SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) |
- UniformHandle fUniform; |
- int fTextureUnit; |
- }; |
- SkSTArray<4, Sampler, true> fSamplers; |
-}; |
- |
-struct GrGLInstalledGeoProc : public GrGLInstalledProc { |
- GrGLGeometryProcessor* fGLProc; |
-}; |
- |
-struct GrGLInstalledFragProc : public GrGLInstalledProc { |
- GrGLInstalledFragProc(bool useLocalCoords) : fGLProc(NULL), fLocalCoordAttrib(useLocalCoords) {} |
+class GrGLInstalledProcessors : public SkRefCnt { |
+public: |
+ GrGLInstalledProcessors(int reserveCount, bool hasExplicitLocalCoords = false) |
+ : fGLProcessors(reserveCount) |
+ , fSamplers(reserveCount) |
+ , fTransforms(reserveCount) |
+ , fHasExplicitLocalCoords(hasExplicitLocalCoords) { |
+ } |
+ |
+ virtual ~GrGLInstalledProcessors(); |
+ |
+ typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
+ |
+ struct Sampler { |
+ SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) |
+ UniformHandle fUniform; |
+ int fTextureUnit; |
+ }; |
+ |
class ShaderVarHandle { |
public: |
bool isValid() const { return fHandle > -1; } |
@@ -336,14 +334,19 @@ |
GrSLType fType; |
}; |
- GrGLFragmentProcessor* fGLProc; |
- SkSTArray<2, Transform, true> fTransforms; |
- bool fLocalCoordAttrib; |
-}; |
- |
-struct GrGLInstalledFragProcs : public SkRefCnt { |
- ~GrGLInstalledFragProcs(); |
- SkSTArray<8, GrGLInstalledFragProc*, true> fProcs; |
+ void addEffect(GrGLProcessor* effect) { fGLProcessors.push_back(effect); } |
+ SkTArray<Sampler, true>& addSamplers() { return fSamplers.push_back(); } |
+ SkTArray<Transform, true>& addTransforms() { return fTransforms.push_back(); } |
+ |
+ SkTArray<GrGLProcessor*> fGLProcessors; |
+ SkTArray<SkSTArray<4, Sampler, true> > fSamplers; |
+ SkTArray<SkSTArray<2, Transform, true> > fTransforms; |
+ bool fHasExplicitLocalCoords; |
+ |
+ friend class GrGLShaderBuilder; |
+ friend class GrGLVertexShaderBuilder; |
+ friend class GrGLFragmentShaderBuilder; |
+ friend class GrGLGeometryShaderBuilder; |
}; |
#endif |