Index: src/gpu/gl/GrGLCoordTransform.h |
diff --git a/src/gpu/gl/GrGLCoordTransform.h b/src/gpu/gl/GrGLCoordTransform.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd2f38a028356eb51e1027eb3368d10c23d71383 |
--- /dev/null |
+++ b/src/gpu/gl/GrGLCoordTransform.h |
@@ -0,0 +1,109 @@ |
+/* |
+ * Copyright 2012 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrGLCoordTransform_DEFINED |
+#define GrGLCoordTransform_DEFINED |
+ |
+#include "GrBackendEffectFactory.h" |
+#include "GrCoordTransform.h" |
+#include "GrGLUniformManager.h" |
+ |
+class GrTexture; |
+class GrGLShaderBuilder; |
+ |
+/** |
+ * This is a helper class used by the framework to implement a coordinate transform that operates on |
+ * incoming coords in the vertex shader and writes them to a varying to be used in the fragment |
+ * shader. Effects should not use this class directly, but instead call GrEffect::addCoordTransform. |
+ * When the input coords are local coordinates this class accounts for the coord change matrix |
+ * communicated via GrDrawEffect. The input coords may also be positions and in this case the coord |
+ * change matrix is ignored. The GrGLCoordTransform may emit different code based on the type of |
+ * matrix and thus must contribute to the effect's key. |
+ * |
+ * This class cannot be used to apply a matrix to coordinates that come in the form of custom vertex |
+ * attributes. |
+ */ |
+class GrGLCoordTransform { |
+private: |
+ // We specialize the generated code for each of these matrix types. |
+ enum MatrixTypes { |
+ kIdentity_MatrixType = 0, |
+ kTrans_MatrixType = 1, |
+ kNoPersp_MatrixType = 2, |
+ kGeneral_MatrixType = 3, |
+ }; |
+ // The key for is made up of a matrix type and a bit that indicates the source of the input |
+ // coords. |
+ enum { |
+ kMatrixTypeKeyBits = 2, |
+ kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1, |
+ kPositionCoords_Flag = (1 << kMatrixTypeKeyBits), |
+ kKeyBitsPrivate = kMatrixTypeKeyBits + 1, |
+ }; |
+ |
+public: |
+ |
+ typedef GrBackendEffectFactory::EffectKey EffectKey; |
+ |
+ /** |
+ * A GrGLCoordTransform key is kKeyBits long. The framework automatically generates and includes |
+ * these in EffectKeys. |
+ */ |
+ enum { |
+ kKeyBits = kKeyBitsPrivate, |
+ kKeyMask = (1 << kKeyBits) - 1, |
+ }; |
+ |
+ GrGLCoordTransform() { fPrevMatrix = SkMatrix::InvalidMatrix(); } |
+ |
+ /** |
+ * Generates the key for the portion of the code emitted by this class's emitCode() function. |
+ */ |
+ static EffectKey GenKey(const GrDrawEffect&, int transformIdx); |
+ |
+ /** |
+ * Stores the name and type of a transformed set of coordinates. This class is passed to |
+ * GrGLEffect::emitCode. |
+ */ |
+ class TransformedCoords { |
+ public: |
+ const char* c_str() const { return fName.c_str(); } |
+ GrSLType type() const { return fType; } |
+ const SkString& getName() const { return fName; } |
+ // TODO: Remove the VS name when we have vertexless shaders, and gradients are reworked. |
+ const SkString& getVSName() const { return fVSName; } |
+ |
+ private: |
+ friend class GrGLCoordTransform; |
+ |
+ SkString fName; |
+ GrSLType fType; |
+ SkString fVSName; |
+ }; |
+ |
+ /** |
+ * Emits code to implement the matrix in the VS. A varying is added as an output of the VS and |
+ * input to the FS. The varying may be either a vec2f or vec3f depending upon whether |
+ * perspective interpolation is required or not. The names of the varying in the VS and FS as |
+ * well as its type are written to the TransformedCoords* object. The suffix is an optional |
+ * parameter that can be used to make all variables emitted by the object unique within a stage. |
+ * It is only necessary if multiple GrGLCoordTransform objects are used by a single GrGLEffect. |
+ */ |
+ void emitCode(GrGLShaderBuilder*, EffectKey, TransformedCoords*, int suffix = 0); |
+ |
+ /** |
+ * Call from a GrGLEffect's subclass to update the texture matrix. The matrix and reverseY value |
+ * should match those used with GenKey. |
+ */ |
+ void setData(const GrGLUniformManager&, const GrDrawEffect&, int transformIdx); |
+ |
+ GrGLUniformManager::UniformHandle fUni; |
+ GrSLType fUniType; |
+ SkMatrix fPrevMatrix; |
+}; |
+ |
+#endif |