blob: 53b8750356bfd3caa347dba382fedca586f83b9c [file] [log] [blame]
/*
* 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<const GrGLInterface> fGLInterface;
SkAutoTDelete<GrGLNameAllocator> fPathNameAllocator;
Caps fCaps;
};
#endif