Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: src/gpu/gl/GrGpuGL.cpp

Issue 22686002: Implement path cover with nv_path_rendering (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Omission with non-inverted path bounds fixed Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« src/gpu/GrGpu.cpp ('K') | « src/gpu/gl/GrGpuGL.h ('k') | src/gpu/gl/GrGpuGL_program.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698