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"
12646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips#include "GrGpu.h"
13ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen#include "GrPathRendering.h"
14c633abbb342e3af0e56382e8cb7e7d9fed71e237csmartdalton#include "GrStencilSettings.h"
152fc11d39d187f932aeeb8f6220089326df75e9a1bsalomon#include "gl/GrGLTypes.h"
1664c4728c70001ed074fecf5c4e083781987b12e9egdaniel#include "glsl/GrGLSLUtil.h"
17c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
18c7103a104fdc7150b4e3c0d3efc42735ad359616cdaltonclass GrGLNameAllocator;
19861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonclass GrGLGpu;
206663acff010ce752e4bf778da81fa97448c9db31bsalomonclass GrStyle;
21c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
22c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton/**
23c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton * This class wraps the NV_path_rendering extension and manages its various
24861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon * API versions. If a method is not present in the GrGLInterface of the GrGLGpu
25ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * (because the driver version is old), it tries to provide a backup
26ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * implementation. But if a backup implementation is not practical, it marks the
27ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen * method as not supported.
28c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton */
29ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunenclass GrGLPathRendering : public GrPathRendering {
30c7103a104fdc7150b4e3c0d3efc42735ad359616cdaltonpublic:
31c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    /**
32861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon     * Create a new GrGLPathRendering object from a given GrGLGpu.
33c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     */
34861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLPathRendering(GrGLGpu* gpu);
35d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~GrGLPathRendering() override;
36c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
37ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    // GrPathRendering implementations.
3867d52cf0d8baff02fd4337a62f1f9cd975edc18fRobert Phillips    sk_sp<GrPath> createPath(const SkPath&, const GrStyle&) override;
3967d52cf0d8baff02fd4337a62f1f9cd975edc18fRobert Phillips    virtual sk_sp<GrPathRange> createPathRange(GrPathRange::PathGenerator*,
4067d52cf0d8baff02fd4337a62f1f9cd975edc18fRobert Phillips                                               const GrStyle&) override;
41ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
42ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    /* Called when the 3D context state is unknown. */
43ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void resetContext();
44ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
45c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    /**
466e2aad4e9f6280aa2b710e7324458fdc6d699ec5bsalomon     * Called when the context either is about to be lost or is lost. DisconnectType indicates
476e2aad4e9f6280aa2b710e7324458fdc6d699ec5bsalomon     * whether GPU resources should be cleaned up or abandoned when this is called.
48c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton     */
496e2aad4e9f6280aa2b710e7324458fdc6d699ec5bsalomon    void disconnect(GrGpu::DisconnectType);
50c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
516bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    bool shouldBindFragmentInputs() const {
526bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen        return fCaps.bindFragmentInputSupport;
536bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    }
546bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen
555b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    // Functions for "separable shader" texturing support.
565b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    void setProgramPathFragmentInputTransform(GrGLuint program, GrGLint location,
575b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                              GrGLenum genMode, GrGLint components,
585b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen                                              const SkMatrix&);
595b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
605b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    /* Sets the projection matrix for path rendering */
61ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    void setProjectionMatrix(const SkMatrix& matrix,
62ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                             const SkISize& renderTargetSize,
63ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen                             GrSurfaceOrigin renderTargetOrigin);
64ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
65c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    GrGLuint genPaths(GrGLsizei range);
66c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton    GrGLvoid deletePaths(GrGLuint path, GrGLsizei range);
675b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen
68cabe20cafd5f091a68bbc2c0c48755ba9b61b0b7kkinnunenprotected:
69cabe20cafd5f091a68bbc2c0c48755ba9b61b0b7kkinnunen    void onStencilPath(const StencilPathArgs&, const GrPath*) override;
701dc172165b8186950fda4a269bd1b12c11947b14stephana    void onDrawPath(const GrPipeline&,
711dc172165b8186950fda4a269bd1b12c11947b14stephana                    const GrPrimitiveProcessor&,
721dc172165b8186950fda4a269bd1b12c11947b14stephana                    const GrStencilSettings&,
731dc172165b8186950fda4a269bd1b12c11947b14stephana                    const GrPath*) override;
740e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel    void onDrawPaths(const GrPipeline&,
750e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     const GrPrimitiveProcessor&,
760e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     const GrStencilSettings&,
770e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     const GrPathRange*,
780e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     const void* indices,
790e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     PathIndexType,
800e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     const float transformValues[],
810e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     PathTransformType,
820e1853c89615d14d0d03c87c7e0c604e5285cc54egdaniel                     int count) override;
835b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunenprivate:
846bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    /**
856bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen     * Mark certain functionality as not supported.
866bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen     */
876bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    struct Caps {
886bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen        bool bindFragmentInputSupport : 1;
896bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    };
906bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen
9192e496f96abbd664888f0c8a7d546ab02e703bf7joshualitt    void flushPathStencilSettings(const GrStencilSettings&);
92c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
93ee2af95db72152dfa61c841875df0594ca93437djoshualitt    struct MatrixState {
94ee2af95db72152dfa61c841875df0594ca93437djoshualitt        SkMatrix        fViewMatrix;
95ee2af95db72152dfa61c841875df0594ca93437djoshualitt        SkISize         fRenderTargetSize;
96ee2af95db72152dfa61c841875df0594ca93437djoshualitt        GrSurfaceOrigin fRenderTargetOrigin;
97ee2af95db72152dfa61c841875df0594ca93437djoshualitt
98ee2af95db72152dfa61c841875df0594ca93437djoshualitt        MatrixState() { this->invalidate(); }
99ee2af95db72152dfa61c841875df0594ca93437djoshualitt        void invalidate() {
100ee2af95db72152dfa61c841875df0594ca93437djoshualitt            fViewMatrix = SkMatrix::InvalidMatrix();
101ee2af95db72152dfa61c841875df0594ca93437djoshualitt            fRenderTargetSize.fWidth = -1;
102ee2af95db72152dfa61c841875df0594ca93437djoshualitt            fRenderTargetSize.fHeight = -1;
103ee2af95db72152dfa61c841875df0594ca93437djoshualitt            fRenderTargetOrigin = (GrSurfaceOrigin) -1;
104ee2af95db72152dfa61c841875df0594ca93437djoshualitt        }
105ee2af95db72152dfa61c841875df0594ca93437djoshualitt
106ee2af95db72152dfa61c841875df0594ca93437djoshualitt        /**
107ee2af95db72152dfa61c841875df0594ca93437djoshualitt         * Gets a matrix that goes from local coordinates to GL normalized device coords.
108ee2af95db72152dfa61c841875df0594ca93437djoshualitt         */
109018fb62d12d1febf121fe265da5b6117b86a6541egdaniel        template<int Size> void getRTAdjustedGLMatrix(float* destMatrix) {
110ee2af95db72152dfa61c841875df0594ca93437djoshualitt            SkMatrix combined;
111ee2af95db72152dfa61c841875df0594ca93437djoshualitt            if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
112ee2af95db72152dfa61c841875df0594ca93437djoshualitt                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
113ee2af95db72152dfa61c841875df0594ca93437djoshualitt                                0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1,
114ee2af95db72152dfa61c841875df0594ca93437djoshualitt                                0, 0, 1);
115ee2af95db72152dfa61c841875df0594ca93437djoshualitt            } else {
116ee2af95db72152dfa61c841875df0594ca93437djoshualitt                combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1,
117ee2af95db72152dfa61c841875df0594ca93437djoshualitt                                0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1,
118ee2af95db72152dfa61c841875df0594ca93437djoshualitt                                0, 0, 1);
119ee2af95db72152dfa61c841875df0594ca93437djoshualitt            }
120ee2af95db72152dfa61c841875df0594ca93437djoshualitt            combined.preConcat(fViewMatrix);
12164c4728c70001ed074fecf5c4e083781987b12e9egdaniel            GrGLSLGetMatrix<Size>(destMatrix, combined);
122ee2af95db72152dfa61c841875df0594ca93437djoshualitt        }
123ee2af95db72152dfa61c841875df0594ca93437djoshualitt    };
124cabe20cafd5f091a68bbc2c0c48755ba9b61b0b7kkinnunen    GrGLGpu* gpu();
125ee2af95db72152dfa61c841875df0594ca93437djoshualitt
126702501ddca7cf9b7b941ad286a0c9aa37fda86efkkinnunen    GrGLuint fFirstPreallocatedPathID;
127702501ddca7cf9b7b941ad286a0c9aa37fda86efkkinnunen    GrGLsizei fPreallocatedPathCount;
128ee2af95db72152dfa61c841875df0594ca93437djoshualitt    MatrixState fHWProjectionMatrixState;
129ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen    GrStencilSettings fHWPathStencilSettings;
1306bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen    Caps fCaps;
131c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton};
132c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton
133c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#endif
134