| Index: src/gpu/gl/GrGpuGL.cpp
|
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
|
| index 7131cfa1ebbf6afd8e46b32a8f0651fa85d9407f..c6bd6bbe1474b76c5b1c28529232f761fe152f79 100644
|
| --- a/src/gpu/gl/GrGpuGL.cpp
|
| +++ b/src/gpu/gl/GrGpuGL.cpp
|
| @@ -8,9 +8,6 @@
|
|
|
| #include "GrGpuGL.h"
|
| #include "GrGLStencilBuffer.h"
|
| -#include "GrGLPath.h"
|
| -#include "GrGLPathRange.h"
|
| -#include "GrGLPathRendering.h"
|
| #include "GrGLShaderBuilder.h"
|
| #include "GrTemplates.h"
|
| #include "GrTypes.h"
|
| @@ -35,20 +32,6 @@
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -static const GrGLenum gXformType2GLType[] = {
|
| - GR_GL_NONE,
|
| - GR_GL_TRANSLATE_X,
|
| - GR_GL_TRANSLATE_Y,
|
| - GR_GL_TRANSLATE_2D,
|
| - GR_GL_TRANSPOSE_AFFINE_2D
|
| -};
|
| -
|
| -GR_STATIC_ASSERT(0 == GrDrawTarget::kNone_PathTransformType);
|
| -GR_STATIC_ASSERT(1 == GrDrawTarget::kTranslateX_PathTransformType);
|
| -GR_STATIC_ASSERT(2 == GrDrawTarget::kTranslateY_PathTransformType);
|
| -GR_STATIC_ASSERT(3 == GrDrawTarget::kTranslate_PathTransformType);
|
| -GR_STATIC_ASSERT(4 == GrDrawTarget::kAffine_PathTransformType);
|
| -GR_STATIC_ASSERT(GrDrawTarget::kAffine_PathTransformType == GrDrawTarget::kLast_PathTransformType);
|
|
|
| static const GrGLenum gXfermodeCoeff2Blend[] = {
|
| GR_GL_ZERO,
|
| @@ -137,7 +120,6 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context)
|
| fCaps.reset(SkRef(ctx.caps()));
|
|
|
| fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits());
|
| - fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords());
|
|
|
| GrGLClearErr(fGLContext.interface());
|
| if (gPrintStartupSpew) {
|
| @@ -166,7 +148,7 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context)
|
| fHWProgramID = 0;
|
|
|
| if (this->glCaps().pathRenderingSupport()) {
|
| - fPathRendering.reset(GrGLPathRendering::Create(glInterface()));
|
| + fPathRendering.reset(GrGLPathRendering::Create(this));
|
| }
|
| }
|
|
|
| @@ -328,18 +310,8 @@ void GrGpuGL::onResetContext(uint32_t resetBits) {
|
|
|
| if (resetBits & kPathRendering_GrGLBackendState) {
|
| if (this->caps()->pathRenderingSupport()) {
|
| - fHWProjectionMatrixState.invalidate();
|
| - // we don't use the model view matrix.
|
| - GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW));
|
| -
|
| - for (int i = 0; i < this->glCaps().maxFixedFunctionTextureCoords(); ++i) {
|
| - fPathRendering->pathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL);
|
| - fHWPathTexGenSettings[i].fMode = GR_GL_NONE;
|
| - fHWPathTexGenSettings[i].fNumComponents = 0;
|
| - }
|
| - fHWActivePathTexGenSets = 0;
|
| + this->glPathRendering()->resetContext();
|
| }
|
| - fHWPathStencilSettings.invalidate();
|
| }
|
|
|
| // we assume these values
|
| @@ -1372,16 +1344,6 @@ GrIndexBuffer* GrGpuGL::onCreateIndexBuffer(size_t size, bool dynamic) {
|
| }
|
| }
|
|
|
| -GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) {
|
| - SkASSERT(this->caps()->pathRenderingSupport());
|
| - return SkNEW_ARGS(GrGLPath, (this, inPath, stroke));
|
| -}
|
| -
|
| -GrPathRange* GrGpuGL::onCreatePathRange(size_t size, const SkStrokeRec& stroke) {
|
| - SkASSERT(this->caps()->pathRenderingSupport());
|
| - return SkNEW_ARGS(GrGLPathRange, (this, size, stroke));
|
| -}
|
| -
|
| void GrGpuGL::flushScissor() {
|
| if (fScissorState.fEnabled) {
|
| // Only access the RT if scissoring is being enabled. We can call this before performing
|
| @@ -1839,168 +1801,6 @@ void GrGpuGL::onGpuDraw(const DrawInfo& info) {
|
| #endif
|
| }
|
|
|
| -static GrGLenum gr_stencil_op_to_gl_path_rendering_fill_mode(GrStencilOp op) {
|
| - switch (op) {
|
| - default:
|
| - SkFAIL("Unexpected path fill.");
|
| - /* fallthrough */;
|
| - case kIncClamp_StencilOp:
|
| - return GR_GL_COUNT_UP;
|
| - case kInvert_StencilOp:
|
| - return GR_GL_INVERT;
|
| - }
|
| -}
|
| -
|
| -void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) {
|
| - SkASSERT(this->caps()->pathRenderingSupport());
|
| -
|
| - GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget());
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer());
|
| -
|
| - flushPathStencilSettings(fill);
|
| -
|
| - // Decide how to manipulate the stencil buffer based on the fill rule.
|
| - SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
| -
|
| - GrGLenum fillMode =
|
| - gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| - GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
| - fPathRendering->stencilFillPath(id, fillMode, writeMask);
|
| -}
|
| -
|
| -void GrGpuGL::onGpuDrawPath(const GrPath* path, SkPath::FillType fill) {
|
| - SkASSERT(this->caps()->pathRenderingSupport());
|
| -
|
| - GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget());
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer());
|
| - SkASSERT(!fCurrentProgram->hasVertexShader());
|
| -
|
| - flushPathStencilSettings(fill);
|
| - const SkStrokeRec& stroke = path->getStroke();
|
| -
|
| - SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill);
|
| - SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
| - GrGLenum fillMode =
|
| - gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| - GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
| -
|
| - if (nonInvertedFill == fill) {
|
| - if (stroke.needToApply()) {
|
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - fPathRendering->stencilFillPath(id, fillMode, writeMask);
|
| - }
|
| - fPathRendering->stencilThenCoverStrokePath(id, 0xffff, writeMask, GR_GL_BOUNDING_BOX);
|
| - } else {
|
| - fPathRendering->stencilThenCoverFillPath(id, fillMode, writeMask, GR_GL_BOUNDING_BOX);
|
| - }
|
| - } else {
|
| - if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - fPathRendering->stencilFillPath(id, fillMode, writeMask);
|
| - }
|
| - if (stroke.needToApply()) {
|
| - fPathRendering->stencilStrokePath(id, 0xffff, writeMask);
|
| - }
|
| -
|
| - GrDrawState* drawState = this->drawState();
|
| - GrDrawState::AutoViewMatrixRestore avmr;
|
| - SkRect bounds = SkRect::MakeLTRB(0, 0,
|
| - SkIntToScalar(drawState->getRenderTarget()->width()),
|
| - SkIntToScalar(drawState->getRenderTarget()->height()));
|
| - SkMatrix vmi;
|
| - // mapRect through persp matrix may not be correct
|
| - if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewInverse(&vmi)) {
|
| - vmi.mapRect(&bounds);
|
| - // theoretically could set bloat = 0, instead leave it because of matrix inversion
|
| - // precision.
|
| - SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_ScalarHalf;
|
| - bounds.outset(bloat, bloat);
|
| - } else {
|
| - avmr.setIdentity(drawState);
|
| - }
|
| -
|
| - this->drawSimpleRect(bounds);
|
| - }
|
| -}
|
| -
|
| -void GrGpuGL::onGpuDrawPaths(const GrPathRange* pathRange,
|
| - const uint32_t indices[], int count,
|
| - const float transforms[], PathTransformType transformsType,
|
| - SkPath::FillType fill) {
|
| - SkASSERT(this->caps()->pathRenderingSupport());
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget());
|
| - SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer());
|
| - SkASSERT(!fCurrentProgram->hasVertexShader());
|
| -
|
| - GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID();
|
| -
|
| - flushPathStencilSettings(fill);
|
| - const SkStrokeRec& stroke = pathRange->getStroke();
|
| -
|
| - SkPath::FillType nonInvertedFill =
|
| - SkPath::ConvertToNonInverseFillType(fill);
|
| -
|
| - SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
| - GrGLenum fillMode =
|
| - gr_stencil_op_to_gl_path_rendering_fill_mode(
|
| - fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| - GrGLint writeMask =
|
| - fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
| -
|
| - if (nonInvertedFill == fill) {
|
| - if (stroke.needToApply()) {
|
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - fPathRendering->stencilFillPathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode,
|
| - writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| - }
|
| - fPathRendering->stencilThenCoverStrokePathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff, writeMask,
|
| - GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
|
| - gXformType2GLType[transformsType], transforms);
|
| - } else {
|
| - fPathRendering->stencilThenCoverFillPathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, writeMask,
|
| - GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
|
| - gXformType2GLType[transformsType], transforms);
|
| - }
|
| - } else {
|
| - if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - fPathRendering->stencilFillPathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode,
|
| - writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| - }
|
| - if (stroke.needToApply()) {
|
| - fPathRendering->stencilStrokePathInstanced(
|
| - count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff,
|
| - writeMask, gXformType2GLType[transformsType],
|
| - transforms);
|
| - }
|
| -
|
| - GrDrawState* drawState = this->drawState();
|
| - GrDrawState::AutoViewMatrixRestore avmr;
|
| - SkRect bounds = SkRect::MakeLTRB(0, 0,
|
| - SkIntToScalar(drawState->getRenderTarget()->width()),
|
| - SkIntToScalar(drawState->getRenderTarget()->height()));
|
| - SkMatrix vmi;
|
| - // mapRect through persp matrix may not be correct
|
| - if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewInverse(&vmi)) {
|
| - vmi.mapRect(&bounds);
|
| - // theoretically could set bloat = 0, instead leave it because of matrix inversion
|
| - // precision.
|
| - SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_ScalarHalf;
|
| - bounds.outset(bloat, bloat);
|
| - } else {
|
| - avmr.setIdentity(drawState);
|
| - }
|
| -
|
| - this->drawSimpleRect(bounds);
|
| - }
|
| -}
|
| -
|
| void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) {
|
| GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target);
|
| if (rt->needsResolve()) {
|
| @@ -2046,30 +1846,6 @@ void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) {
|
|
|
| namespace {
|
|
|
| -GrGLenum gr_to_gl_stencil_func(GrStencilFunc basicFunc) {
|
| - static const GrGLenum gTable[] = {
|
| - GR_GL_ALWAYS, // kAlways_StencilFunc
|
| - GR_GL_NEVER, // kNever_StencilFunc
|
| - GR_GL_GREATER, // kGreater_StencilFunc
|
| - GR_GL_GEQUAL, // kGEqual_StencilFunc
|
| - GR_GL_LESS, // kLess_StencilFunc
|
| - GR_GL_LEQUAL, // kLEqual_StencilFunc,
|
| - GR_GL_EQUAL, // kEqual_StencilFunc,
|
| - GR_GL_NOTEQUAL, // kNotEqual_StencilFunc,
|
| - };
|
| - GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kBasicStencilFuncCount);
|
| - GR_STATIC_ASSERT(0 == kAlways_StencilFunc);
|
| - GR_STATIC_ASSERT(1 == kNever_StencilFunc);
|
| - GR_STATIC_ASSERT(2 == kGreater_StencilFunc);
|
| - GR_STATIC_ASSERT(3 == kGEqual_StencilFunc);
|
| - GR_STATIC_ASSERT(4 == kLess_StencilFunc);
|
| - GR_STATIC_ASSERT(5 == kLEqual_StencilFunc);
|
| - GR_STATIC_ASSERT(6 == kEqual_StencilFunc);
|
| - GR_STATIC_ASSERT(7 == kNotEqual_StencilFunc);
|
| - SkASSERT((unsigned) basicFunc < kBasicStencilFuncCount);
|
| -
|
| - return gTable[basicFunc];
|
| -}
|
|
|
| GrGLenum gr_to_gl_stencil_op(GrStencilOp op) {
|
| static const GrGLenum gTable[] = {
|
| @@ -2099,7 +1875,7 @@ void set_gl_stencil(const GrGLInterface* gl,
|
| const GrStencilSettings& settings,
|
| GrGLenum glFace,
|
| GrStencilSettings::Face grFace) {
|
| - GrGLenum glFunc = gr_to_gl_stencil_func(settings.func(grFace));
|
| + GrGLenum glFunc = GrToGLStencilFunc(settings.func(grFace));
|
| GrGLenum glFailOp = gr_to_gl_stencil_op(settings.failOp(grFace));
|
| GrGLenum glPassOp = gr_to_gl_stencil_op(settings.passOp(grFace));
|
|
|
| @@ -2187,22 +1963,6 @@ void GrGpuGL::flushAAState(DrawType type) {
|
| }
|
| }
|
|
|
| -void GrGpuGL::flushPathStencilSettings(SkPath::FillType fill) {
|
| - GrStencilSettings pathStencilSettings;
|
| - this->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 =
|
| - gr_to_gl_stencil_func(pathStencilSettings.func(GrStencilSettings::kFront_Face));
|
| - fPathRendering->pathStencilFunc(
|
| - func, pathStencilSettings.funcRef(GrStencilSettings::kFront_Face),
|
| - pathStencilSettings.funcMask(GrStencilSettings::kFront_Face));
|
| -
|
| - fHWPathStencilSettings = pathStencilSettings;
|
| - }
|
| -}
|
| -
|
| void GrGpuGL::flushBlend(bool isLines,
|
| GrBlendCoeff srcCoeff,
|
| GrBlendCoeff dstCoeff) {
|
| @@ -2349,104 +2109,6 @@ void GrGpuGL::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
| texture->setCachedTexParams(newTexParams, this->getResetTimestamp());
|
| }
|
|
|
| -void GrGpuGL::setProjectionMatrix(const SkMatrix& matrix,
|
| - const SkISize& renderTargetSize,
|
| - GrSurfaceOrigin renderTargetOrigin) {
|
| -
|
| - SkASSERT(this->glCaps().pathRenderingSupport());
|
| -
|
| - if (renderTargetOrigin == fHWProjectionMatrixState.fRenderTargetOrigin &&
|
| - renderTargetSize == fHWProjectionMatrixState.fRenderTargetSize &&
|
| - matrix.cheapEqualTo(fHWProjectionMatrixState.fViewMatrix)) {
|
| - return;
|
| - }
|
| -
|
| - fHWProjectionMatrixState.fViewMatrix = matrix;
|
| - fHWProjectionMatrixState.fRenderTargetSize = renderTargetSize;
|
| - fHWProjectionMatrixState.fRenderTargetOrigin = renderTargetOrigin;
|
| -
|
| - GrGLfloat glMatrix[4 * 4];
|
| - fHWProjectionMatrixState.getRTAdjustedGLMatrix<4>(glMatrix);
|
| - GL_CALL(MatrixLoadf(GR_GL_PROJECTION, glMatrix));
|
| -}
|
| -
|
| -void GrGpuGL::enablePathTexGen(int unitIdx,
|
| - PathTexGenComponents components,
|
| - const GrGLfloat* coefficients) {
|
| - SkASSERT(this->glCaps().pathRenderingSupport());
|
| - SkASSERT(components >= kS_PathTexGenComponents &&
|
| - components <= kSTR_PathTexGenComponents);
|
| - SkASSERT(this->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;
|
| - }
|
| -
|
| - this->setTextureUnit(unitIdx);
|
| -
|
| - fHWPathTexGenSettings[unitIdx].fNumComponents = components;
|
| - fPathRendering->pathTexGen(GR_GL_TEXTURE0 + unitIdx,
|
| - GR_GL_OBJECT_LINEAR,
|
| - components,
|
| - coefficients);
|
| -
|
| - memcpy(fHWPathTexGenSettings[unitIdx].fCoefficients, coefficients,
|
| - 3 * components * sizeof(GrGLfloat));
|
| -}
|
| -
|
| -void GrGpuGL::enablePathTexGen(int unitIdx, PathTexGenComponents components,
|
| - const SkMatrix& matrix) {
|
| - GrGLfloat coefficients[3 * 3];
|
| - SkASSERT(this->glCaps().pathRenderingSupport());
|
| - 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]);
|
| - }
|
| -
|
| - enablePathTexGen(unitIdx, components, coefficients);
|
| -}
|
| -
|
| -void GrGpuGL::flushPathTexGenSettings(int numUsedTexCoordSets) {
|
| - SkASSERT(this->glCaps().pathRenderingSupport());
|
| - SkASSERT(this->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);
|
| -
|
| - this->setTextureUnit(i);
|
| - fPathRendering->pathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL);
|
| - fHWPathTexGenSettings[i].fNumComponents = 0;
|
| - }
|
| -
|
| - fHWActivePathTexGenSets = numUsedTexCoordSets;
|
| -}
|
| -
|
| void GrGpuGL::flushMiscFixedFunctionState() {
|
|
|
| const GrDrawState& drawState = this->getDrawState();
|
|
|