Chromium Code Reviews| Index: src/gpu/gl/GrGLGeometryProcessor.h |
| diff --git a/src/gpu/gl/GrGLGeometryProcessor.h b/src/gpu/gl/GrGLGeometryProcessor.h |
| index 0b24144d8459542a7192bdf24005b7c2d6171b4e..dbc6a4612a59b24c2efc9d129a67fa1c0dd47f91 100644 |
| --- a/src/gpu/gl/GrGLGeometryProcessor.h |
| +++ b/src/gpu/gl/GrGLGeometryProcessor.h |
| @@ -11,57 +11,67 @@ |
| #include "GrGLProcessor.h" |
| class GrBatchTracker; |
| +class GrFragmentProcessor; |
| class GrGLGPBuilder; |
| -/** |
| - * If a GL effect needs a GrGLFullShaderBuilder* object to emit vertex code, then it must inherit |
| - * from this class. Since paths don't have vertices, this class is only meant to be used internally |
| - * by skia, for special cases. |
| - */ |
| -class GrGLGeometryProcessor { |
| +class GrGLPrimitiveProcessor { |
| public: |
| - GrGLGeometryProcessor() : fViewMatrixName(NULL) { fViewMatrix = SkMatrix::InvalidMatrix(); } |
| - virtual ~GrGLGeometryProcessor() {} |
| + GrGLPrimitiveProcessor() : fViewMatrixName(NULL) { fViewMatrix = SkMatrix::InvalidMatrix(); } |
| + virtual ~GrGLPrimitiveProcessor() {} |
| typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| typedef GrGLProcessor::TextureSamplerArray TextureSamplerArray; |
| + typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords; |
| + typedef SkSTArray<8, ProcCoords> TransformsIn; |
| + typedef SkSTArray<8, GrGLProcessor::TransformedCoordsArray> TransformsOut; |
| + |
| struct EmitArgs { |
| EmitArgs(GrGLGPBuilder* pb, |
| const GrPrimitiveProcessor& gp, |
| const GrBatchTracker& bt, |
| const char* outputColor, |
| const char* outputCoverage, |
| - const TextureSamplerArray& samplers) |
| + const TextureSamplerArray& samplers, |
| + const TransformsIn& transformsIn, |
| + TransformsOut* transformsOut) |
| : fPB(pb) |
| , fGP(gp) |
| , fBT(bt) |
| , fOutputColor(outputColor) |
| , fOutputCoverage(outputCoverage) |
| - , fSamplers(samplers) {} |
| + , fSamplers(samplers) |
| + , fTransformsIn(transformsIn) |
| + , fTransformsOut(transformsOut) {} |
| GrGLGPBuilder* fPB; |
| const GrPrimitiveProcessor& fGP; |
| const GrBatchTracker& fBT; |
| const char* fOutputColor; |
| const char* fOutputCoverage; |
| const TextureSamplerArray& fSamplers; |
| + const TransformsIn& fTransformsIn; |
| + TransformsOut* fTransformsOut; |
| }; |
| /** |
| * This is similar to emitCode() in the base class, except it takes a full shader builder. |
| * This allows the effect subclass to emit vertex code. |
| */ |
| - virtual void emitCode(const EmitArgs&) = 0; |
| + virtual void emitCode(EmitArgs&) = 0; |
| + |
| - /** A GrGLGeometryProcessor instance can be reused with any GrGLGeometryProcessor that produces |
| - the same stage key; this function reads data from a GrGLGeometryProcessor and uploads any |
| - uniform variables required by the shaders created in emitCode(). The GrGeometryProcessor |
| - parameter is guaranteed to be of the same type that created this GrGLGeometryProcessor and |
| - to have an identical processor key as the one that created this GrGLGeometryProcessor. */ |
| + /** A GrGLPrimitiveProcessor instance can be reused with any GrGLPrimitiveProcessor that |
| + produces the same stage key; this function reads data from a GrGLPrimitiveProcessor and |
| + uploads any uniform variables required by the shaders created in emitCode(). The |
| + GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this |
| + GrGLPrimitiveProcessor and to have an identical processor key as the one that created this |
| + GrGLPrimitiveProcessor. */ |
| virtual void setData(const GrGLProgramDataManager&, |
| const GrPrimitiveProcessor&, |
| const GrBatchTracker&) = 0; |
| + static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&); |
| + |
| protected: |
| /** a helper which can setup vertex, constant, or uniform color depending on inputType. |
| * This function will only do the minimum required to emit the correct shader code. If |
| @@ -86,12 +96,110 @@ protected: |
| void setUniformViewMatrix(const GrGLProgramDataManager&, |
| const SkMatrix& viewMatrix); |
| + class ShaderVarHandle { |
| + public: |
| + bool isValid() const { return fHandle > -1; } |
| + ShaderVarHandle() : fHandle(-1) {} |
| + ShaderVarHandle(int value) : fHandle(value) { SkASSERT(this->isValid()); } |
| + int handle() const { SkASSERT(this->isValid()); return fHandle; } |
| + UniformHandle convertToUniformHandle() { |
| + SkASSERT(this->isValid()); |
| + return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fHandle); |
| + } |
| + |
| + private: |
| + int fHandle; |
| + }; |
| + |
| + struct Transform { |
| + Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); } |
| + ShaderVarHandle fHandle; |
| + SkMatrix fCurrentValue; |
| + GrSLType fType; |
| + }; |
| + |
| + SkSTArray<8, SkSTArray<2, Transform, true> > fInstalledTransforms; |
| + |
| private: |
| UniformHandle fViewMatrixUniform; |
| SkMatrix fViewMatrix; |
| const char* fViewMatrixName; |
| +}; |
| + |
| +class GrGLPathRendering; |
| +/** |
| + * If a GL effect needs a GrGLFullShaderBuilder* object to emit vertex code, then it must inherit |
| + * from this class. Since paths don't have vertices, this class is only meant to be used internally |
| + * by skia, for special cases. |
| + */ |
| +class GrGLGeometryProcessor : public GrGLPrimitiveProcessor { |
| +public: |
| + /* Any general emit code goes in the base class emitCode. Subclasses override onEmitCode */ |
| + void emitCode(EmitArgs&) SK_OVERRIDE; |
| + virtual void onEmitCode(EmitArgs&) = 0; |
|
bsalomon
2015/01/13 21:55:13
Shoulnd't onEmitCode be private?
|
| + |
| + void setTransformData(const GrPrimitiveProcessor*, |
| + const GrGLProgramDataManager&, |
| + int index, |
| + const SkTArray<const GrCoordTransform*, true>& transforms); |
| + |
| +protected: |
| + const char* position() const { return "pos3"; } |
| + |
| + // Many GrGeometryProcessors do not need explicit local coords |
| + void emitTransforms(GrGLGPBuilder* gp, |
| + const char* position, |
| + const SkMatrix& localMatrix, |
| + const TransformsIn& tin, |
| + TransformsOut* tout) { |
| + this->emitTransforms(gp, position, position, localMatrix, tin, tout); |
| + } |
| + |
| + void emitTransforms(GrGLGPBuilder*, |
| + const char* position, |
| + const char* localCoords, |
| + const SkMatrix& localMatrix, |
| + const TransformsIn&, |
| + TransformsOut*); |
| + |
| +private: |
| + typedef GrGLPrimitiveProcessor INHERITED; |
| +}; |
| + |
| +class GrGLGpu; |
| + |
| +class GrGLPathProcessor : public GrGLPrimitiveProcessor { |
| +public: |
| + GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracker&); |
| + |
| + static void GenKey(const GrPathProcessor&, |
| + const GrBatchTracker& bt, |
| + const GrGLCaps&, |
| + GrProcessorKeyBuilder* b); |
| + |
| + void emitCode(EmitArgs&) SK_OVERRIDE; |
| + |
| + virtual void emitTransforms(GrGLGPBuilder*, const TransformsIn&, TransformsOut*) = 0; |
| + |
| + virtual void resolveSeparableVaryings(GrGLGpu* gpu, GrGLuint programId) {} |
| + |
| + void setData(const GrGLProgramDataManager&, |
| + const GrPrimitiveProcessor&, |
| + const GrBatchTracker&) SK_OVERRIDE; |
| + |
| + virtual void setTransformData(const GrPrimitiveProcessor*, |
| + int index, |
| + const SkTArray<const GrCoordTransform*, true>& transforms, |
| + GrGLPathRendering*, |
| + GrGLuint programID) = 0; |
| + |
| + virtual void didSetData(GrGLPathRendering*) {} |
| + |
| +private: |
| + UniformHandle fColorUniform; |
| + GrColor fColor; |
| - typedef GrGLProcessor INHERITED; |
| + typedef GrGLPrimitiveProcessor INHERITED; |
| }; |
| #endif |