Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / gl / GrGLPathRendering.h
1 /*
2  * Copyright 2014 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 GrGLPathRendering_DEFINED
9 #define GrGLPathRendering_DEFINED
10
11 #include "SkRefCnt.h"
12 #include "GrPathRendering.h"
13 #include "GrStencil.h"
14 #include "gl/GrGLFunctions.h"
15 #include "gl/GrGLProgram.h"
16
17 class GrGLNameAllocator;
18 class GrGpuGL;
19
20 /**
21  * This class wraps the NV_path_rendering extension and manages its various
22  * API versions. If a method is not present in the GrGLInterface of the GrGpuGL
23  * (because the driver version is old), it tries to provide a backup
24  * implementation. But if a backup implementation is not practical, it marks the
25  * method as not supported.
26  */
27 class GrGLPathRendering : public GrPathRendering {
28 public:
29     /**
30      * Create a new GrGLPathRendering object from a given GrGpuGL.
31      */
32     GrGLPathRendering(GrGpuGL* gpu);
33     virtual ~GrGLPathRendering();
34
35     // GrPathRendering implementations.
36     virtual GrPath* createPath(const SkPath&, const SkStrokeRec&) SK_OVERRIDE;
37     virtual GrPathRange* createPathRange(GrPathRange::PathGenerator*,
38                                          const SkStrokeRec&) SK_OVERRIDE;
39     virtual GrPathRange* createGlyphs(const SkTypeface*,
40                                       const SkDescriptor*,
41                                       const SkStrokeRec&) SK_OVERRIDE;
42     virtual void stencilPath(const GrPath*, const GrStencilSettings&) SK_OVERRIDE;
43     virtual void drawPath(const GrPath*, const GrStencilSettings&) SK_OVERRIDE;
44     virtual void drawPaths(const GrPathRange*, const uint32_t indices[], int count,
45                            const float transforms[], PathTransformType,
46                            const GrStencilSettings&) SK_OVERRIDE;
47
48     /* Called when the 3D context state is unknown. */
49     void resetContext();
50
51     /**
52      * Called when the GPU resources have been lost and need to be abandoned
53      * (for example after a context loss).
54      */
55     void abandonGpuResources();
56
57
58     enum TexturingMode {
59         FixedFunction_TexturingMode,
60         SeparableShaders_TexturingMode
61     };
62
63     /** Specifies whether texturing should use fixed fuction pipe or separable shaders
64      * Specifies whether texturing should use fixed fuction pipe or whether
65      * it is ok to use normal vertex and fragment shaders, and for path rendering
66      * populate fragment shaders with setProgramPathFragmentInputTransform.
67      * The fixed function mode will be removed once the other mode is more widely
68      * available.
69      */
70     TexturingMode texturingMode() const  {
71         return caps().fragmentInputGenSupport ?
72             SeparableShaders_TexturingMode : FixedFunction_TexturingMode;
73     }
74
75     // Functions for fixed function texturing support.
76     enum PathTexGenComponents {
77         kS_PathTexGenComponents = 1,
78         kST_PathTexGenComponents = 2,
79         kSTR_PathTexGenComponents = 3
80     };
81     void enablePathTexGen(int unitIdx, PathTexGenComponents, const GrGLfloat* coefficients);
82     void enablePathTexGen(int unitIdx, PathTexGenComponents, const SkMatrix& matrix);
83     void flushPathTexGenSettings(int numUsedTexCoordSets);
84
85     // Functions for "separable shader" texturing support.
86     void setProgramPathFragmentInputTransform(GrGLuint program, GrGLint location,
87                                               GrGLenum genMode, GrGLint components,
88                                               const SkMatrix&);
89
90     /* Sets the projection matrix for path rendering */
91     void setProjectionMatrix(const SkMatrix& matrix,
92                              const SkISize& renderTargetSize,
93                              GrSurfaceOrigin renderTargetOrigin);
94
95     GrGLuint genPaths(GrGLsizei range);
96     GrGLvoid deletePaths(GrGLuint path, GrGLsizei range);
97
98 private:
99     /**
100      * Mark certain functionality as not supported if the driver version is too
101      * old and a backup implementation is not practical.
102      */
103     struct Caps {
104         bool stencilThenCoverSupport : 1;
105         bool fragmentInputGenSupport : 1;
106         bool glyphLoadingSupport     : 1;
107     };
108     const Caps& caps() const { return fCaps; }
109
110     void flushPathStencilSettings(const GrStencilSettings&);
111
112     // NV_path_rendering v1.2
113     void stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
114                                   GrGLuint mask, GrGLenum coverMode);
115
116     void stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
117                                     GrGLuint mask, GrGLenum coverMode);
118
119     void stencilThenCoverFillPathInstanced(
120         GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
121                          GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
122                          GrGLenum transformType, const GrGLfloat *transformValues);
123
124     void stencilThenCoverStrokePathInstanced(
125                          GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
126                          GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
127                          GrGLenum transformType, const GrGLfloat *transformValues);
128
129     GrGpuGL* fGpu;
130     SkAutoTDelete<GrGLNameAllocator> fPathNameAllocator;
131     Caps fCaps;
132     GrGLProgram::MatrixState fHWProjectionMatrixState;
133     GrStencilSettings fHWPathStencilSettings;
134     struct PathTexGenData {
135         GrGLenum  fMode;
136         GrGLint   fNumComponents;
137         GrGLfloat fCoefficients[3 * 3];
138     };
139     int fHWActivePathTexGenSets;
140     SkTArray<PathTexGenData, true> fHWPathTexGenSettings;
141 };
142
143 #endif