C++11 override should now be supported by all of {bots,Chrome,Android,Mozilla}
[platform/upstream/libSkiaSharp.git] / src / gpu / gl / GrGLGeometryProcessor.h
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #ifndef GrGLGeometryProcessor_DEFINED
9 #define GrGLGeometryProcessor_DEFINED
10
11 #include "GrGLPrimitiveProcessor.h"
12
13 class GrGLGPBuilder;
14
15 /**
16  * If a GL effect needs a GrGLFullShaderBuilder* object to emit vertex code, then it must inherit
17  * from this class. Since paths don't have vertices, this class is only meant to be used internally
18  * by skia, for special cases.
19  */
20 class GrGLGeometryProcessor : public GrGLPrimitiveProcessor {
21 public:
22     /* Any general emit code goes in the base class emitCode.  Subclasses override onEmitCode */
23     void emitCode(EmitArgs&) override;
24
25     void setTransformData(const GrPrimitiveProcessor&,
26                           const GrGLProgramDataManager&,
27                           int index,
28                           const SkTArray<const GrCoordTransform*, true>& transforms);
29
30 protected:
31     // Many GrGeometryProcessors do not need explicit local coords
32     void emitTransforms(GrGLGPBuilder* gp,
33                         const GrShaderVar& posVar,
34                         const SkMatrix& localMatrix,
35                         const TransformsIn& tin,
36                         TransformsOut* tout) {
37         this->emitTransforms(gp, posVar, posVar.c_str(), localMatrix, tin, tout);
38     }
39
40     void emitTransforms(GrGLGPBuilder*,
41                         const GrShaderVar& posVar,
42                         const char* localCoords,
43                         const SkMatrix& localMatrix,
44                         const TransformsIn&,
45                         TransformsOut*);
46
47     struct GrGPArgs {
48         // The variable used by a GP to store its position. It can be
49         // either a vec2 or a vec3 depending on the presence of perspective.
50         GrShaderVar fPositionVar;
51     };
52
53     // Create the correct type of position variable given the CTM
54     void setupPosition(GrGLGPBuilder* pb,
55                        GrGPArgs* gpArgs,
56                        const char* posName,
57                        const SkMatrix& mat);
58
59     static uint32_t ComputePosKey(const SkMatrix& mat) {
60         if (mat.isIdentity()) {
61             return 0x0;
62         } else if (!mat.hasPerspective()) {
63             return 0x01;
64         } else {
65             return 0x02;
66         }
67     }
68
69 private:
70     virtual void onEmitCode(EmitArgs&, GrGPArgs*) = 0;
71
72     typedef GrGLPrimitiveProcessor INHERITED;
73 };
74
75 #endif