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