Index: src/gpu/gl/builders/GrGLProgramBuilder.h |
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h |
index 6141058152b88546f12bb9c2aefc29eb9c151a73..2afdd099f4322abf2246bedb0181137159808df0 100644 |
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h |
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h |
@@ -13,8 +13,7 @@ |
#include "GrGLVertexShaderBuilder.h" |
#include "../GrGLProgramDataManager.h" |
#include "../GrGLUniformHandle.h" |
- |
-class GrGLInstalledProcessors; |
+#include "../GrGLGeometryProcessor.h" |
/* |
* This is the base class for a series of interfaces. This base class *MUST* remain abstract with |
@@ -98,6 +97,11 @@ public: |
*/ |
}; |
+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. |
@@ -118,9 +122,6 @@ public: |
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,11 +151,12 @@ public: |
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); |
+ virtual void addVarying( |
+ GrSLType type, |
+ const char* name, |
+ const char** vsOutName = NULL, |
+ const char** fsInName = NULL, |
+ GrGLShaderVar::Precision fsPrecision=GrGLShaderVar::kDefault_Precision) SK_OVERRIDE; |
// Handles for program uniforms (other than per-effect uniforms) |
struct BuiltinUniformHandles { |
@@ -174,6 +176,10 @@ public: |
}; |
protected: |
+ typedef GrGLProgramDesc::ProcKeyProvider ProcKeyProvider; |
+ typedef GrGLProgramDataManager::UniformInfo UniformInfo; |
+ typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; |
+ |
static GrGLProgramBuilder* CreateProgramBuilder(const GrGLProgramDesc&, |
const GrOptDrawState&, |
GrGpu::DrawType, |
@@ -191,32 +197,40 @@ protected: |
// generating stage code. |
void nameVariable(SkString* out, char prefix, const char* name); |
void setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage); |
- 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 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 verify(const GrGeometryProcessor&); |
void verify(const GrFragmentProcessor&); |
void emitSamplers(const GrProcessor&, |
GrGLProcessor::TextureSamplerArray* outSamplers, |
- GrGLInstalledProcessors*); |
+ GrGLInstalledProc*); |
// each specific program builder has a distinct transform and must override this function |
- virtual void emitTransforms(const GrProcessorStage&, |
+ virtual void emitTransforms(const GrFragmentStage&, |
GrGLProcessor::TransformedCoordsArray* outCoords, |
- GrGLInstalledProcessors*); |
+ GrGLInstalledFragProc*); |
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); |
@@ -256,10 +270,6 @@ protected: |
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; |
@@ -270,9 +280,8 @@ protected: |
bool fOutOfStage; |
int fStageIndex; |
- SkAutoTUnref<GrGLInstalledProcessors> fGeometryProcessor; |
- SkAutoTUnref<GrGLInstalledProcessors> fColorEffects; |
- SkAutoTUnref<GrGLInstalledProcessors> fCoverageEffects; |
+ GrGLInstalledGeoProc* fGeometryProcessor; |
+ SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors; |
const GrOptDrawState& fOptState; |
const GrGLProgramDesc& fDesc; |
@@ -286,32 +295,26 @@ protected: |
}; |
/** |
- * 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 |
+ * 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 |
*/ |
-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 GrGLInstalledProc { |
+ typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
+ |
+ struct Sampler { |
+ SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) |
+ UniformHandle fUniform; |
+ int fTextureUnit; |
+ }; |
+ SkSTArray<4, Sampler, true> fSamplers; |
+}; |
- struct Sampler { |
- SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) |
- UniformHandle fUniform; |
- int fTextureUnit; |
- }; |
+struct GrGLInstalledGeoProc : public GrGLInstalledProc { |
+ SkAutoTDelete<GrGLGeometryProcessor> fGLProc; |
+}; |
+struct GrGLInstalledFragProc : public GrGLInstalledProc { |
+ GrGLInstalledFragProc(bool useLocalCoords) : fGLProc(NULL), fLocalCoordAttrib(useLocalCoords) {} |
class ShaderVarHandle { |
public: |
bool isValid() const { return fHandle > -1; } |
@@ -334,19 +337,14 @@ public: |
GrSLType fType; |
}; |
- 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; |
+ SkAutoTDelete<GrGLFragmentProcessor> fGLProc; |
+ SkSTArray<2, Transform, true> fTransforms; |
+ bool fLocalCoordAttrib; |
+}; |
- friend class GrGLShaderBuilder; |
- friend class GrGLVertexShaderBuilder; |
- friend class GrGLFragmentShaderBuilder; |
- friend class GrGLGeometryShaderBuilder; |
+struct GrGLInstalledFragProcs : public SkRefCnt { |
+ virtual ~GrGLInstalledFragProcs(); |
+ SkSTArray<8, GrGLInstalledFragProc*, true> fProcs; |
}; |
#endif |