aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLPathRendering.h
blob: 53b8750356bfd3caa347dba382fedca586f83b9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrGLPathRendering_DEFINED
#define GrGLPathRendering_DEFINED

#include "SkRefCnt.h"
#include "gl/GrGLFunctions.h"

class GrGLNameAllocator;
struct GrGLInterface;

/**
 * This class wraps the NV_path_rendering extension and manages its various
 * API versions. If a method is not present in the GrGLInterface (because the
 * driver version is old), it tries to provide a backup implementation. But if
 * a backup implementation is not practical, it marks the method as not
 * supported.
 */
class GrGLPathRendering {
public:
    /**
     * Create a new GrGLPathRendering object from a given GL interface. Unless
     * otherwise specified in the caps, every method will work properly, even
     * if it did not exist in the GL interface.
     */
    static GrGLPathRendering* Create(const GrGLInterface*);
    virtual ~GrGLPathRendering();

    /**
     * Mark certain functionality as not supported if the driver version is too
     * old and a backup implementation is not practical.
     */
    struct Caps {
        bool fragmentInputGenSupport : 1;
    };
    const Caps& caps() const { return fCaps; }

    /**
     * Called when the GPU resources have been lost and need to be abandoned
     * (for example after a context loss).
     */
    void abandonGpuResources();

    // NV_path_rendering
    GrGLuint genPaths(GrGLsizei range);
    GrGLvoid deletePaths(GrGLuint path, GrGLsizei range);
    GrGLvoid pathCommands(GrGLuint path, GrGLsizei numCommands, const GrGLubyte *commands,
                          GrGLsizei numCoords, GrGLenum coordType, const GrGLvoid *coords);
    GrGLvoid pathCoords(GrGLuint path, GrGLsizei numCoords,
                        GrGLenum coordType, const GrGLvoid *coords);
    GrGLvoid pathParameteri(GrGLuint path, GrGLenum pname, GrGLint value);
    GrGLvoid pathParameterf(GrGLuint path, GrGLenum pname, GrGLfloat value);
    GrGLboolean isPath(GrGLuint path);
    GrGLvoid pathStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask);
    GrGLvoid stencilFillPath(GrGLuint path, GrGLenum fillMode, GrGLuint mask);
    GrGLvoid stencilStrokePath(GrGLuint path, GrGLint reference, GrGLuint mask);
    GrGLvoid stencilFillPathInstanced(GrGLsizei numPaths, GrGLenum pathNameType,
                                      const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode,
                                      GrGLuint mask, GrGLenum transformType,
                                      const GrGLfloat *transformValues);
    GrGLvoid stencilStrokePathInstanced(GrGLsizei numPaths, GrGLenum pathNameType,
                                        const GrGLvoid *paths, GrGLuint pathBase,
                                        GrGLint reference, GrGLuint mask, GrGLenum transformType,
                                        const GrGLfloat *transformValues);
    GrGLvoid pathTexGen(GrGLenum texCoordSet, GrGLenum genMode,
                        GrGLint components, const GrGLfloat *coeffs);
    GrGLvoid coverFillPath(GrGLuint path, GrGLenum coverMode);
    GrGLvoid coverStrokePath(GrGLuint name, GrGLenum coverMode);
    GrGLvoid coverFillPathInstanced(GrGLsizei numPaths, GrGLenum pathNameType,
                                    const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode,
                                    GrGLenum transformType, const GrGLfloat *transformValues);
    GrGLvoid coverStrokePathInstanced(GrGLsizei numPaths, GrGLenum pathNameType,
                                      const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode,
                                      GrGLenum transformType, const GrGLfloat* transformValues);

    // NV_path_rendering v1.2
    virtual GrGLvoid stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
                                              GrGLuint mask, GrGLenum coverMode);
    virtual GrGLvoid stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
                                                GrGLuint mask, GrGLenum coverMode);
    virtual GrGLvoid stencilThenCoverFillPathInstanced(
                         GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
                         GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
                         GrGLenum transformType, const GrGLfloat *transformValues);
    virtual GrGLvoid stencilThenCoverStrokePathInstanced(
                         GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
                         GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
                         GrGLenum transformType, const GrGLfloat *transformValues);

    // NV_path_rendering v1.3
    virtual GrGLvoid programPathFragmentInputGen(GrGLuint program, GrGLint location,
                                                 GrGLenum genMode, GrGLint components,
                                                 const GrGLfloat *coeffs);

protected:
    GrGLPathRendering(const GrGLInterface*);

    SkAutoTUnref<const GrGLInterface> fGLInterface;
    SkAutoTDelete<GrGLNameAllocator> fPathNameAllocator;
    Caps fCaps;
};

#endif