/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLPathRendering_DEFINED #define GrGLPathRendering_DEFINED #include "SkRefCnt.h" #include "gl/GrGLFunctions.h" class GrGLNameAllocator; struct GrGLInterface; /** * This class wraps the NV_path_rendering extension and manages its various * API versions. If a method is not present in the GrGLInterface (because the * driver version is old), it tries to provide a backup implementation. But if * a backup implementation is not practical, it marks the method as not * supported. */ class GrGLPathRendering { public: /** * Create a new GrGLPathRendering object from a given GL interface. Unless * otherwise specified in the caps, every method will work properly, even * if it did not exist in the GL interface. */ static GrGLPathRendering* Create(const GrGLInterface*); virtual ~GrGLPathRendering(); /** * Mark certain functionality as not supported if the driver version is too * old and a backup implementation is not practical. */ struct Caps { bool fragmentInputGenSupport : 1; }; const Caps& caps() const { return fCaps; } /** * Called when the GPU resources have been lost and need to be abandoned * (for example after a context loss). */ void abandonGpuResources(); // NV_path_rendering GrGLuint genPaths(GrGLsizei range); GrGLvoid deletePaths(GrGLuint path, GrGLsizei range); GrGLvoid pathCommands(GrGLuint path, GrGLsizei numCommands, const GrGLubyte *commands, GrGLsizei numCoords, GrGLenum coordType, const GrGLvoid *coords); GrGLvoid pathCoords(GrGLuint path, GrGLsizei numCoords, GrGLenum coordType, const GrGLvoid *coords); GrGLvoid pathParameteri(GrGLuint path, GrGLenum pname, GrGLint value); GrGLvoid pathParameterf(GrGLuint path, GrGLenum pname, GrGLfloat value); GrGLboolean isPath(GrGLuint path); GrGLvoid pathStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask); GrGLvoid stencilFillPath(GrGLuint path, GrGLenum fillMode, GrGLuint mask); GrGLvoid stencilStrokePath(GrGLuint path, GrGLint reference, GrGLuint mask); GrGLvoid stencilFillPathInstanced(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum transformType, const GrGLfloat *transformValues); GrGLvoid stencilStrokePathInstanced(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum transformType, const GrGLfloat *transformValues); GrGLvoid pathTexGen(GrGLenum texCoordSet, GrGLenum genMode, GrGLint components, const GrGLfloat *coeffs); GrGLvoid coverFillPath(GrGLuint path, GrGLenum coverMode); GrGLvoid coverStrokePath(GrGLuint name, GrGLenum coverMode); GrGLvoid coverFillPathInstanced(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues); GrGLvoid coverStrokePathInstanced(GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues); // NV_path_rendering v1.2 virtual GrGLvoid stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode); virtual GrGLvoid stencilThenCoverStrokePath(GrGLuint path, GrGLint reference, GrGLuint mask, GrGLenum coverMode); virtual GrGLvoid stencilThenCoverFillPathInstanced( GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues); virtual GrGLvoid stencilThenCoverStrokePathInstanced( GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues); // NV_path_rendering v1.3 virtual GrGLvoid programPathFragmentInputGen(GrGLuint program, GrGLint location, GrGLenum genMode, GrGLint components, const GrGLfloat *coeffs); protected: GrGLPathRendering(const GrGLInterface*); SkAutoTUnref fGLInterface; SkAutoTDelete fPathNameAllocator; Caps fCaps; }; #endif