OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
11 #include "GrGLPath.h" | 11 #include "GrGLPath.h" |
12 #include "GrGLShaderBuilder.h" | 12 #include "GrGLShaderBuilder.h" |
13 #include "GrTemplates.h" | 13 #include "GrTemplates.h" |
14 #include "GrTypes.h" | 14 #include "GrTypes.h" |
| 15 #include "SkStrokeRec.h" |
15 #include "SkTemplates.h" | 16 #include "SkTemplates.h" |
16 | 17 |
17 static const GrGLuint GR_MAX_GLUINT = ~0U; | 18 static const GrGLuint GR_MAX_GLUINT = ~0U; |
18 static const GrGLint GR_INVAL_GLINT = ~0; | 19 static const GrGLint GR_INVAL_GLINT = ~0; |
19 | 20 |
20 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) | 21 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) |
21 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X) | 22 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X) |
22 | 23 |
23 | 24 |
24 #define SKIP_CACHE_CHECK true | 25 #define SKIP_CACHE_CHECK true |
(...skipping 1241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1266 this->notifyIndexBufferDelete(desc.fID); | 1267 this->notifyIndexBufferDelete(desc.fID); |
1267 return NULL; | 1268 return NULL; |
1268 } | 1269 } |
1269 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); | 1270 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); |
1270 return indexBuffer; | 1271 return indexBuffer; |
1271 } | 1272 } |
1272 return NULL; | 1273 return NULL; |
1273 } | 1274 } |
1274 } | 1275 } |
1275 | 1276 |
1276 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { | 1277 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) { |
1277 SkASSERT(this->caps()->pathRenderingSupport()); | 1278 SkASSERT(this->caps()->pathRenderingSupport()); |
1278 return SkNEW_ARGS(GrGLPath, (this, inPath)); | 1279 return SkNEW_ARGS(GrGLPath, (this, inPath, stroke)); |
1279 } | 1280 } |
1280 | 1281 |
1281 void GrGpuGL::flushScissor() { | 1282 void GrGpuGL::flushScissor() { |
1282 const GrDrawState& drawState = this->getDrawState(); | 1283 const GrDrawState& drawState = this->getDrawState(); |
1283 const GrGLRenderTarget* rt = | 1284 const GrGLRenderTarget* rt = |
1284 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); | 1285 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); |
1285 | 1286 |
1286 SkASSERT(NULL != rt); | 1287 SkASSERT(NULL != rt); |
1287 const GrGLIRect& vp = rt->getViewport(); | 1288 const GrGLIRect& vp = rt->getViewport(); |
1288 | 1289 |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 | 1722 |
1722 // Decide how to manipulate the stencil buffer based on the fill rule. | 1723 // Decide how to manipulate the stencil buffer based on the fill rule. |
1723 SkASSERT(!fPathStencilSettings.isTwoSided()); | 1724 SkASSERT(!fPathStencilSettings.isTwoSided()); |
1724 | 1725 |
1725 GrGLenum fillMode = | 1726 GrGLenum fillMode = |
1726 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); | 1727 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); |
1727 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); | 1728 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); |
1728 GL_CALL(StencilFillPath(id, fillMode, writeMask)); | 1729 GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
1729 } | 1730 } |
1730 | 1731 |
1731 void GrGpuGL::onGpuFillPath(const GrPath* path, SkPath::FillType fill) { | 1732 void GrGpuGL::onGpuDrawPath(const GrPath* path, const SkStrokeRec& stroke, SkPat
h::FillType fill) { |
1732 SkASSERT(this->caps()->pathRenderingSupport()); | 1733 SkASSERT(this->caps()->pathRenderingSupport()); |
1733 | 1734 |
1734 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); | 1735 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
1735 GrDrawState* drawState = this->drawState(); | 1736 GrDrawState* drawState = this->drawState(); |
1736 SkASSERT(NULL != drawState->getRenderTarget()); | 1737 SkASSERT(NULL != drawState->getRenderTarget()); |
1737 SkASSERT(NULL != drawState->getRenderTarget()->getStencilBuffer()); | 1738 SkASSERT(NULL != drawState->getRenderTarget()->getStencilBuffer()); |
1738 | 1739 |
1739 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill)
; | |
1740 SkASSERT(!fPathStencilSettings.isTwoSided()); | 1740 SkASSERT(!fPathStencilSettings.isTwoSided()); |
1741 GrGLenum fillMode = | 1741 GrGLenum fillMode = |
1742 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); | 1742 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); |
1743 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); | 1743 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); |
1744 GL_CALL(StencilFillPath(id, fillMode, writeMask)); | |
1745 | 1744 |
1746 if (!fCurrentProgram->hasVertexShader() && nonInvertedFill == fill) { | 1745 if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getS
tyle()) { |
1747 GL_CALL(CoverFillPath(id, GR_GL_BOUNDING_BOX)); | 1746 GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| 1747 } |
| 1748 |
| 1749 if (stroke.needToApply()) { |
| 1750 GL_CALL(StencilStrokePath(id, 0xffff, writeMask)); |
| 1751 } |
| 1752 |
| 1753 bool isInverseFill = SkPath::ConvertToNonInverseFillType(fill) != fill; |
| 1754 |
| 1755 if (!fCurrentProgram->hasVertexShader() && !isInverseFill) { |
| 1756 if (stroke.needToApply()) { |
| 1757 GL_CALL(CoverStrokePath(id, GR_GL_BOUNDING_BOX)); |
| 1758 } else { |
| 1759 GL_CALL(CoverFillPath(id, GR_GL_BOUNDING_BOX)); |
| 1760 } |
1748 } else { | 1761 } else { |
1749 GrDrawState::AutoViewMatrixRestore avmr; | 1762 GrDrawState::AutoViewMatrixRestore avmr; |
| 1763 SkMatrix vmi; |
1750 SkRect bounds; | 1764 SkRect bounds; |
1751 if (nonInvertedFill == fill) { | 1765 if (!isInverseFill) { |
1752 bounds = path->getBounds(); | 1766 bounds = path->getBounds(); |
1753 } else { | 1767 } else { |
1754 bounds = SkRect::MakeLTRB(0, 0, | 1768 bounds = SkRect::MakeLTRB(0, 0, |
1755 SkIntToScalar(drawState->getRenderTarget()
->width()), | 1769 SkIntToScalar(drawState->getRenderTarget()
->width()), |
1756 SkIntToScalar(drawState->getRenderTarget()
->height())); | 1770 SkIntToScalar(drawState->getRenderTarget()->he
ight())); |
1757 SkMatrix vmi; | 1771 |
1758 // mapRect through persp matrix may not be correct | 1772 // mapRect through persp matrix may not be correct |
1759 if (!drawState->getViewMatrix().hasPerspective() && drawState->getVi
ewInverse(&vmi)) { | 1773 if (!drawState->getViewMatrix().hasPerspective() && drawState->getVi
ewInverse(&vmi)) { |
1760 vmi.mapRect(&bounds); | 1774 vmi.mapRect(&bounds); |
1761 // theoretically could set bloat = 0, instead leave it because o
f matrix inversion | 1775 // theoretically could set bloat = 0, instead leave it because o
f matrix inversion |
1762 // precision. | 1776 // precision. |
1763 SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK
_ScalarHalf; | 1777 SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK
_ScalarHalf; |
1764 bounds.outset(bloat, bloat); | 1778 bounds.outset(bloat, bloat); |
1765 } else { | 1779 } else { |
1766 avmr.setIdentity(drawState); | 1780 avmr.setIdentity(drawState); |
1767 } | 1781 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); | 1899 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); |
1886 } else { | 1900 } else { |
1887 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); | 1901 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); |
1888 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); | 1902 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); |
1889 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); | 1903 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); |
1890 } | 1904 } |
1891 } | 1905 } |
1892 } | 1906 } |
1893 | 1907 |
1894 void GrGpuGL::flushStencil(DrawType type) { | 1908 void GrGpuGL::flushStencil(DrawType type) { |
1895 if ((kStencilPath_DrawType == type || kFillPath_DrawType == type) && | 1909 if ((kStencilPath_DrawType == type || kDrawPath_DrawType == type) && |
1896 fHWPathStencilSettings != fPathStencilSettings) { | 1910 fHWPathStencilSettings != fPathStencilSettings) { |
1897 | 1911 |
1898 // Just the func, ref, and mask is set here. The op and write mask are p
arams to the call | 1912 // Just the func, ref, and mask is set here. The op and write mask are p
arams to the call |
1899 // that draws the path to the SB (glStencilFillPath) | 1913 // that draws the path to the SB (glStencilFillPath) |
1900 GrGLenum func = | 1914 GrGLenum func = |
1901 gr_to_gl_stencil_func(fPathStencilSettings.func(GrStencilSettings::k
Front_Face)); | 1915 gr_to_gl_stencil_func(fPathStencilSettings.func(GrStencilSettings::k
Front_Face)); |
1902 GL_CALL(PathStencilFunc(func, | 1916 GL_CALL(PathStencilFunc(func, |
1903 fPathStencilSettings.funcRef(GrStencilSettings::
kFront_Face), | 1917 fPathStencilSettings.funcRef(GrStencilSettings::
kFront_Face), |
1904 fPathStencilSettings.funcMask(GrStencilSettings:
:kFront_Face))); | 1918 fPathStencilSettings.funcMask(GrStencilSettings:
:kFront_Face))); |
1905 | 1919 |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2220 numComponents, | 2234 numComponents, |
2221 coefficients)); | 2235 coefficients)); |
2222 | 2236 |
2223 memcpy(fHWTexGenSettings[unitIdx].fCoefficients, coefficients, | 2237 memcpy(fHWTexGenSettings[unitIdx].fCoefficients, coefficients, |
2224 3 * numComponents * sizeof(GrGLfloat)); | 2238 3 * numComponents * sizeof(GrGLfloat)); |
2225 | 2239 |
2226 fHWActiveTexGenUnits = SkTMax(fHWActiveTexGenUnits, unitIdx); | 2240 fHWActiveTexGenUnits = SkTMax(fHWActiveTexGenUnits, unitIdx); |
2227 } | 2241 } |
2228 | 2242 |
2229 void GrGpuGL::enableTexGen(int unitIdx, int numComponents, const SkMatrix& matri
x) { | 2243 void GrGpuGL::enableTexGen(int unitIdx, int numComponents, const SkMatrix& matri
x) { |
2230 | |
2231 GrGLfloat coefficients[9]; | 2244 GrGLfloat coefficients[9]; |
2232 SkASSERT(this->glCaps().fixedFunctionSupport()); | 2245 SkASSERT(this->glCaps().fixedFunctionSupport()); |
2233 SkASSERT(numComponents <= 3 && numComponents > 0); | 2246 SkASSERT(numComponents <= 3 && numComponents > 0); |
2234 | 2247 |
2235 coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]); | 2248 coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]); |
2236 coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]); | 2249 coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]); |
2237 coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]); | 2250 coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]); |
2238 | 2251 |
2239 if (numComponents >= 2) { | 2252 if (numComponents >= 2) { |
2240 coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]); | 2253 coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]); |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2747 this->setVertexArrayID(gpu, 0); | 2760 this->setVertexArrayID(gpu, 0); |
2748 } | 2761 } |
2749 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2762 int attrCount = gpu->glCaps().maxVertexAttributes(); |
2750 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2763 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
2751 fDefaultVertexArrayAttribState.resize(attrCount); | 2764 fDefaultVertexArrayAttribState.resize(attrCount); |
2752 } | 2765 } |
2753 attribState = &fDefaultVertexArrayAttribState; | 2766 attribState = &fDefaultVertexArrayAttribState; |
2754 } | 2767 } |
2755 return attribState; | 2768 return attribState; |
2756 } | 2769 } |
OLD | NEW |