1c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton/*
2c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton * Copyright 2014 Google Inc.
3c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton *
4c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton * Use of this source code is governed by a BSD-style license that can be
5c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton * found in the LICENSE file.
6c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton */
7c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
8c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#ifndef GrGLPathRendering_DEFINED
9c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#define GrGLPathRendering_DEFINED
10c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
11c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#include "SkRefCnt.h"
12ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen#include "GrPathRendering.h"
13ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen#include "GrStencil.h"
14c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#include "gl/GrGLFunctions.h"
15ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen#include "gl/GrGLProgram.h"
16c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
17c7103a104fdc7150b4e3c0d3efc42735ad359616cdaltonclass GrGLNameAllocator;
18ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunenclass GrGpuGL;
19c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
20c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton/**
21c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton * This class wraps the NV_path_rendering extension and manages its various
22ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * API versions. If a method is not present in the GrGLInterface of the GrGpuGL
23ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * (because the driver version is old), it tries to provide a backup
24ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * implementation. But if a backup implementation is not practical, it marks the
25ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * method as not supported.
26c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton */
27ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunenclass GrGLPathRendering : public GrPathRendering {
28c7103a104fdc7150b4e3c0d3efc42735ad359616cdaltonpublic:
29c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    /**
305b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * Create a new GrGLPathRendering object from a given GrGpuGL.
31c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     */
325b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    GrGLPathRendering(GrGpuGL* gpu);
33c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    virtual ~GrGLPathRendering();
34c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
35ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    // GrPathRendering implementations.
36ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    virtual GrPath* createPath(const SkPath&, const SkStrokeRec&) SK_OVERRIDE;
37855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    virtual GrPathRange* createPathRange(GrPathRange::PathGenerator*,
38855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                                         const SkStrokeRec&) SK_OVERRIDE;
39855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    virtual GrPathRange* createGlyphs(const SkTypeface*,
40855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                                      const SkDescriptor*,
41855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                                      const SkStrokeRec&) SK_OVERRIDE;
42ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    virtual void stencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
43ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    virtual void drawPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
44ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    virtual void drawPaths(const GrPathRange*, const uint32_t indices[], int count,
45ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                           const float transforms[], PathTransformType,
46ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                           SkPath::FillType) SK_OVERRIDE;
47ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
48ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    /* Called when the 3D context state is unknown. */
49ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void resetContext();
50ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
51c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    /**
52c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     * Called when the GPU resources have been lost and need to be abandoned
53c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     * (for example after a context loss).
54c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     */
55c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    void abandonGpuResources();
56c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
575b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
585b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    enum TexturingMode {
595b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        FixedFunction_TexturingMode,
605b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        SeparableShaders_TexturingMode
615b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    };
625b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
635b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    /** Specifies whether texturing should use fixed fuction pipe or separable shaders
645b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * Specifies whether texturing should use fixed fuction pipe or whether
655b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * it is ok to use normal vertex and fragment shaders, and for path rendering
665b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * populate fragment shaders with setProgramPathFragmentInputTransform.
675b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * The fixed function mode will be removed once the other mode is more widely
685b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * available.
695b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     */
705b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    TexturingMode texturingMode() const  {
715b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        return caps().fragmentInputGenSupport ?
725b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen            SeparableShaders_TexturingMode : FixedFunction_TexturingMode;
735b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    }
745b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
755b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    // Functions for fixed function texturing support.
76ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    enum PathTexGenComponents {
77ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        kS_PathTexGenComponents = 1,
78ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        kST_PathTexGenComponents = 2,
79ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        kSTR_PathTexGenComponents = 3
80ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    };
81ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void enablePathTexGen(int unitIdx, PathTexGenComponents, const GrGLfloat* coefficients);
82ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void enablePathTexGen(int unitIdx, PathTexGenComponents, const SkMatrix& matrix);
83ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void flushPathTexGenSettings(int numUsedTexCoordSets);
845b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
855b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    // Functions for "separable shader" texturing support.
865b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void setProgramPathFragmentInputTransform(GrGLuint program, GrGLint location,
875b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                              GrGLenum genMode, GrGLint components,
885b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                              const SkMatrix&);
895b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
905b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    /* Sets the projection matrix for path rendering */
91ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void setProjectionMatrix(const SkMatrix& matrix,
92ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                             const SkISize& renderTargetSize,
93ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                             GrSurfaceOrigin renderTargetOrigin);
94ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
95c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    GrGLuint genPaths(GrGLsizei range);
96c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    GrGLvoid deletePaths(GrGLuint path, GrGLsizei range);
975b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
985b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunenprivate:
995b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    /**
1005b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * Mark certain functionality as not supported if the driver version is too
1015b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     * old and a backup implementation is not practical.
1025b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen     */
1035b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    struct Caps {
1045b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        bool stencilThenCoverSupport : 1;
1055b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        bool fragmentInputGenSupport : 1;
106149b3ec2b1ccaf00e40bf296d2a3394852d73fe9cdalton        bool glyphLoadingSupport     : 1;
1075b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    };
1085b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    const Caps& caps() const { return fCaps; }
1095b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
1105b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void flushPathStencilSettings(SkPath::FillType fill);
111c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
112c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    // NV_path_rendering v1.2
1135b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
1145b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                  GrGLuint mask, GrGLenum coverMode);
1155b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
1165b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
1175b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                    GrGLuint mask, GrGLenum coverMode);
1185b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
1195b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void stencilThenCoverFillPathInstanced(
1205b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
121c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton                         GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
122c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton                         GrGLenum transformType, const GrGLfloat *transformValues);
1235b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
1245b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void stencilThenCoverStrokePathInstanced(
125c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton                         GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
126c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton                         GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
127c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton                         GrGLenum transformType, const GrGLfloat *transformValues);
128c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
129ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    GrGpuGL* fGpu;
130c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    SkAutoTDelete<GrGLNameAllocator> fPathNameAllocator;
131c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    Caps fCaps;
132ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    GrGLProgram::MatrixState fHWProjectionMatrixState;
133ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    GrStencilSettings fHWPathStencilSettings;
134ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    struct PathTexGenData {
135ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        GrGLenum  fMode;
136ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        GrGLint   fNumComponents;
137ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen        GrGLfloat fCoefficients[3 * 3];
138ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    };
139ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    int fHWActivePathTexGenSets;
140ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    SkTArray<PathTexGenData, true> fHWPathTexGenSettings;
141c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton};
142c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
143c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#endif
144