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 "GrStencilSettings.h" 14 #include "gl/GrGLTypes.h" 15 #include "glsl/GrGLSLUtil.h" 16 17 class GrGLNameAllocator; 18 class GrGLGpu; 19 class GrStyle; 20 21 /** 22 * This class wraps the NV_path_rendering extension and manages its various 23 * API versions. If a method is not present in the GrGLInterface of the GrGLGpu 24 * (because the driver version is old), it tries to provide a backup 25 * implementation. But if a backup implementation is not practical, it marks the 26 * method as not supported. 27 */ 28 class GrGLPathRendering : public GrPathRendering { 29 public: 30 /** 31 * Create a new GrGLPathRendering object from a given GrGLGpu. 32 */ 33 GrGLPathRendering(GrGLGpu* gpu); 34 ~GrGLPathRendering() override; 35 36 // GrPathRendering implementations. 37 GrPath* createPath(const SkPath&, const GrStyle&) override; 38 virtual GrPathRange* createPathRange(GrPathRange::PathGenerator*, 39 const GrStyle&) override; 40 41 /* Called when the 3D context state is unknown. */ 42 void resetContext(); 43 44 /** 45 * Called when the context either is about to be lost or is lost. DisconnectType indicates 46 * whether GPU resources should be cleaned up or abandoned when this is called. 47 */ 48 void disconnect(GrGpu::DisconnectType); 49 shouldBindFragmentInputs()50 bool shouldBindFragmentInputs() const { 51 return fCaps.bindFragmentInputSupport; 52 } 53 54 // Functions for "separable shader" texturing support. 55 void setProgramPathFragmentInputTransform(GrGLuint program, GrGLint location, 56 GrGLenum genMode, GrGLint components, 57 const SkMatrix&); 58 59 /* Sets the projection matrix for path rendering */ 60 void setProjectionMatrix(const SkMatrix& matrix, 61 const SkISize& renderTargetSize, 62 GrSurfaceOrigin renderTargetOrigin); 63 64 GrGLuint genPaths(GrGLsizei range); 65 GrGLvoid deletePaths(GrGLuint path, GrGLsizei range); 66 67 protected: 68 void onStencilPath(const StencilPathArgs&, const GrPath*) override; 69 void onDrawPath(const GrPipeline&, 70 const GrPrimitiveProcessor&, 71 const GrStencilSettings&, 72 const GrPath*) override; 73 void onDrawPaths(const GrPipeline&, 74 const GrPrimitiveProcessor&, 75 const GrStencilSettings&, 76 const GrPathRange*, 77 const void* indices, 78 PathIndexType, 79 const float transformValues[], 80 PathTransformType, 81 int count) override; 82 private: 83 /** 84 * Mark certain functionality as not supported. 85 */ 86 struct Caps { 87 bool bindFragmentInputSupport : 1; 88 }; 89 90 void flushPathStencilSettings(const GrStencilSettings&); 91 92 struct MatrixState { 93 SkMatrix fViewMatrix; 94 SkISize fRenderTargetSize; 95 GrSurfaceOrigin fRenderTargetOrigin; 96 MatrixStateMatrixState97 MatrixState() { this->invalidate(); } invalidateMatrixState98 void invalidate() { 99 fViewMatrix = SkMatrix::InvalidMatrix(); 100 fRenderTargetSize.fWidth = -1; 101 fRenderTargetSize.fHeight = -1; 102 fRenderTargetOrigin = (GrSurfaceOrigin) -1; 103 } 104 105 /** 106 * Gets a matrix that goes from local coordinates to GL normalized device coords. 107 */ getRTAdjustedGLMatrixMatrixState108 template<int Size> void getRTAdjustedGLMatrix(float* destMatrix) { 109 SkMatrix combined; 110 if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) { 111 combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1, 112 0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1, 113 0, 0, 1); 114 } else { 115 combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1, 116 0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1, 117 0, 0, 1); 118 } 119 combined.preConcat(fViewMatrix); 120 GrGLSLGetMatrix<Size>(destMatrix, combined); 121 } 122 }; 123 GrGLGpu* gpu(); 124 125 GrGLuint fFirstPreallocatedPathID; 126 GrGLsizei fPreallocatedPathCount; 127 MatrixState fHWProjectionMatrixState; 128 GrStencilSettings fHWPathStencilSettings; 129 Caps fCaps; 130 }; 131 132 #endif 133