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