Index: src/gpu/gl/GrGLProgram.h |
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h |
index 21593e351f2528523fec8bb2919dfa317bd789b8..fc441e5d76f9fe3e123fc5dad53ae078e4ffc9db 100644 |
--- a/src/gpu/gl/GrGLProgram.h |
+++ b/src/gpu/gl/GrGLProgram.h |
@@ -10,6 +10,7 @@ |
#define GrGLProgram_DEFINED |
#include "builders/GrGLProgramBuilder.h" |
+#include "builders/GrGLNvprProgramBuilder.h" |
#include "GrDrawState.h" |
#include "GrGLContext.h" |
#include "GrGLProgramDesc.h" |
@@ -21,7 +22,7 @@ |
#include "SkXfermode.h" |
class GrGLProcessor; |
-class GrGLProgramEffects; |
+class GrGLInstalledProcessors; |
class GrGLProgramBuilder; |
/** |
@@ -39,13 +40,6 @@ public: |
typedef GrGLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles; |
- static GrGLProgram* Create(GrGpuGL* gpu, |
- const GrOptDrawState& optState, |
- const GrGLProgramDesc& desc, |
- const GrGeometryStage* geometryProcessor, |
- const GrFragmentStage* colorStages[], |
- const GrFragmentStage* coverageStages[]); |
- |
virtual ~GrGLProgram(); |
/** |
@@ -60,7 +54,10 @@ public: |
*/ |
GrGLuint programID() const { return fProgramID; } |
- bool hasVertexShader() const { return fHasVertexShader; } |
+ /* |
+ * The base class always has a vertex shader, only the NVPR variants may omit a vertex shader |
+ */ |
+ virtual bool hasVertexShader() const { return true; } |
/** |
* Some GL state that is relevant to programs is not stored per-program. In particular color |
@@ -161,15 +158,22 @@ public: |
const GrDeviceCoordTexture* dstCopy, // can be NULL |
SharedGLState*); |
-private: |
+protected: |
typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
+ typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; |
GrGLProgram(GrGpuGL*, |
const GrGLProgramDesc&, |
- const GrGLProgramBuilder&); |
+ const BuiltinUniformHandles&, |
+ GrGLuint programID, |
+ const UniformInfoArray&, |
+ GrGLInstalledProcessors* geometryProcessor, |
+ GrGLInstalledProcessors* colorProcessors, |
+ GrGLInstalledProcessors* coverageProcessors); |
// Sets the texture units for samplers. |
void initSamplerUniforms(); |
+ void initSamplers(GrGLInstalledProcessors* processors, int* texUnitIdx); |
// Helper for setData(). Makes GL calls to specify the initial color when there is not |
// per-vertex colors. |
@@ -179,29 +183,134 @@ private: |
// per-vertex coverages. |
void setCoverage(const GrOptDrawState&, GrColor coverage, SharedGLState*); |
+ // A templated helper to loop over effects, set the transforms(via subclass) and bind textures |
+ template <class ProcessorStage> |
+ void setData(const ProcessorStage* effectStages[], |
+ GrGLInstalledProcessors* installedProcessors) { |
+ int numEffects = installedProcessors->fGLProcessors.count(); |
+ SkASSERT(numEffects == installedProcessors->fTransforms.count()); |
+ SkASSERT(numEffects == installedProcessors->fSamplers.count()); |
+ for (int e = 0; e < numEffects; ++e) { |
+ const GrProcessor& effect = *effectStages[e]->getProcessor(); |
+ installedProcessors->fGLProcessors[e]->setData(fProgramDataManager, effect); |
+ this->setTransformData(*effectStages[e], e, installedProcessors); |
+ this->bindTextures(installedProcessors, effect, e); |
+ } |
+ } |
+ virtual void setTransformData(const GrProcessorStage& effectStage, |
+ int effectIdx, |
+ GrGLInstalledProcessors* pe); |
+ void bindTextures(const GrGLInstalledProcessors*, const GrProcessor&, int effectIdx); |
+ |
+ /* |
+ * Legacy NVPR needs a hook here to flush path tex gen settings. |
+ * TODO when legacy nvpr is removed, remove this call. |
+ */ |
+ virtual void didSetData(GrGpu::DrawType); |
+ |
// Helper for setData() that sets the view matrix and loads the render target height uniform |
- void setMatrixAndRenderTargetHeight(GrGpu::DrawType drawType, const GrOptDrawState&); |
+ void setMatrixAndRenderTargetHeight(GrGpu::DrawType, const GrOptDrawState&); |
+ virtual void onSetMatrixAndRenderTargetHeight(GrGpu::DrawType, const GrOptDrawState&); |
// these reflect the current values of uniforms (GL uniform values travel with program) |
- MatrixState fMatrixState; |
- GrColor fColor; |
- GrColor fCoverage; |
- int fDstCopyTexUnit; |
+ MatrixState fMatrixState; |
+ GrColor fColor; |
+ GrColor fCoverage; |
+ int fDstCopyTexUnit; |
+ BuiltinUniformHandles fBuiltinUniformHandles; |
+ GrGLuint fProgramID; |
- BuiltinUniformHandles fBuiltinUniformHandles; |
- SkAutoTUnref<GrGLProgramEffects> fGeometryProcessor; |
- SkAutoTUnref<GrGLProgramEffects> fColorEffects; |
- SkAutoTUnref<GrGLProgramEffects> fCoverageEffects; |
- GrGLuint fProgramID; |
- bool fHasVertexShader; |
- int fTexCoordSetCnt; |
+ // the installed effects |
+ SkAutoTUnref<GrGLInstalledProcessors> fGeometryProcessor; |
+ SkAutoTUnref<GrGLInstalledProcessors> fColorEffects; |
+ SkAutoTUnref<GrGLInstalledProcessors> fCoverageEffects; |
- GrGLProgramDesc fDesc; |
- GrGpuGL* fGpu; |
+ GrGLProgramDesc fDesc; |
+ GrGpuGL* fGpu; |
+ GrGLProgramDataManager fProgramDataManager; |
- GrGLProgramDataManager fProgramDataManager; |
+ friend class GrGLProgramBuilder; |
typedef SkRefCnt INHERITED; |
}; |
+/* |
+ * Below are slight specializations of the program object for the different types of programs |
+ * The default GrGL programs consist of at the very least a vertex and fragment shader. |
+ * Legacy Nvpr only has a fragment shader, 1.3+ Nvpr ignores the vertex shader, but both require |
+ * specialized methods for setting transform data. Both types of NVPR also require setting the |
+ * projection matrix through a special function call |
+ */ |
+class GrGLNvprProgramBase : public GrGLProgram { |
+protected: |
+ GrGLNvprProgramBase(GrGpuGL*, |
+ const GrGLProgramDesc&, |
+ const BuiltinUniformHandles&, |
+ GrGLuint programID, |
+ const UniformInfoArray&, |
+ GrGLInstalledProcessors* colorProcessors, |
+ GrGLInstalledProcessors* coverageProcessors); |
+ virtual void onSetMatrixAndRenderTargetHeight(GrGpu::DrawType, const GrOptDrawState&); |
+ |
+ typedef GrGLProgram INHERITED; |
+}; |
+ |
+class GrGLNvprProgram : public GrGLNvprProgramBase { |
+public: |
+ virtual bool hasVertexShader() const SK_OVERRIDE { return true; } |
+ |
+private: |
+ typedef GrGLNvprProgramBuilder::SeparableVaryingInfo SeparableVaryingInfo; |
+ typedef GrGLNvprProgramBuilder::SeparableVaryingInfoArray SeparableVaryingInfoArray; |
+ GrGLNvprProgram(GrGpuGL*, |
+ const GrGLProgramDesc&, |
+ const BuiltinUniformHandles&, |
+ GrGLuint programID, |
+ const UniformInfoArray&, |
+ GrGLInstalledProcessors* colorProcessors, |
+ GrGLInstalledProcessors* coverageProcessors, |
+ const SeparableVaryingInfoArray& separableVaryings); |
+ virtual void didSetData(GrGpu::DrawType) SK_OVERRIDE; |
+ virtual void setTransformData(const GrProcessorStage&, |
+ int effectIdx, |
+ GrGLInstalledProcessors*) SK_OVERRIDE; |
+ |
+ struct Varying { |
+ GrGLint fLocation; |
+ SkDEBUGCODE( |
+ GrSLType fType; |
+ ); |
+ }; |
+ SkTArray<Varying, true> fVaryings; |
+ |
+ friend class GrGLNvprProgramBuilder; |
+ |
+ typedef GrGLNvprProgramBase INHERITED; |
+}; |
+ |
+class GrGLLegacyNvprProgram : public GrGLNvprProgramBase { |
+public: |
+ virtual bool hasVertexShader() const SK_OVERRIDE { return false; } |
+ |
+private: |
+ GrGLLegacyNvprProgram(GrGpuGL* gpu, |
+ const GrGLProgramDesc& desc, |
+ const BuiltinUniformHandles&, |
+ GrGLuint programID, |
+ const UniformInfoArray&, |
+ GrGLInstalledProcessors* colorProcessors, |
+ GrGLInstalledProcessors* coverageProcessors, |
+ int texCoordSetCnt); |
+ virtual void didSetData(GrGpu::DrawType) SK_OVERRIDE; |
+ virtual void setTransformData(const GrProcessorStage&, |
+ int effectIdx, |
+ GrGLInstalledProcessors*) SK_OVERRIDE; |
+ |
+ int fTexCoordSetCnt; |
+ |
+ friend class GrGLLegacyNvprProgramBuilder; |
+ |
+ typedef GrGLNvprProgramBase INHERITED; |
+}; |
+ |
#endif |