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

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

Issue 894013002: patch from issue 886233004 at patchset 40001 (http://crrev.com/886233004#ps40001) (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 5 years, 10 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/GrTest.cpp ('k') | src/gpu/gl/builders/GrGLFragmentShaderBuilder.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 "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLStencilBuffer.h" 10 #include "GrGLStencilBuffer.h"
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 843 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
844 if (idDesc->fRTFBOID != idDesc->fTexFBOID) { 844 if (idDesc->fRTFBOID != idDesc->fTexFBOID) {
845 SkASSERT(desc.fSampleCnt > 0); 845 SkASSERT(desc.fSampleCnt > 0);
846 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, idDesc->fMSColorRenderbuffe rID)); 846 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, idDesc->fMSColorRenderbuffe rID));
847 if (!renderbuffer_storage_msaa(fGLContext, 847 if (!renderbuffer_storage_msaa(fGLContext,
848 desc.fSampleCnt, 848 desc.fSampleCnt,
849 msColorFormat, 849 msColorFormat,
850 desc.fWidth, desc.fHeight)) { 850 desc.fWidth, desc.fHeight)) {
851 goto FAILED; 851 goto FAILED;
852 } 852 }
853 fGPUStats.incRenderTargetBinds(); 853 fStats.incRenderTargetBinds();
854 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID)); 854 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID));
855 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 855 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
856 GR_GL_COLOR_ATTACHMENT0, 856 GR_GL_COLOR_ATTACHMENT0,
857 GR_GL_RENDERBUFFER, 857 GR_GL_RENDERBUFFER,
858 idDesc->fMSColorRenderbufferID)); 858 idDesc->fMSColorRenderbufferID));
859 if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) || 859 if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) ||
860 !this->glCaps().isConfigVerifiedColorAttachment(desc.fConfig)) { 860 !this->glCaps().isConfigVerifiedColorAttachment(desc.fConfig)) {
861 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 861 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
862 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 862 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
863 goto FAILED; 863 goto FAILED;
864 } 864 }
865 fGLContext.caps()->markConfigAsValidColorAttachment(desc.fConfig); 865 fGLContext.caps()->markConfigAsValidColorAttachment(desc.fConfig);
866 } 866 }
867 } 867 }
868 fGPUStats.incRenderTargetBinds(); 868 fStats.incRenderTargetBinds();
869 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fTexFBOID)); 869 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fTexFBOID));
870 870
871 if (this->glCaps().usesImplicitMSAAResolve() && desc.fSampleCnt > 0) { 871 if (this->glCaps().usesImplicitMSAAResolve() && desc.fSampleCnt > 0) {
872 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER, 872 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER,
873 GR_GL_COLOR_ATTACHMENT0, 873 GR_GL_COLOR_ATTACHMENT0,
874 GR_GL_TEXTURE_2D, 874 GR_GL_TEXTURE_2D,
875 texID, 0, desc.fSampleCnt)); 875 texID, 0, desc.fSampleCnt));
876 } else { 876 } else {
877 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, 877 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER,
878 GR_GL_COLOR_ATTACHMENT0, 878 GR_GL_COLOR_ATTACHMENT0,
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1202 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1203 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status); 1203 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status);
1204 #endif 1204 #endif
1205 } 1205 }
1206 return true; 1206 return true;
1207 } else { 1207 } else {
1208 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb); 1208 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb);
1209 GrGLuint rb = glsb->renderbufferID(); 1209 GrGLuint rb = glsb->renderbufferID();
1210 1210
1211 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1211 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1212 fGPUStats.incRenderTargetBinds(); 1212 fStats.incRenderTargetBinds();
1213 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo)); 1213 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo));
1214 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1214 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1215 GR_GL_STENCIL_ATTACHMENT, 1215 GR_GL_STENCIL_ATTACHMENT,
1216 GR_GL_RENDERBUFFER, rb)); 1216 GR_GL_RENDERBUFFER, rb));
1217 if (glsb->format().fPacked) { 1217 if (glsb->format().fPacked) {
1218 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1218 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1219 GR_GL_DEPTH_ATTACHMENT, 1219 GR_GL_DEPTH_ATTACHMENT,
1220 GR_GL_RENDERBUFFER, rb)); 1220 GR_GL_RENDERBUFFER, rb));
1221 } else { 1221 } else {
1222 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1222 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1502 1502
1503 void GrGLGpu::discard(GrRenderTarget* renderTarget) { 1503 void GrGLGpu::discard(GrRenderTarget* renderTarget) {
1504 SkASSERT(renderTarget); 1504 SkASSERT(renderTarget);
1505 if (!this->caps()->discardRenderTargetSupport()) { 1505 if (!this->caps()->discardRenderTargetSupport()) {
1506 return; 1506 return;
1507 } 1507 }
1508 1508
1509 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); 1509 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget);
1510 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) { 1510 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) {
1511 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1511 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1512 fGPUStats.incRenderTargetBinds(); 1512 fStats.incRenderTargetBinds();
1513 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); 1513 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID()));
1514 } 1514 }
1515 switch (this->glCaps().invalidateFBType()) { 1515 switch (this->glCaps().invalidateFBType()) {
1516 case GrGLCaps::kNone_InvalidateFBType: 1516 case GrGLCaps::kNone_InvalidateFBType:
1517 SkFAIL("Should never get here."); 1517 SkFAIL("Should never get here.");
1518 break; 1518 break;
1519 case GrGLCaps::kInvalidate_InvalidateFBType: 1519 case GrGLCaps::kInvalidate_InvalidateFBType:
1520 if (0 == glRT->renderFBOID()) { 1520 if (0 == glRT->renderFBOID()) {
1521 // When rendering to the default framebuffer the legal values f or attachments 1521 // When rendering to the default framebuffer the legal values f or attachments
1522 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment 1522 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(target); 1663 GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(target);
1664 switch (tgt->getResolveType()) { 1664 switch (tgt->getResolveType()) {
1665 case GrGLRenderTarget::kCantResolve_ResolveType: 1665 case GrGLRenderTarget::kCantResolve_ResolveType:
1666 return false; 1666 return false;
1667 case GrGLRenderTarget::kAutoResolves_ResolveType: 1667 case GrGLRenderTarget::kAutoResolves_ResolveType:
1668 this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkI Rect::EmptyIRect()); 1668 this->flushRenderTarget(static_cast<GrGLRenderTarget*>(target), &SkI Rect::EmptyIRect());
1669 break; 1669 break;
1670 case GrGLRenderTarget::kCanResolve_ResolveType: 1670 case GrGLRenderTarget::kCanResolve_ResolveType:
1671 this->onResolveRenderTarget(tgt); 1671 this->onResolveRenderTarget(tgt);
1672 // we don't track the state of the READ FBO ID. 1672 // we don't track the state of the READ FBO ID.
1673 fGPUStats.incRenderTargetBinds(); 1673 fStats.incRenderTargetBinds();
1674 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, 1674 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
1675 tgt->textureFBOID())); 1675 tgt->textureFBOID()));
1676 break; 1676 break;
1677 default: 1677 default:
1678 SkFAIL("Unknown resolve type"); 1678 SkFAIL("Unknown resolve type");
1679 } 1679 }
1680 1680
1681 const GrGLIRect& glvp = tgt->getViewport(); 1681 const GrGLIRect& glvp = tgt->getViewport();
1682 1682
1683 // the read rect is viewport-relative 1683 // the read rect is viewport-relative
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1761 } 1761 }
1762 return true; 1762 return true;
1763 } 1763 }
1764 1764
1765 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) { 1765 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) {
1766 1766
1767 SkASSERT(target); 1767 SkASSERT(target);
1768 1768
1769 uint32_t rtID = target->getUniqueID(); 1769 uint32_t rtID = target->getUniqueID();
1770 if (fHWBoundRenderTargetUniqueID != rtID) { 1770 if (fHWBoundRenderTargetUniqueID != rtID) {
1771 fGPUStats.incRenderTargetBinds(); 1771 fStats.incRenderTargetBinds();
1772 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID())); 1772 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
1773 #ifdef SK_DEBUG 1773 #ifdef SK_DEBUG
1774 // don't do this check in Chromium -- this is causing 1774 // don't do this check in Chromium -- this is causing
1775 // lots of repeated command buffer flushes when the compositor is 1775 // lots of repeated command buffer flushes when the compositor is
1776 // rendering with Ganesh, which is really slow; even too slow for 1776 // rendering with Ganesh, which is really slow; even too slow for
1777 // Debug mode. 1777 // Debug mode.
1778 if (!this->glContext().isChromium()) { 1778 if (!this->glContext().isChromium()) {
1779 GrGLenum status; 1779 GrGLenum status;
1780 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1780 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1781 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 1781 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 fPathRendering->drawPaths(pathRange, indices, indexType, transformValues, 1905 fPathRendering->drawPaths(pathRange, indices, indexType, transformValues,
1906 transformType, count, stencil); 1906 transformType, count, stencil);
1907 } 1907 }
1908 1908
1909 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { 1909 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) {
1910 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); 1910 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target);
1911 if (rt->needsResolve()) { 1911 if (rt->needsResolve()) {
1912 // Some extensions automatically resolves the texture when it is read. 1912 // Some extensions automatically resolves the texture when it is read.
1913 if (this->glCaps().usesMSAARenderBuffers()) { 1913 if (this->glCaps().usesMSAARenderBuffers()) {
1914 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); 1914 SkASSERT(rt->textureFBOID() != rt->renderFBOID());
1915 fGPUStats.incRenderTargetBinds(); 1915 fStats.incRenderTargetBinds();
1916 fGPUStats.incRenderTargetBinds(); 1916 fStats.incRenderTargetBinds();
1917 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); 1917 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID()));
1918 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ; 1918 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ;
1919 // make sure we go through flushRenderTarget() since we've modified 1919 // make sure we go through flushRenderTarget() since we've modified
1920 // the bound DRAW FBO ID. 1920 // the bound DRAW FBO ID.
1921 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; 1921 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1922 const GrGLIRect& vp = rt->getViewport(); 1922 const GrGLIRect& vp = rt->getViewport();
1923 const SkIRect dirtyRect = rt->getResolveRect(); 1923 const SkIRect dirtyRect = rt->getResolveRect();
1924 GrGLIRect r; 1924 GrGLIRect r;
1925 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop, 1925 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop,
1926 dirtyRect.width(), dirtyRect.height(), target->origi n()); 1926 dirtyRect.width(), dirtyRect.height(), target->origi n());
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
2512 2512
2513 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha t the copy rect is 2513 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha t the copy rect is
2514 // relative to is output. 2514 // relative to is output.
2515 GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI Rect* viewport) { 2515 GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI Rect* viewport) {
2516 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge t()); 2516 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge t());
2517 GrGLuint tempFBOID; 2517 GrGLuint tempFBOID;
2518 if (NULL == rt) { 2518 if (NULL == rt) {
2519 SkASSERT(surface->asTexture()); 2519 SkASSERT(surface->asTexture());
2520 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur eID(); 2520 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur eID();
2521 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID)); 2521 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID));
2522 fGPUStats.incRenderTargetBinds(); 2522 fStats.incRenderTargetBinds();
2523 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID)); 2523 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID));
2524 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, 2524 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget,
2525 GR_GL_COLOR_ATTACHM ENT0, 2525 GR_GL_COLOR_ATTACHM ENT0,
2526 GR_GL_TEXTURE_2D, 2526 GR_GL_TEXTURE_2D,
2527 texID, 2527 texID,
2528 0)); 2528 0));
2529 viewport->fLeft = 0; 2529 viewport->fLeft = 0;
2530 viewport->fBottom = 0; 2530 viewport->fBottom = 0;
2531 viewport->fWidth = surface->width(); 2531 viewport->fWidth = surface->width();
2532 viewport->fHeight = surface->height(); 2532 viewport->fHeight = surface->height();
2533 } else { 2533 } else {
2534 tempFBOID = 0; 2534 tempFBOID = 0;
2535 fGPUStats.incRenderTargetBinds(); 2535 fStats.incRenderTargetBinds();
2536 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO ID())); 2536 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO ID()));
2537 *viewport = rt->getViewport(); 2537 *viewport = rt->getViewport();
2538 } 2538 }
2539 return tempFBOID; 2539 return tempFBOID;
2540 } 2540 }
2541 2541
2542 bool GrGLGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) { 2542 bool GrGLGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) {
2543 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If neither are 2543 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If neither are
2544 // possible and we return false to fallback to creating a render target dst for render-to- 2544 // possible and we return false to fallback to creating a render target dst for render-to-
2545 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger ing temporary fbo 2545 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger ing temporary fbo
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
2750 this->setVertexArrayID(gpu, 0); 2750 this->setVertexArrayID(gpu, 0);
2751 } 2751 }
2752 int attrCount = gpu->glCaps().maxVertexAttributes(); 2752 int attrCount = gpu->glCaps().maxVertexAttributes();
2753 if (fDefaultVertexArrayAttribState.count() != attrCount) { 2753 if (fDefaultVertexArrayAttribState.count() != attrCount) {
2754 fDefaultVertexArrayAttribState.resize(attrCount); 2754 fDefaultVertexArrayAttribState.resize(attrCount);
2755 } 2755 }
2756 attribState = &fDefaultVertexArrayAttribState; 2756 attribState = &fDefaultVertexArrayAttribState;
2757 } 2757 }
2758 return attribState; 2758 return attribState;
2759 } 2759 }
OLDNEW
« no previous file with comments | « src/gpu/GrTest.cpp ('k') | src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698