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

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

Issue 474623002: Add new API to allow layer hoisting/atlasing across picture piles Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: more cleanup Created 6 years, 4 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
« no previous file with comments | « src/gpu/SkGpuDevice.cpp ('k') | src/gpu/gl/SkGLContextHelper.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "GrTemplates.h" 11 #include "GrTemplates.h"
12 #include "GrTypes.h" 12 #include "GrTypes.h"
13 #include "SkStrokeRec.h" 13 #include "SkStrokeRec.h"
14 #include "SkTemplates.h" 14 #include "SkTemplates.h"
15 15
16 int gBindFrameBufferCount = 0;
17
16 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) 18 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
17 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X) 19 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X)
18 20
19 #define SKIP_CACHE_CHECK true 21 #define SKIP_CACHE_CHECK true
20 22
21 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR 23 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR
22 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface) 24 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface)
23 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call) 25 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call)
24 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface) 26 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface)
25 #else 27 #else
(...skipping 836 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 if (desc->fRTFBOID != desc->fTexFBOID) { 864 if (desc->fRTFBOID != desc->fTexFBOID) {
863 SkASSERT(desc->fSampleCnt > 0); 865 SkASSERT(desc->fSampleCnt > 0);
864 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, 866 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER,
865 desc->fMSColorRenderbufferID)); 867 desc->fMSColorRenderbufferID));
866 if (!renderbuffer_storage_msaa(fGLContext, 868 if (!renderbuffer_storage_msaa(fGLContext,
867 desc->fSampleCnt, 869 desc->fSampleCnt,
868 msColorFormat, 870 msColorFormat,
869 width, height)) { 871 width, height)) {
870 goto FAILED; 872 goto FAILED;
871 } 873 }
874 gBindFrameBufferCount++;
872 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID)); 875 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID));
873 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 876 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
874 GR_GL_COLOR_ATTACHMENT0, 877 GR_GL_COLOR_ATTACHMENT0,
875 GR_GL_RENDERBUFFER, 878 GR_GL_RENDERBUFFER,
876 desc->fMSColorRenderbufferID)); 879 desc->fMSColorRenderbufferID));
877 if (desc->fCheckAllocation || 880 if (desc->fCheckAllocation ||
878 !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { 881 !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
879 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 882 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
880 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 883 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
881 goto FAILED; 884 goto FAILED;
882 } 885 }
883 fGLContext.caps()->markConfigAsValidColorAttachment(desc->fConfig); 886 fGLContext.caps()->markConfigAsValidColorAttachment(desc->fConfig);
884 } 887 }
885 } 888 }
889 gBindFrameBufferCount++;
886 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID)); 890 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID));
887 891
888 if (this->glCaps().usesImplicitMSAAResolve() && desc->fSampleCnt > 0) { 892 if (this->glCaps().usesImplicitMSAAResolve() && desc->fSampleCnt > 0) {
889 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER, 893 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER,
890 GR_GL_COLOR_ATTACHMENT0, 894 GR_GL_COLOR_ATTACHMENT0,
891 GR_GL_TEXTURE_2D, 895 GR_GL_TEXTURE_2D,
892 texID, 0, desc->fSampleCnt)); 896 texID, 0, desc->fSampleCnt));
893 } else { 897 } else {
894 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, 898 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER,
895 GR_GL_COLOR_ATTACHMENT0, 899 GR_GL_COLOR_ATTACHMENT0,
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1241 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1238 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status); 1242 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status);
1239 #endif 1243 #endif
1240 } 1244 }
1241 return true; 1245 return true;
1242 } else { 1246 } else {
1243 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb); 1247 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb);
1244 GrGLuint rb = glsb->renderbufferID(); 1248 GrGLuint rb = glsb->renderbufferID();
1245 1249
1246 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1250 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1251 gBindFrameBufferCount++;
1247 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo)); 1252 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo));
1248 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1253 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1249 GR_GL_STENCIL_ATTACHMENT, 1254 GR_GL_STENCIL_ATTACHMENT,
1250 GR_GL_RENDERBUFFER, rb)); 1255 GR_GL_RENDERBUFFER, rb));
1251 if (glsb->format().fPacked) { 1256 if (glsb->format().fPacked) {
1252 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1257 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1253 GR_GL_DEPTH_ATTACHMENT, 1258 GR_GL_DEPTH_ATTACHMENT,
1254 GR_GL_RENDERBUFFER, rb)); 1259 GR_GL_RENDERBUFFER, rb));
1255 } else { 1260 } else {
1256 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1261 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 if (NULL == renderTarget) { 1444 if (NULL == renderTarget) {
1440 renderTarget = this->drawState()->getRenderTarget(); 1445 renderTarget = this->drawState()->getRenderTarget();
1441 if (NULL == renderTarget) { 1446 if (NULL == renderTarget) {
1442 return; 1447 return;
1443 } 1448 }
1444 } 1449 }
1445 1450
1446 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); 1451 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget);
1447 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) { 1452 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) {
1448 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1453 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1454 gBindFrameBufferCount++;
1449 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); 1455 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID()));
1450 } 1456 }
1451 switch (this->glCaps().invalidateFBType()) { 1457 switch (this->glCaps().invalidateFBType()) {
1452 case GrGLCaps::kNone_InvalidateFBType: 1458 case GrGLCaps::kNone_InvalidateFBType:
1453 SkFAIL("Should never get here."); 1459 SkFAIL("Should never get here.");
1454 break; 1460 break;
1455 case GrGLCaps::kInvalidate_InvalidateFBType: 1461 case GrGLCaps::kInvalidate_InvalidateFBType:
1456 if (0 == glRT->renderFBOID()) { 1462 if (0 == glRT->renderFBOID()) {
1457 // When rendering to the default framebuffer the legal values f or attachments 1463 // When rendering to the default framebuffer the legal values f or attachments
1458 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment 1464 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 switch (tgt->getResolveType()) { 1610 switch (tgt->getResolveType()) {
1605 case GrGLRenderTarget::kCantResolve_ResolveType: 1611 case GrGLRenderTarget::kCantResolve_ResolveType:
1606 return false; 1612 return false;
1607 case GrGLRenderTarget::kAutoResolves_ResolveType: 1613 case GrGLRenderTarget::kAutoResolves_ResolveType:
1608 artr.set(this->drawState(), target); 1614 artr.set(this->drawState(), target);
1609 this->flushRenderTarget(&SkIRect::EmptyIRect()); 1615 this->flushRenderTarget(&SkIRect::EmptyIRect());
1610 break; 1616 break;
1611 case GrGLRenderTarget::kCanResolve_ResolveType: 1617 case GrGLRenderTarget::kCanResolve_ResolveType:
1612 this->onResolveRenderTarget(tgt); 1618 this->onResolveRenderTarget(tgt);
1613 // we don't track the state of the READ FBO ID. 1619 // we don't track the state of the READ FBO ID.
1620 gBindFrameBufferCount++;
1614 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, 1621 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
1615 tgt->textureFBOID())); 1622 tgt->textureFBOID()));
1616 break; 1623 break;
1617 default: 1624 default:
1618 SkFAIL("Unknown resolve type"); 1625 SkFAIL("Unknown resolve type");
1619 } 1626 }
1620 1627
1621 const GrGLIRect& glvp = tgt->getViewport(); 1628 const GrGLIRect& glvp = tgt->getViewport();
1622 1629
1623 // the read rect is viewport-relative 1630 // the read rect is viewport-relative
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 } 1710 }
1704 1711
1705 void GrGpuGL::flushRenderTarget(const SkIRect* bound) { 1712 void GrGpuGL::flushRenderTarget(const SkIRect* bound) {
1706 1713
1707 GrGLRenderTarget* rt = 1714 GrGLRenderTarget* rt =
1708 static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget()); 1715 static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget());
1709 SkASSERT(NULL != rt); 1716 SkASSERT(NULL != rt);
1710 1717
1711 uint32_t rtID = rt->getUniqueID(); 1718 uint32_t rtID = rt->getUniqueID();
1712 if (fHWBoundRenderTargetUniqueID != rtID) { 1719 if (fHWBoundRenderTargetUniqueID != rtID) {
1720 gBindFrameBufferCount++;
1713 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID())); 1721 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID()));
1714 #ifdef SK_DEBUG 1722 #ifdef SK_DEBUG
1715 // don't do this check in Chromium -- this is causing 1723 // don't do this check in Chromium -- this is causing
1716 // lots of repeated command buffer flushes when the compositor is 1724 // lots of repeated command buffer flushes when the compositor is
1717 // rendering with Ganesh, which is really slow; even too slow for 1725 // rendering with Ganesh, which is really slow; even too slow for
1718 // Debug mode. 1726 // Debug mode.
1719 if (!this->glContext().isChromium()) { 1727 if (!this->glContext().isChromium()) {
1720 GrGLenum status; 1728 GrGLenum status;
1721 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1729 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1722 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 1730 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 #endif 1813 #endif
1806 #endif 1814 #endif
1807 } 1815 }
1808 1816
1809 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { 1817 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) {
1810 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); 1818 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target);
1811 if (rt->needsResolve()) { 1819 if (rt->needsResolve()) {
1812 // Some extensions automatically resolves the texture when it is read. 1820 // Some extensions automatically resolves the texture when it is read.
1813 if (this->glCaps().usesMSAARenderBuffers()) { 1821 if (this->glCaps().usesMSAARenderBuffers()) {
1814 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); 1822 SkASSERT(rt->textureFBOID() != rt->renderFBOID());
1823 gBindFrameBufferCount++;
1815 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); 1824 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID()));
1825 gBindFrameBufferCount++;
1816 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ; 1826 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ;
1817 // make sure we go through flushRenderTarget() since we've modified 1827 // make sure we go through flushRenderTarget() since we've modified
1818 // the bound DRAW FBO ID. 1828 // the bound DRAW FBO ID.
1819 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1829 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1820 const GrGLIRect& vp = rt->getViewport(); 1830 const GrGLIRect& vp = rt->getViewport();
1821 const SkIRect dirtyRect = rt->getResolveRect(); 1831 const SkIRect dirtyRect = rt->getResolveRect();
1822 GrGLIRect r; 1832 GrGLIRect r;
1823 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop, 1833 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop,
1824 dirtyRect.width(), dirtyRect.height(), target->origi n()); 1834 dirtyRect.width(), dirtyRect.height(), target->origi n());
1825 1835
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 inline GrGLuint bind_surface_as_fbo(const GrGLInterface* gl, 2391 inline GrGLuint bind_surface_as_fbo(const GrGLInterface* gl,
2382 GrSurface* surface, 2392 GrSurface* surface,
2383 GrGLenum fboTarget, 2393 GrGLenum fboTarget,
2384 GrGLIRect* viewport) { 2394 GrGLIRect* viewport) {
2385 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge t()); 2395 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge t());
2386 GrGLuint tempFBOID; 2396 GrGLuint tempFBOID;
2387 if (NULL == rt) { 2397 if (NULL == rt) {
2388 SkASSERT(NULL != surface->asTexture()); 2398 SkASSERT(NULL != surface->asTexture());
2389 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur eID(); 2399 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur eID();
2390 GR_GL_CALL(gl, GenFramebuffers(1, &tempFBOID)); 2400 GR_GL_CALL(gl, GenFramebuffers(1, &tempFBOID));
2401 gBindFrameBufferCount++;
2391 GR_GL_CALL(gl, BindFramebuffer(fboTarget, tempFBOID)); 2402 GR_GL_CALL(gl, BindFramebuffer(fboTarget, tempFBOID));
2392 GR_GL_CALL(gl, FramebufferTexture2D(fboTarget, 2403 GR_GL_CALL(gl, FramebufferTexture2D(fboTarget,
2393 GR_GL_COLOR_ATTACHMENT0, 2404 GR_GL_COLOR_ATTACHMENT0,
2394 GR_GL_TEXTURE_2D, 2405 GR_GL_TEXTURE_2D,
2395 texID, 2406 texID,
2396 0)); 2407 0));
2397 viewport->fLeft = 0; 2408 viewport->fLeft = 0;
2398 viewport->fBottom = 0; 2409 viewport->fBottom = 0;
2399 viewport->fWidth = surface->width(); 2410 viewport->fWidth = surface->width();
2400 viewport->fHeight = surface->height(); 2411 viewport->fHeight = surface->height();
2401 } else { 2412 } else {
2402 tempFBOID = 0; 2413 tempFBOID = 0;
2414 gBindFrameBufferCount++;
2403 GR_GL_CALL(gl, BindFramebuffer(fboTarget, rt->renderFBOID())); 2415 GR_GL_CALL(gl, BindFramebuffer(fboTarget, rt->renderFBOID()));
2404 *viewport = rt->getViewport(); 2416 *viewport = rt->getViewport();
2405 } 2417 }
2406 return tempFBOID; 2418 return tempFBOID;
2407 } 2419 }
2408 2420
2409 } 2421 }
2410 2422
2411 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) { 2423 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) {
2412 // Check for format issues with glCopyTexSubImage2D 2424 // Check for format issues with glCopyTexSubImage2D
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2610 this->setVertexArrayID(gpu, 0); 2622 this->setVertexArrayID(gpu, 0);
2611 } 2623 }
2612 int attrCount = gpu->glCaps().maxVertexAttributes(); 2624 int attrCount = gpu->glCaps().maxVertexAttributes();
2613 if (fDefaultVertexArrayAttribState.count() != attrCount) { 2625 if (fDefaultVertexArrayAttribState.count() != attrCount) {
2614 fDefaultVertexArrayAttribState.resize(attrCount); 2626 fDefaultVertexArrayAttribState.resize(attrCount);
2615 } 2627 }
2616 attribState = &fDefaultVertexArrayAttribState; 2628 attribState = &fDefaultVertexArrayAttribState;
2617 } 2629 }
2618 return attribState; 2630 return attribState;
2619 } 2631 }
OLDNEW
« no previous file with comments | « src/gpu/SkGpuDevice.cpp ('k') | src/gpu/gl/SkGLContextHelper.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698