/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLSLGeometryProcessor_DEFINED #define GrGLSLGeometryProcessor_DEFINED #include "GrGLSLPrimitiveProcessor.h" class GrGLSLGPBuilder; /** * 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 GrGLSLGeometryProcessor : public GrGLSLPrimitiveProcessor { public: /* Any general emit code goes in the base class emitCode. Subclasses override onEmitCode */ void emitCode(EmitArgs&) override; protected: // A helper which subclasses can use if needed and used above in the default setTransformData(). void setTransformDataHelper(const SkMatrix& localMatrix, const GrGLSLProgramDataManager& pdman, FPCoordTransformIter*); // Emit a uniform matrix for each coord transform. void emitTransforms(GrGLSLVertexBuilder* vb, GrGLSLVaryingHandler* varyingHandler, GrGLSLUniformHandler* uniformHandler, const GrShaderVar& posVar, const char* localCoords, FPCoordTransformHandler* handler) { this->emitTransforms(vb, varyingHandler, uniformHandler, posVar, localCoords, SkMatrix::I(), handler); } // Emit pre-transformed coords as a vertex attribute per coord-transform. void emitTransforms(GrGLSLVertexBuilder*, GrGLSLVaryingHandler*, GrGLSLUniformHandler*, const GrShaderVar& posVar, const char* localCoords, const SkMatrix& localMatrix, FPCoordTransformHandler*); struct GrGPArgs { // The variable used by a GP to store its position. It can be // either a vec2 or a vec3 depending on the presence of perspective. GrShaderVar fPositionVar; }; // Create the correct type of position variable given the CTM void setupPosition(GrGLSLVertexBuilder*, GrGPArgs*, const char* posName); void setupPosition(GrGLSLVertexBuilder*, GrGLSLUniformHandler* uniformHandler, GrGPArgs*, const char* posName, const SkMatrix& mat, UniformHandle* viewMatrixUniform); static uint32_t ComputePosKey(const SkMatrix& mat) { if (mat.isIdentity()) { return 0x0; } else if (!mat.hasPerspective()) { return 0x01; } else { return 0x02; } } private: virtual void onEmitCode(EmitArgs&, GrGPArgs*) = 0; struct TransformUniform { UniformHandle fHandle; SkMatrix fCurrentValue = SkMatrix::InvalidMatrix(); }; SkTArray<TransformUniform, true> fInstalledTransforms; typedef GrGLSLPrimitiveProcessor INHERITED; }; #endif