Index: src/gpu/gl/GrGLGeometryProcessor.h |
diff --git a/src/gpu/gl/GrGLGeometryProcessor.h b/src/gpu/gl/GrGLGeometryProcessor.h |
index 0b24144d8459542a7192bdf24005b7c2d6171b4e..524cdf3aa9ba351583506e5791401e9558097011 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,111 @@ 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; |
+ |
+ 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: |
+ virtual void onEmitCode(EmitArgs&) = 0; |
+ |
+ 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 |