| Index: src/gpu/gl/GrGLPathRendering.cpp
|
| diff --git a/src/gpu/gl/GrGLPathRendering.cpp b/src/gpu/gl/GrGLPathRendering.cpp
|
| index 53d7cf007411ab4fbc7dcd3bf55f5ac2b5915d5c..135eb16866d9ad7f91d8ea4ee261fc56b5db6c7b 100644
|
| --- a/src/gpu/gl/GrGLPathRendering.cpp
|
| +++ b/src/gpu/gl/GrGLPathRendering.cpp
|
| @@ -45,58 +45,16 @@ static GrGLenum gr_stencil_op_to_gl_path_rendering_fill_mode(GrStencilOp op) {
|
| }
|
| }
|
|
|
| -class GrGLPathRenderingV12 : public GrGLPathRendering {
|
| -public:
|
| - GrGLPathRenderingV12(GrGpuGL* gpu)
|
| - : GrGLPathRendering(gpu) {
|
| - }
|
| -
|
| - virtual GrGLvoid stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
|
| - GrGLuint mask, GrGLenum coverMode) SK_OVERRIDE;
|
| - virtual GrGLvoid stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
|
| - GrGLuint mask, GrGLenum coverMode) SK_OVERRIDE;
|
| - virtual GrGLvoid stencilThenCoverFillPathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) SK_OVERRIDE;
|
| - virtual GrGLvoid stencilThenCoverStrokePathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) SK_OVERRIDE;
|
| -};
|
| -
|
| -class GrGLPathRenderingV13 : public GrGLPathRenderingV12 {
|
| -public:
|
| - GrGLPathRenderingV13(GrGpuGL* gpu)
|
| - : GrGLPathRenderingV12(gpu) {
|
| - fCaps.fragmentInputGenSupport = true;
|
| - }
|
| -
|
| - virtual GrGLvoid programPathFragmentInputGen(GrGLuint program, GrGLint location,
|
| - GrGLenum genMode, GrGLint components,
|
| - const GrGLfloat *coeffs) SK_OVERRIDE;
|
| -};
|
| -
|
| -
|
| -GrGLPathRendering* GrGLPathRendering::Create(GrGpuGL* gpu) {
|
| - const GrGLInterface* glInterface = gpu->glInterface();
|
| - if (NULL == glInterface->fFunctions.fStencilThenCoverFillPath ||
|
| - NULL == glInterface->fFunctions.fStencilThenCoverStrokePath ||
|
| - NULL == glInterface->fFunctions.fStencilThenCoverFillPathInstanced ||
|
| - NULL == glInterface->fFunctions.fStencilThenCoverStrokePathInstanced) {
|
| - return new GrGLPathRendering(gpu);
|
| - }
|
| -
|
| - if (NULL == glInterface->fFunctions.fProgramPathFragmentInputGen) {
|
| - return new GrGLPathRenderingV12(gpu);
|
| - }
|
| -
|
| - return new GrGLPathRenderingV13(gpu);
|
| -}
|
| -
|
| GrGLPathRendering::GrGLPathRendering(GrGpuGL* gpu)
|
| : fGpu(gpu) {
|
| - memset(&fCaps, 0, sizeof(fCaps));
|
| + const GrGLInterface* glInterface = gpu->glInterface();
|
| + fCaps.stencilThenCoverSupport =
|
| + NULL != glInterface->fFunctions.fStencilThenCoverFillPath &&
|
| + NULL != glInterface->fFunctions.fStencilThenCoverStrokePath &&
|
| + NULL != glInterface->fFunctions.fStencilThenCoverFillPathInstanced &&
|
| + NULL != glInterface->fFunctions.fStencilThenCoverStrokePathInstanced;
|
| + fCaps.fragmentInputGenSupport =
|
| + NULL != glInterface->fFunctions.fProgramPathFragmentInputGen;
|
| fHWPathTexGenSettings.reset(fGpu->glCaps().maxFixedFunctionTextureCoords());
|
| }
|
|
|
| @@ -113,7 +71,7 @@ void GrGLPathRendering::resetContext() {
|
| GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW));
|
|
|
| for (int i = 0; i < fGpu->glCaps().maxFixedFunctionTextureCoords(); ++i) {
|
| - this->pathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL);
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
|
| fHWPathTexGenSettings[i].fMode = GR_GL_NONE;
|
| fHWPathTexGenSettings[i].fNumComponents = 0;
|
| }
|
| @@ -129,76 +87,6 @@ GrPathRange* GrGLPathRendering::createPathRange(size_t size, const SkStrokeRec&
|
| return SkNEW_ARGS(GrGLPathRange, (fGpu, size, stroke));
|
| }
|
|
|
| -void GrGLPathRendering::enablePathTexGen(int unitIdx, PathTexGenComponents components,
|
| - const GrGLfloat* coefficients) {
|
| - SkASSERT(components >= kS_PathTexGenComponents &&
|
| - components <= kSTR_PathTexGenComponents);
|
| - SkASSERT(fGpu->glCaps().maxFixedFunctionTextureCoords() >= unitIdx);
|
| -
|
| - if (GR_GL_OBJECT_LINEAR == fHWPathTexGenSettings[unitIdx].fMode &&
|
| - components == fHWPathTexGenSettings[unitIdx].fNumComponents &&
|
| - !memcmp(coefficients, fHWPathTexGenSettings[unitIdx].fCoefficients,
|
| - 3 * components * sizeof(GrGLfloat))) {
|
| - return;
|
| - }
|
| -
|
| - fGpu->setTextureUnit(unitIdx);
|
| -
|
| - fHWPathTexGenSettings[unitIdx].fNumComponents = components;
|
| - this->pathTexGen(GR_GL_TEXTURE0 + unitIdx, GR_GL_OBJECT_LINEAR, components, coefficients);
|
| -
|
| - memcpy(fHWPathTexGenSettings[unitIdx].fCoefficients, coefficients,
|
| - 3 * components * sizeof(GrGLfloat));
|
| -}
|
| -
|
| -void GrGLPathRendering::enablePathTexGen(int unitIdx, PathTexGenComponents components,
|
| - const SkMatrix& matrix) {
|
| - GrGLfloat coefficients[3 * 3];
|
| - SkASSERT(components >= kS_PathTexGenComponents &&
|
| - components <= kSTR_PathTexGenComponents);
|
| -
|
| - coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
|
| - coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
|
| - coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
|
| -
|
| - if (components >= kST_PathTexGenComponents) {
|
| - coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
|
| - coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
|
| - coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
|
| - }
|
| -
|
| - if (components >= kSTR_PathTexGenComponents) {
|
| - coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
|
| - coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
|
| - coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
|
| - }
|
| -
|
| - this->enablePathTexGen(unitIdx, components, coefficients);
|
| -}
|
| -
|
| -void GrGLPathRendering::flushPathTexGenSettings(int numUsedTexCoordSets) {
|
| - SkASSERT(fGpu->glCaps().maxFixedFunctionTextureCoords() >= numUsedTexCoordSets);
|
| -
|
| - // Only write the inactive path tex gens, since active path tex gens were
|
| - // written when they were enabled.
|
| -
|
| - SkDEBUGCODE(
|
| - for (int i = 0; i < numUsedTexCoordSets; i++) {
|
| - SkASSERT(0 != fHWPathTexGenSettings[i].fNumComponents);
|
| - }
|
| - );
|
| -
|
| - for (int i = numUsedTexCoordSets; i < fHWActivePathTexGenSets; i++) {
|
| - SkASSERT(0 != fHWPathTexGenSettings[i].fNumComponents);
|
| -
|
| - fGpu->setTextureUnit(i);
|
| - GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
|
| - fHWPathTexGenSettings[i].fNumComponents = 0;
|
| - }
|
| -
|
| - fHWActivePathTexGenSets = numUsedTexCoordSets;
|
| -}
|
| -
|
| void GrGLPathRendering::stencilPath(const GrPath* path, SkPath::FillType fill) {
|
| GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
|
| SkASSERT(NULL != fGpu->drawState()->getRenderTarget());
|
| @@ -210,7 +98,7 @@ void GrGLPathRendering::stencilPath(const GrPath* path, SkPath::FillType fill) {
|
| GrGLenum fillMode =
|
| gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
| - this->stencilFillPath(id, fillMode, writeMask);
|
| + GL_CALL(StencilFillPath(id, fillMode, writeMask));
|
| }
|
|
|
| void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) {
|
| @@ -233,7 +121,7 @@ void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) {
|
| if (nonInvertedFill == fill) {
|
| if (stroke.needToApply()) {
|
| if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - this->stencilFillPath(id, fillMode, writeMask);
|
| + GL_CALL(StencilFillPath(id, fillMode, writeMask));
|
| }
|
| this->stencilThenCoverStrokePath(id, 0xffff, writeMask, GR_GL_BOUNDING_BOX);
|
| } else {
|
| @@ -241,10 +129,10 @@ void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) {
|
| }
|
| } else {
|
| if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - this->stencilFillPath(id, fillMode, writeMask);
|
| + GL_CALL(StencilFillPath(id, fillMode, writeMask));
|
| }
|
| if (stroke.needToApply()) {
|
| - this->stencilStrokePath(id, 0xffff, writeMask);
|
| + GL_CALL(StencilStrokePath(id, 0xffff, writeMask));
|
| }
|
|
|
| GrDrawState* drawState = fGpu->drawState();
|
| @@ -295,10 +183,10 @@ void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t i
|
| if (nonInvertedFill == fill) {
|
| if (stroke.needToApply()) {
|
| if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - this->stencilFillPathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode,
|
| - writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| + GL_CALL(StencilFillPathInstanced(
|
| + count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode,
|
| + writeMask, gXformType2GLType[transformsType],
|
| + transforms));
|
| }
|
| this->stencilThenCoverStrokePathInstanced(
|
| count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff, writeMask,
|
| @@ -312,16 +200,16 @@ void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t i
|
| }
|
| } else {
|
| if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - this->stencilFillPathInstanced(
|
| + GL_CALL(StencilFillPathInstanced(
|
| count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode,
|
| writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| + transforms));
|
| }
|
| if (stroke.needToApply()) {
|
| - this->stencilStrokePathInstanced(
|
| + GL_CALL(StencilStrokePathInstanced(
|
| count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff,
|
| writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| + transforms));
|
| }
|
|
|
| GrDrawState* drawState = fGpu->drawState();
|
| @@ -345,19 +233,100 @@ void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t i
|
| }
|
| }
|
|
|
| -void GrGLPathRendering::flushPathStencilSettings(SkPath::FillType fill) {
|
| - GrStencilSettings pathStencilSettings;
|
| - fGpu->getPathStencilSettingsForFillType(fill, &pathStencilSettings);
|
| - if (fHWPathStencilSettings != pathStencilSettings) {
|
| - // Just the func, ref, and mask is set here. The op and write mask are params to the call
|
| - // that draws the path to the SB (glStencilFillPath)
|
| - GrGLenum func =
|
| - GrToGLStencilFunc(pathStencilSettings.func(GrStencilSettings::kFront_Face));
|
| - this->pathStencilFunc(func, pathStencilSettings.funcRef(GrStencilSettings::kFront_Face),
|
| - pathStencilSettings.funcMask(GrStencilSettings::kFront_Face));
|
| +void GrGLPathRendering::enablePathTexGen(int unitIdx, PathTexGenComponents components,
|
| + const GrGLfloat* coefficients) {
|
| + SkASSERT(components >= kS_PathTexGenComponents &&
|
| + components <= kSTR_PathTexGenComponents);
|
| + SkASSERT(fGpu->glCaps().maxFixedFunctionTextureCoords() >= unitIdx);
|
|
|
| - fHWPathStencilSettings = pathStencilSettings;
|
| + if (GR_GL_OBJECT_LINEAR == fHWPathTexGenSettings[unitIdx].fMode &&
|
| + components == fHWPathTexGenSettings[unitIdx].fNumComponents &&
|
| + !memcmp(coefficients, fHWPathTexGenSettings[unitIdx].fCoefficients,
|
| + 3 * components * sizeof(GrGLfloat))) {
|
| + return;
|
| }
|
| +
|
| + fGpu->setTextureUnit(unitIdx);
|
| +
|
| + fHWPathTexGenSettings[unitIdx].fNumComponents = components;
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + unitIdx, GR_GL_OBJECT_LINEAR, components, coefficients));
|
| +
|
| + memcpy(fHWPathTexGenSettings[unitIdx].fCoefficients, coefficients,
|
| + 3 * components * sizeof(GrGLfloat));
|
| +}
|
| +
|
| +void GrGLPathRendering::enablePathTexGen(int unitIdx, PathTexGenComponents components,
|
| + const SkMatrix& matrix) {
|
| + GrGLfloat coefficients[3 * 3];
|
| + SkASSERT(components >= kS_PathTexGenComponents &&
|
| + components <= kSTR_PathTexGenComponents);
|
| +
|
| + coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
|
| + coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
|
| + coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
|
| +
|
| + if (components >= kST_PathTexGenComponents) {
|
| + coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
|
| + coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
|
| + coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
|
| + }
|
| +
|
| + if (components >= kSTR_PathTexGenComponents) {
|
| + coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
|
| + coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
|
| + coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
|
| + }
|
| +
|
| + this->enablePathTexGen(unitIdx, components, coefficients);
|
| +}
|
| +
|
| +void GrGLPathRendering::flushPathTexGenSettings(int numUsedTexCoordSets) {
|
| + SkASSERT(fGpu->glCaps().maxFixedFunctionTextureCoords() >= numUsedTexCoordSets);
|
| +
|
| + // Only write the inactive path tex gens, since active path tex gens were
|
| + // written when they were enabled.
|
| +
|
| + SkDEBUGCODE(
|
| + for (int i = 0; i < numUsedTexCoordSets; i++) {
|
| + SkASSERT(0 != fHWPathTexGenSettings[i].fNumComponents);
|
| + }
|
| + );
|
| +
|
| + for (int i = numUsedTexCoordSets; i < fHWActivePathTexGenSets; i++) {
|
| + SkASSERT(0 != fHWPathTexGenSettings[i].fNumComponents);
|
| +
|
| + fGpu->setTextureUnit(i);
|
| + GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
|
| + fHWPathTexGenSettings[i].fNumComponents = 0;
|
| + }
|
| +
|
| + fHWActivePathTexGenSets = numUsedTexCoordSets;
|
| +}
|
| +
|
| +void GrGLPathRendering::setProgramPathFragmentInputTransform(GrGLuint program, GrGLint location,
|
| + GrGLenum genMode, GrGLint components,
|
| + const SkMatrix& matrix) {
|
| + SkASSERT(caps().fragmentInputGenSupport);
|
| + GrGLfloat coefficients[3 * 3];
|
| + SkASSERT(components >= 1 && components <= 3);
|
| +
|
| + coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
|
| + coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
|
| + coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
|
| +
|
| + if (components >= 2) {
|
| + coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
|
| + coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
|
| + coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
|
| + }
|
| +
|
| + if (components >= 3) {
|
| + coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
|
| + coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
|
| + coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
|
| + }
|
| +
|
| + GL_CALL(ProgramPathFragmentInputGen(program, location, genMode, components, coefficients));
|
| }
|
|
|
| void GrGLPathRendering::setProjectionMatrix(const SkMatrix& matrix,
|
| @@ -381,9 +350,6 @@ void GrGLPathRendering::setProjectionMatrix(const SkMatrix& matrix,
|
| GL_CALL(MatrixLoadf(GR_GL_PROJECTION, glMatrix));
|
| }
|
|
|
| -
|
| -
|
| -// NV_path_rendering
|
| GrGLuint GrGLPathRendering::genPaths(GrGLsizei range) {
|
| if (range > 1) {
|
| GrGLuint name;
|
| @@ -410,7 +376,7 @@ GrGLuint GrGLPathRendering::genPaths(GrGLsizei range) {
|
| return name;
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::deletePaths(GrGLuint path, GrGLsizei range) {
|
| +void GrGLPathRendering::deletePaths(GrGLuint path, GrGLsizei range) {
|
| if (range > 1) {
|
| // It is not supported to delete names in ranges that were allocated
|
| // individually using GrGLPathNameAllocator.
|
| @@ -435,157 +401,69 @@ GrGLvoid GrGLPathRendering::deletePaths(GrGLuint path, GrGLsizei range) {
|
| fPathNameAllocator->free(path);
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::pathCommands(GrGLuint path, GrGLsizei numCommands,
|
| - const GrGLubyte *commands, GrGLsizei numCoords,
|
| - GrGLenum coordType, const GrGLvoid *coords) {
|
| - GL_CALL(PathCommands(path, numCommands, commands, numCoords, coordType, coords));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::pathCoords(GrGLuint path, GrGLsizei numCoords,
|
| - GrGLenum coordType, const GrGLvoid *coords) {
|
| - GL_CALL(PathCoords(path, numCoords, coordType, coords));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::pathParameteri(GrGLuint path, GrGLenum pname, GrGLint value) {
|
| - GL_CALL(PathParameteri(path, pname, value));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::pathParameterf(GrGLuint path, GrGLenum pname, GrGLfloat value) {
|
| - GL_CALL(PathParameterf(path, pname, value));
|
| -}
|
| -
|
| -GrGLboolean GrGLPathRendering::isPath(GrGLuint path) {
|
| - GrGLboolean ret;
|
| - GL_CALL_RET(ret, IsPath(path));
|
| - return ret;
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::pathStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {
|
| - GL_CALL(PathStencilFunc(func, ref, mask));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::stencilFillPath(GrGLuint path, GrGLenum fillMode, GrGLuint mask) {
|
| - // Decide how to manipulate the stencil buffer based on the fill rule.
|
| - GL_CALL(StencilFillPath(path, fillMode, mask));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::stencilStrokePath(GrGLuint path, GrGLint reference, GrGLuint mask) {
|
| - GL_CALL(StencilStrokePath(path, reference, mask));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::stencilFillPathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) {
|
| - GL_CALL(StencilFillPathInstanced(numPaths, pathNameType, paths, pathBase,
|
| - fillMode, mask, transformType, transformValues));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::stencilStrokePathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLint reference, GrGLuint mask,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) {
|
| - GL_CALL(StencilStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
|
| - reference, mask, transformType, transformValues));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::pathTexGen(GrGLenum texCoordSet, GrGLenum genMode,
|
| - GrGLint components, const GrGLfloat *coeffs) {
|
| - GL_CALL(PathTexGen(texCoordSet, genMode, components, coeffs));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::coverFillPath(GrGLuint path, GrGLenum coverMode) {
|
| - GL_CALL(CoverFillPath(path, coverMode));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::coverStrokePath(GrGLuint name, GrGLenum coverMode) {
|
| - GL_CALL(CoverStrokePath(name, coverMode));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRendering::coverFillPathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase,
|
| - GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues) {
|
| - GL_CALL(CoverFillPathInstanced(numPaths, pathNameType, paths, pathBase,
|
| - coverMode, transformType, transformValues));
|
| -}
|
| +void GrGLPathRendering::flushPathStencilSettings(SkPath::FillType fill) {
|
| + GrStencilSettings pathStencilSettings;
|
| + fGpu->getPathStencilSettingsForFillType(fill, &pathStencilSettings);
|
| + if (fHWPathStencilSettings != pathStencilSettings) {
|
| + // Just the func, ref, and mask is set here. The op and write mask are params to the call
|
| + // that draws the path to the SB (glStencilFillPath)
|
| + GrGLenum func =
|
| + GrToGLStencilFunc(pathStencilSettings.func(GrStencilSettings::kFront_Face));
|
| + GL_CALL(PathStencilFunc(func, pathStencilSettings.funcRef(GrStencilSettings::kFront_Face),
|
| + pathStencilSettings.funcMask(GrStencilSettings::kFront_Face)));
|
|
|
| -GrGLvoid GrGLPathRendering::coverStrokePathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase,
|
| - GrGLenum coverMode, GrGLenum transformType, const GrGLfloat* transformValues) {
|
| - GL_CALL(CoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
|
| - coverMode, transformType, transformValues));
|
| + fHWPathStencilSettings = pathStencilSettings;
|
| + }
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
|
| +inline void GrGLPathRendering::stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
|
| GrGLuint mask, GrGLenum coverMode) {
|
| + if (caps().stencilThenCoverSupport) {
|
| + GL_CALL(StencilThenCoverFillPath(path, fillMode, mask, coverMode));
|
| + return;
|
| + }
|
| GL_CALL(StencilFillPath(path, fillMode, mask));
|
| GL_CALL(CoverFillPath(path, coverMode));
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
|
| +inline void GrGLPathRendering::stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
|
| GrGLuint mask, GrGLenum coverMode) {
|
| + if (caps().stencilThenCoverSupport) {
|
| + GL_CALL(StencilThenCoverStrokePath(path, reference, mask, coverMode));
|
| + return;
|
| + }
|
| GL_CALL(StencilStrokePath(path, reference, mask));
|
| GL_CALL(CoverStrokePath(path, coverMode));
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::stencilThenCoverFillPathInstanced(
|
| +inline void GrGLPathRendering::stencilThenCoverFillPathInstanced(
|
| GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
|
| GrGLenum transformType, const GrGLfloat *transformValues) {
|
| + if (caps().stencilThenCoverSupport) {
|
| + GL_CALL(StencilThenCoverFillPathInstanced(numPaths, pathNameType, paths, pathBase, fillMode,
|
| + mask, coverMode, transformType, transformValues));
|
| + return;
|
| + }
|
| GL_CALL(StencilFillPathInstanced(numPaths, pathNameType, paths, pathBase,
|
| fillMode, mask, transformType, transformValues));
|
| GL_CALL(CoverFillPathInstanced(numPaths, pathNameType, paths, pathBase,
|
| coverMode, transformType, transformValues));
|
| }
|
|
|
| -GrGLvoid GrGLPathRendering::stencilThenCoverStrokePathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) {
|
| +inline void GrGLPathRendering::stencilThenCoverStrokePathInstanced(
|
| + GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| + GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
|
| + GrGLenum transformType, const GrGLfloat *transformValues) {
|
| + if (caps().stencilThenCoverSupport) {
|
| + GL_CALL(StencilThenCoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
|
| + reference, mask, coverMode, transformType,
|
| + transformValues));
|
| + return;
|
| + }
|
| +
|
| GL_CALL(StencilStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
|
| reference, mask, transformType, transformValues));
|
| GL_CALL(CoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase,
|
| coverMode, transformType, transformValues));
|
| }
|
| -
|
| -GrGLvoid GrGLPathRendering::programPathFragmentInputGen(
|
| - GrGLuint program, GrGLint location, GrGLenum genMode,
|
| - GrGLint components, const GrGLfloat *coeffs) {
|
| - SkFAIL("ProgramPathFragmentInputGen not supported in this GL context.");
|
| -}
|
| -
|
| -
|
| -// NV_path_rendering v1.2
|
| -GrGLvoid GrGLPathRenderingV12::stencilThenCoverFillPath(GrGLuint path, GrGLenum fillMode,
|
| - GrGLuint mask, GrGLenum coverMode) {
|
| - GL_CALL(StencilThenCoverFillPath(path, fillMode, mask, coverMode));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRenderingV12::stencilThenCoverStrokePath(GrGLuint path, GrGLint reference,
|
| - GrGLuint mask, GrGLenum coverMode) {
|
| - GL_CALL(StencilThenCoverStrokePath(path, reference, mask, coverMode));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRenderingV12::stencilThenCoverFillPathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) {
|
| - GL_CALL(StencilThenCoverFillPathInstanced(numPaths, pathNameType, paths, pathBase, fillMode,
|
| - mask, coverMode, transformType, transformValues));
|
| -}
|
| -
|
| -GrGLvoid GrGLPathRenderingV12::stencilThenCoverStrokePathInstanced(
|
| - GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths,
|
| - GrGLuint pathBase, GrGLint reference, GrGLuint mask, GrGLenum coverMode,
|
| - GrGLenum transformType, const GrGLfloat *transformValues) {
|
| - GL_CALL(StencilThenCoverStrokePathInstanced(numPaths, pathNameType, paths, pathBase, reference,
|
| - mask, coverMode, transformType, transformValues));
|
| -}
|
| -
|
| -
|
| -// NV_path_rendering v1.3
|
| -GrGLvoid GrGLPathRenderingV13::programPathFragmentInputGen(
|
| - GrGLuint program, GrGLint location, GrGLenum genMode,
|
| - GrGLint components, const GrGLfloat *coeffs) {
|
| - GL_CALL(ProgramPathFragmentInputGen(program, location, genMode, components, coeffs));
|
| -}
|
|
|