| 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" |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 if (resetBits & kView_GrGLBackendState) { | 349 if (resetBits & kView_GrGLBackendState) { |
| 350 fHWScissorSettings.invalidate(); | 350 fHWScissorSettings.invalidate(); |
| 351 fHWViewport.invalidate(); | 351 fHWViewport.invalidate(); |
| 352 } | 352 } |
| 353 | 353 |
| 354 if (resetBits & kStencil_GrGLBackendState) { | 354 if (resetBits & kStencil_GrGLBackendState) { |
| 355 fHWStencilSettings.invalidate(); | 355 fHWStencilSettings.invalidate(); |
| 356 fHWStencilTestEnabled = kUnknown_TriState; | 356 fHWStencilTestEnabled = kUnknown_TriState; |
| 357 } | 357 } |
| 358 | 358 |
| 359 if (resetBits & kPathRendering_GrGLBackendState && this->glCaps().pathRender
ingSupport()) { |
| 360 fHWPathStencilSettings.invalidate(); |
| 361 } |
| 362 |
| 359 // Vertex | 363 // Vertex |
| 360 if (resetBits & kVertex_GrGLBackendState) { | 364 if (resetBits & kVertex_GrGLBackendState) { |
| 361 fHWGeometryState.invalidate(); | 365 fHWGeometryState.invalidate(); |
| 362 } | 366 } |
| 363 | 367 |
| 364 if (resetBits & kRenderTarget_GrGLBackendState) { | 368 if (resetBits & kRenderTarget_GrGLBackendState) { |
| 365 fHWBoundRenderTarget = NULL; | 369 fHWBoundRenderTarget = NULL; |
| 366 } | 370 } |
| 367 | 371 |
| 368 if (resetBits & kFixedFunction_GrGLBackendState && this->glCaps().fixedFunct
ionSupport()) { | 372 if (resetBits & kFixedFunction_GrGLBackendState && this->glCaps().fixedFunct
ionSupport()) { |
| (...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 return NULL; | 1267 return NULL; |
| 1264 } | 1268 } |
| 1265 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); | 1269 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); |
| 1266 return indexBuffer; | 1270 return indexBuffer; |
| 1267 } | 1271 } |
| 1268 return NULL; | 1272 return NULL; |
| 1269 } | 1273 } |
| 1270 } | 1274 } |
| 1271 | 1275 |
| 1272 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { | 1276 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { |
| 1273 SkASSERT(this->caps()->pathStencilingSupport()); | 1277 SkASSERT(this->caps()->pathRenderingSupport()); |
| 1274 return SkNEW_ARGS(GrGLPath, (this, inPath)); | 1278 return SkNEW_ARGS(GrGLPath, (this, inPath)); |
| 1275 } | 1279 } |
| 1276 | 1280 |
| 1277 void GrGpuGL::flushScissor() { | 1281 void GrGpuGL::flushScissor() { |
| 1278 const GrDrawState& drawState = this->getDrawState(); | 1282 const GrDrawState& drawState = this->getDrawState(); |
| 1279 const GrGLRenderTarget* rt = | 1283 const GrGLRenderTarget* rt = |
| 1280 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); | 1284 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); |
| 1281 | 1285 |
| 1282 SkASSERT(NULL != rt); | 1286 SkASSERT(NULL != rt); |
| 1283 const GrGLIRect& vp = rt->getViewport(); | 1287 const GrGLIRect& vp = rt->getViewport(); |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | 1677 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
| 1674 } | 1678 } |
| 1675 const GrStencilSettings& even_odd_nv_path_stencil_settings() { | 1679 const GrStencilSettings& even_odd_nv_path_stencil_settings() { |
| 1676 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | 1680 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, |
| 1677 kInvert_StencilOp, | 1681 kInvert_StencilOp, |
| 1678 kInvert_StencilOp, | 1682 kInvert_StencilOp, |
| 1679 kAlwaysIfInClip_StencilFunc, | 1683 kAlwaysIfInClip_StencilFunc, |
| 1680 kOnes16, kOnes16, kOnes16); | 1684 kOnes16, kOnes16, kOnes16); |
| 1681 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | 1685 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); |
| 1682 } | 1686 } |
| 1687 GrGLenum gr_stencil_op_to_gl_path_rendering_fill_mode(GrStencilOp op) { |
| 1688 switch (op) { |
| 1689 default: |
| 1690 GrCrash("Unexpected path fill."); |
| 1691 /* fallthrough */; |
| 1692 case kIncClamp_StencilOp: |
| 1693 return GR_GL_COUNT_UP; |
| 1694 case kInvert_StencilOp: |
| 1695 return GR_GL_INVERT; |
| 1696 } |
| 1697 } |
| 1683 } | 1698 } |
| 1684 | 1699 |
| 1685 void GrGpuGL::setStencilPathSettings(const GrPath&, | 1700 const GrStencilSettings& GrGpuGL::getPathStencilSettingsForFillType(SkPath::Fill
Type fill) { |
| 1686 SkPath::FillType fill, | |
| 1687 GrStencilSettings* settings) { | |
| 1688 switch (fill) { | 1701 switch (fill) { |
| 1689 case SkPath::kEvenOdd_FillType: | |
| 1690 *settings = even_odd_nv_path_stencil_settings(); | |
| 1691 return; | |
| 1692 case SkPath::kWinding_FillType: | |
| 1693 *settings = winding_nv_path_stencil_settings(); | |
| 1694 return; | |
| 1695 default: | 1702 default: |
| 1696 GrCrash("Unexpected path fill."); | 1703 GrCrash("Unexpected path fill."); |
| 1704 /* fallthrough */; |
| 1705 case SkPath::kWinding_FillType: |
| 1706 case SkPath::kInverseWinding_FillType: |
| 1707 return winding_nv_path_stencil_settings(); |
| 1708 case SkPath::kEvenOdd_FillType: |
| 1709 case SkPath::kInverseEvenOdd_FillType: |
| 1710 return even_odd_nv_path_stencil_settings(); |
| 1697 } | 1711 } |
| 1698 } | 1712 } |
| 1699 | 1713 |
| 1700 void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { | 1714 void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { |
| 1701 SkASSERT(this->caps()->pathStencilingSupport()); | 1715 SkASSERT(this->caps()->pathRenderingSupport()); |
| 1702 | 1716 |
| 1703 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); | 1717 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
| 1704 GrDrawState* drawState = this->drawState(); | 1718 GrDrawState* drawState = this->drawState(); |
| 1705 SkASSERT(NULL != drawState->getRenderTarget()); | 1719 SkASSERT(NULL != drawState->getRenderTarget()); |
| 1706 if (NULL == drawState->getRenderTarget()->getStencilBuffer()) { | 1720 SkASSERT(NULL != drawState->getRenderTarget()->getStencilBuffer()); |
| 1707 return; | |
| 1708 } | |
| 1709 | 1721 |
| 1710 // Decide how to manipulate the stencil buffer based on the fill rule. | 1722 // Decide how to manipulate the stencil buffer based on the fill rule. |
| 1711 // Also, assert that the stencil settings we set in setStencilPathSettings | 1723 SkASSERT(!fPathStencilSettings.isTwoSided()); |
| 1712 // are present. | 1724 |
| 1713 SkASSERT(!fStencilSettings.isTwoSided()); | 1725 GrGLenum fillMode = |
| 1714 GrGLenum fillMode; | 1726 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); |
| 1715 switch (fill) { | 1727 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); |
| 1716 case SkPath::kWinding_FillType: | 1728 GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| 1717 fillMode = GR_GL_COUNT_UP; | 1729 } |
| 1718 SkASSERT(kIncClamp_StencilOp == | 1730 |
| 1719 fStencilSettings.passOp(GrStencilSettings::kFront_Face)); | 1731 void GrGpuGL::onGpuFillPath(const GrPath* path, SkPath::FillType fill) { |
| 1720 SkASSERT(kIncClamp_StencilOp == | 1732 SkASSERT(this->caps()->pathRenderingSupport()); |
| 1721 fStencilSettings.failOp(GrStencilSettings::kFront_Face)); | 1733 |
| 1722 break; | 1734 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
| 1723 case SkPath::kEvenOdd_FillType: | 1735 GrDrawState* drawState = this->drawState(); |
| 1724 fillMode = GR_GL_INVERT; | 1736 SkASSERT(NULL != drawState->getRenderTarget()); |
| 1725 SkASSERT(kInvert_StencilOp == | 1737 SkASSERT(NULL != drawState->getRenderTarget()->getStencilBuffer()); |
| 1726 fStencilSettings.passOp(GrStencilSettings::kFront_Face)); | 1738 |
| 1727 SkASSERT(kInvert_StencilOp == | 1739 SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill)
; |
| 1728 fStencilSettings.failOp(GrStencilSettings::kFront_Face)); | 1740 SkASSERT(!fPathStencilSettings.isTwoSided()); |
| 1729 break; | 1741 GrGLenum fillMode = |
| 1730 default: | 1742 gr_stencil_op_to_gl_path_rendering_fill_mode(fPathStencilSettings.passOp
(GrStencilSettings::kFront_Face)); |
| 1731 // Only the above two fill rules are allowed. | 1743 GrGLint writeMask = fPathStencilSettings.writeMask(GrStencilSettings::kFront
_Face); |
| 1732 GrCrash("Unexpected path fill."); | 1744 GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| 1733 return; // suppress unused var warning. | 1745 |
| 1746 if (!fCurrentProgram->hasVertexShader() && nonInvertedFill == fill) { |
| 1747 GL_CALL(CoverFillPath(id, GR_GL_BOUNDING_BOX)); |
| 1748 } else { |
| 1749 GrDrawState::AutoViewMatrixRestore avmr; |
| 1750 SkRect bounds; |
| 1751 if (nonInvertedFill == fill) { |
| 1752 bounds = path->getBounds(); |
| 1753 } else { |
| 1754 bounds = SkRect::MakeLTRB(0, 0, |
| 1755 SkIntToScalar(drawState->getRenderTarget()
->width()), |
| 1756 SkIntToScalar(drawState->getRenderTarget()
->height())); |
| 1757 SkMatrix vmi; |
| 1758 // mapRect through persp matrix may not be correct |
| 1759 if (!drawState->getViewMatrix().hasPerspective() && drawState->getVi
ewInverse(&vmi)) { |
| 1760 vmi.mapRect(&bounds); |
| 1761 // theoretically could set bloat = 0, instead leave it because o
f matrix inversion |
| 1762 // precision. |
| 1763 SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK
_ScalarHalf; |
| 1764 bounds.outset(bloat, bloat); |
| 1765 } else { |
| 1766 avmr.setIdentity(drawState); |
| 1767 } |
| 1768 } |
| 1769 |
| 1770 this->drawSimpleRect(bounds, NULL); |
| 1734 } | 1771 } |
| 1735 GrGLint writeMask = fStencilSettings.writeMask(GrStencilSettings::kFront_Fac
e); | |
| 1736 GL_CALL(StencilFillPath(id, fillMode, writeMask)); | |
| 1737 } | 1772 } |
| 1738 | 1773 |
| 1739 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { | 1774 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { |
| 1740 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); | 1775 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); |
| 1741 if (rt->needsResolve()) { | 1776 if (rt->needsResolve()) { |
| 1742 // Some extensions automatically resolves the texture when it is read. | 1777 // Some extensions automatically resolves the texture when it is read. |
| 1743 if (this->glCaps().usesMSAARenderBuffers()) { | 1778 if (this->glCaps().usesMSAARenderBuffers()) { |
| 1744 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); | 1779 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); |
| 1745 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); | 1780 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); |
| 1746 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
; | 1781 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); | 1885 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); |
| 1851 } else { | 1886 } else { |
| 1852 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); | 1887 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); |
| 1853 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); | 1888 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); |
| 1854 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); | 1889 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); |
| 1855 } | 1890 } |
| 1856 } | 1891 } |
| 1857 } | 1892 } |
| 1858 | 1893 |
| 1859 void GrGpuGL::flushStencil(DrawType type) { | 1894 void GrGpuGL::flushStencil(DrawType type) { |
| 1860 if (kStencilPath_DrawType == type) { | 1895 if ((kStencilPath_DrawType == type || kFillPath_DrawType == type) && |
| 1861 SkASSERT(!fStencilSettings.isTwoSided()); | 1896 fHWPathStencilSettings != fPathStencilSettings) { |
| 1897 |
| 1862 // Just the func, ref, and mask is set here. The op and write mask are p
arams to the call | 1898 // Just the func, ref, and mask is set here. The op and write mask are p
arams to the call |
| 1863 // that draws the path to the SB (glStencilFillPath) | 1899 // that draws the path to the SB (glStencilFillPath) |
| 1864 GrGLenum func = | 1900 GrGLenum func = |
| 1865 gr_to_gl_stencil_func(fStencilSettings.func(GrStencilSettings::kFron
t_Face)); | 1901 gr_to_gl_stencil_func(fPathStencilSettings.func(GrStencilSettings::k
Front_Face)); |
| 1866 GL_CALL(PathStencilFunc(func, | 1902 GL_CALL(PathStencilFunc(func, |
| 1867 fStencilSettings.funcRef(GrStencilSettings::kFro
nt_Face), | 1903 fPathStencilSettings.funcRef(GrStencilSettings::
kFront_Face), |
| 1868 fStencilSettings.funcMask(GrStencilSettings::kFr
ont_Face))); | 1904 fPathStencilSettings.funcMask(GrStencilSettings:
:kFront_Face))); |
| 1869 } else if (fHWStencilSettings != fStencilSettings) { | 1905 |
| 1906 fHWPathStencilSettings = fPathStencilSettings; |
| 1907 } |
| 1908 |
| 1909 if (kStencilPath_DrawType != type && fHWStencilSettings != fStencilSettings)
{ |
| 1870 if (fStencilSettings.isDisabled()) { | 1910 if (fStencilSettings.isDisabled()) { |
| 1871 if (kNo_TriState != fHWStencilTestEnabled) { | 1911 if (kNo_TriState != fHWStencilTestEnabled) { |
| 1872 GL_CALL(Disable(GR_GL_STENCIL_TEST)); | 1912 GL_CALL(Disable(GR_GL_STENCIL_TEST)); |
| 1873 fHWStencilTestEnabled = kNo_TriState; | 1913 fHWStencilTestEnabled = kNo_TriState; |
| 1874 } | 1914 } |
| 1875 } else { | 1915 } else { |
| 1876 if (kYes_TriState != fHWStencilTestEnabled) { | 1916 if (kYes_TriState != fHWStencilTestEnabled) { |
| 1877 GL_CALL(Enable(GR_GL_STENCIL_TEST)); | 1917 GL_CALL(Enable(GR_GL_STENCIL_TEST)); |
| 1878 fHWStencilTestEnabled = kYes_TriState; | 1918 fHWStencilTestEnabled = kYes_TriState; |
| 1879 } | 1919 } |
| (...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2707 this->setVertexArrayID(gpu, 0); | 2747 this->setVertexArrayID(gpu, 0); |
| 2708 } | 2748 } |
| 2709 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2749 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2710 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2750 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2711 fDefaultVertexArrayAttribState.resize(attrCount); | 2751 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2712 } | 2752 } |
| 2713 attribState = &fDefaultVertexArrayAttribState; | 2753 attribState = &fDefaultVertexArrayAttribState; |
| 2714 } | 2754 } |
| 2715 return attribState; | 2755 return attribState; |
| 2716 } | 2756 } |
| OLD | NEW |