| 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 1677 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1688             SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK_Sca
      larHalf; |  1688             SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK_Sca
      larHalf; | 
|  1689             bounds.outset(bloat, bloat); |  1689             bounds.outset(bloat, bloat); | 
|  1690         } else { |  1690         } else { | 
|  1691             avmr.setIdentity(drawState); |  1691             avmr.setIdentity(drawState); | 
|  1692         } |  1692         } | 
|  1693  |  1693  | 
|  1694         this->drawSimpleRect(bounds, NULL); |  1694         this->drawSimpleRect(bounds, NULL); | 
|  1695     } |  1695     } | 
|  1696 } |  1696 } | 
|  1697  |  1697  | 
 |  1698 void GrGpuGL::onGpuDrawPaths(size_t pathCount, const GrPath** paths, | 
 |  1699                              const SkMatrix* transforms, | 
 |  1700                              SkPath::FillType fill, | 
 |  1701                              SkStrokeRec::Style stroke) { | 
 |  1702     SkASSERT(this->caps()->pathRenderingSupport()); | 
 |  1703     SkASSERT(NULL != this->drawState()->getRenderTarget()); | 
 |  1704     SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); | 
 |  1705     SkASSERT(!fCurrentProgram->hasVertexShader()); | 
 |  1706     SkASSERT(stroke != SkStrokeRec::kHairline_Style); | 
 |  1707  | 
 |  1708     SkAutoMalloc pathData(pathCount * sizeof(GrGLuint)); | 
 |  1709     SkAutoMalloc transformData(pathCount * sizeof(GrGLfloat) * 6); | 
 |  1710     GrGLfloat* transformValues = | 
 |  1711         reinterpret_cast<GrGLfloat*>(transformData.get()); | 
 |  1712     GrGLuint* pathIDs = reinterpret_cast<GrGLuint*>(pathData.get()); | 
 |  1713  | 
 |  1714     for (size_t i = 0; i < pathCount; ++i) { | 
 |  1715         SkASSERT(transforms[i].asAffine(NULL)); | 
 |  1716         const SkMatrix& m = transforms[i]; | 
 |  1717         transformValues[i * 6] = m.getScaleX(); | 
 |  1718         transformValues[i * 6 + 1] = m.getSkewY(); | 
 |  1719         transformValues[i * 6 + 2] = m.getSkewX(); | 
 |  1720         transformValues[i * 6 + 3] = m.getScaleY(); | 
 |  1721         transformValues[i * 6 + 4] = m.getTranslateX(); | 
 |  1722         transformValues[i * 6 + 5] = m.getTranslateY(); | 
 |  1723         pathIDs[i] = static_cast<const GrGLPath*>(paths[i])->pathID(); | 
 |  1724     } | 
 |  1725  | 
 |  1726     flushPathStencilSettings(fill); | 
 |  1727  | 
 |  1728     SkPath::FillType nonInvertedFill = | 
 |  1729         SkPath::ConvertToNonInverseFillType(fill); | 
 |  1730  | 
 |  1731     SkASSERT(!fHWPathStencilSettings.isTwoSided()); | 
 |  1732     GrGLenum fillMode = | 
 |  1733         gr_stencil_op_to_gl_path_rendering_fill_mode( | 
 |  1734             fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); | 
 |  1735     GrGLint writeMask = | 
 |  1736         fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); | 
 |  1737  | 
 |  1738     bool doFill = stroke == SkStrokeRec::kFill_Style | 
 |  1739         || stroke == SkStrokeRec::kStrokeAndFill_Style; | 
 |  1740     bool doStroke = stroke == SkStrokeRec::kStroke_Style | 
 |  1741         || stroke == SkStrokeRec::kStrokeAndFill_Style; | 
 |  1742  | 
 |  1743     if (doFill) { | 
 |  1744         GL_CALL(StencilFillPathInstanced(pathCount, GR_GL_UNSIGNED_INT, | 
 |  1745                                          pathIDs, 0, | 
 |  1746                                          fillMode, writeMask, | 
 |  1747                                          GR_GL_AFFINE_2D, transformValues)); | 
 |  1748     } | 
 |  1749     if (doStroke) { | 
 |  1750         GL_CALL(StencilStrokePathInstanced(pathCount, GR_GL_UNSIGNED_INT, | 
 |  1751                                            pathIDs, 0, | 
 |  1752                                            0xffff, writeMask, | 
 |  1753                                            GR_GL_AFFINE_2D, transformValues)); | 
 |  1754     } | 
 |  1755  | 
 |  1756     if (nonInvertedFill == fill) { | 
 |  1757         if (doStroke) { | 
 |  1758             GL_CALL(CoverStrokePathInstanced( | 
 |  1759                         pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, | 
 |  1760                         GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, | 
 |  1761                         GR_GL_AFFINE_2D, transformValues)); | 
 |  1762         } else { | 
 |  1763             GL_CALL(CoverFillPathInstanced( | 
 |  1764                         pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, | 
 |  1765                         GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, | 
 |  1766                         GR_GL_AFFINE_2D, transformValues)); | 
 |  1767  | 
 |  1768         } | 
 |  1769     } else { | 
 |  1770         GrDrawState* drawState = this->drawState(); | 
 |  1771         GrDrawState::AutoViewMatrixRestore avmr; | 
 |  1772         SkRect bounds = SkRect::MakeLTRB(0, 0, | 
 |  1773                                          SkIntToScalar(drawState->getRenderTarge
      t()->width()), | 
 |  1774                                          SkIntToScalar(drawState->getRenderTarge
      t()->height())); | 
 |  1775         SkMatrix vmi; | 
 |  1776         // mapRect through persp matrix may not be correct | 
 |  1777         if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewIn
      verse(&vmi)) { | 
 |  1778             vmi.mapRect(&bounds); | 
 |  1779             // theoretically could set bloat = 0, instead leave it because of ma
      trix inversion | 
 |  1780             // precision. | 
 |  1781             SkScalar bloat = drawState->getViewMatrix().getMaxStretch() * SK_Sca
      larHalf; | 
 |  1782             bounds.outset(bloat, bloat); | 
 |  1783         } else { | 
 |  1784             avmr.setIdentity(drawState); | 
 |  1785         } | 
 |  1786  | 
 |  1787         this->drawSimpleRect(bounds, NULL); | 
 |  1788     } | 
 |  1789 } | 
 |  1790  | 
|  1698 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { |  1791 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { | 
|  1699     GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); |  1792     GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); | 
|  1700     if (rt->needsResolve()) { |  1793     if (rt->needsResolve()) { | 
|  1701         // Some extensions automatically resolves the texture when it is read. |  1794         // Some extensions automatically resolves the texture when it is read. | 
|  1702         if (this->glCaps().usesMSAARenderBuffers()) { |  1795         if (this->glCaps().usesMSAARenderBuffers()) { | 
|  1703             SkASSERT(rt->textureFBOID() != rt->renderFBOID()); |  1796             SkASSERT(rt->textureFBOID() != rt->renderFBOID()); | 
|  1704             GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); |  1797             GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); | 
|  1705             GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
      ; |  1798             GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
      ; | 
|  1706             // make sure we go through flushRenderTarget() since we've modified |  1799             // make sure we go through flushRenderTarget() since we've modified | 
|  1707             // the bound DRAW FBO ID. |  1800             // the bound DRAW FBO ID. | 
| (...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2705             this->setVertexArrayID(gpu, 0); |  2798             this->setVertexArrayID(gpu, 0); | 
|  2706         } |  2799         } | 
|  2707         int attrCount = gpu->glCaps().maxVertexAttributes(); |  2800         int attrCount = gpu->glCaps().maxVertexAttributes(); | 
|  2708         if (fDefaultVertexArrayAttribState.count() != attrCount) { |  2801         if (fDefaultVertexArrayAttribState.count() != attrCount) { | 
|  2709             fDefaultVertexArrayAttribState.resize(attrCount); |  2802             fDefaultVertexArrayAttribState.resize(attrCount); | 
|  2710         } |  2803         } | 
|  2711         attribState = &fDefaultVertexArrayAttribState; |  2804         attribState = &fDefaultVertexArrayAttribState; | 
|  2712     } |  2805     } | 
|  2713     return attribState; |  2806     return attribState; | 
|  2714 } |  2807 } | 
| OLD | NEW |