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

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

Issue 405023003: Revert of Use the GrCacheable ID to eliminate the need for notifications to GrGpuGL when textures and RTs are… (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 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/gl/GrGpuGL.h ('k') | no next file » | 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 "GrGLNameAllocator.h" 10 #include "GrGLNameAllocator.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 113
114 static bool gPrintStartupSpew; 114 static bool gPrintStartupSpew;
115 115
116 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) 116 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context)
117 : GrGpu(context) 117 : GrGpu(context)
118 , fGLContext(ctx) { 118 , fGLContext(ctx) {
119 119
120 SkASSERT(ctx.isInitialized()); 120 SkASSERT(ctx.isInitialized());
121 fCaps.reset(SkRef(ctx.caps())); 121 fCaps.reset(SkRef(ctx.caps()));
122 122
123 fHWBoundTextureInstanceIDs.reset(this->glCaps().maxFragmentTextureUnits()); 123 fHWBoundTextures.reset(this->glCaps().maxFragmentTextureUnits());
124 fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords()); 124 fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords());
125 125
126 GrGLClearErr(fGLContext.interface()); 126 GrGLClearErr(fGLContext.interface());
127 if (gPrintStartupSpew) { 127 if (gPrintStartupSpew) {
128 const GrGLubyte* vendor; 128 const GrGLubyte* vendor;
129 const GrGLubyte* renderer; 129 const GrGLubyte* renderer;
130 const GrGLubyte* version; 130 const GrGLubyte* version;
131 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); 131 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR));
132 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); 132 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER));
133 GL_CALL_RET(version, GetString(GR_GL_VERSION)); 133 GL_CALL_RET(version, GetString(GR_GL_VERSION));
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 GL_CALL(LineWidth(1)); 266 GL_CALL(LineWidth(1));
267 } 267 }
268 268
269 if (resetBits & kAA_GrGLBackendState) { 269 if (resetBits & kAA_GrGLBackendState) {
270 fHWAAState.invalidate(); 270 fHWAAState.invalidate();
271 } 271 }
272 272
273 fHWActiveTextureUnitIdx = -1; // invalid 273 fHWActiveTextureUnitIdx = -1; // invalid
274 274
275 if (resetBits & kTextureBinding_GrGLBackendState) { 275 if (resetBits & kTextureBinding_GrGLBackendState) {
276 for (int s = 0; s < fHWBoundTextureInstanceIDs.count(); ++s) { 276 for (int s = 0; s < fHWBoundTextures.count(); ++s) {
277 fHWBoundTextureInstanceIDs[s] = 0; 277 fHWBoundTextures[s] = NULL;
278 } 278 }
279 } 279 }
280 280
281 if (resetBits & kBlend_GrGLBackendState) { 281 if (resetBits & kBlend_GrGLBackendState) {
282 fHWBlendState.invalidate(); 282 fHWBlendState.invalidate();
283 } 283 }
284 284
285 if (resetBits & kView_GrGLBackendState) { 285 if (resetBits & kView_GrGLBackendState) {
286 fHWScissorSettings.invalidate(); 286 fHWScissorSettings.invalidate();
287 fHWViewport.invalidate(); 287 fHWViewport.invalidate();
288 } 288 }
289 289
290 if (resetBits & kStencil_GrGLBackendState) { 290 if (resetBits & kStencil_GrGLBackendState) {
291 fHWStencilSettings.invalidate(); 291 fHWStencilSettings.invalidate();
292 fHWStencilTestEnabled = kUnknown_TriState; 292 fHWStencilTestEnabled = kUnknown_TriState;
293 } 293 }
294 294
295 // Vertex 295 // Vertex
296 if (resetBits & kVertex_GrGLBackendState) { 296 if (resetBits & kVertex_GrGLBackendState) {
297 fHWGeometryState.invalidate(); 297 fHWGeometryState.invalidate();
298 } 298 }
299 299
300 if (resetBits & kRenderTarget_GrGLBackendState) { 300 if (resetBits & kRenderTarget_GrGLBackendState) {
301 fHWBoundRenderTargetInstanceID = 0; 301 fHWBoundRenderTarget = NULL;
302 } 302 }
303 303
304 if (resetBits & kPathRendering_GrGLBackendState) { 304 if (resetBits & kPathRendering_GrGLBackendState) {
305 if (this->caps()->pathRenderingSupport()) { 305 if (this->caps()->pathRenderingSupport()) {
306 fHWProjectionMatrixState.invalidate(); 306 fHWProjectionMatrixState.invalidate();
307 // we don't use the model view matrix. 307 // we don't use the model view matrix.
308 GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW)); 308 GL_CALL(MatrixLoadIdentity(GR_GL_MODELVIEW));
309 309
310 for (int i = 0; i < this->glCaps().maxFixedFunctionTextureCoords(); ++i) { 310 for (int i = 0; i < this->glCaps().maxFixedFunctionTextureCoords(); ++i) {
311 GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL)); 311 GL_CALL(PathTexGen(GR_GL_TEXTURE0 + i, GR_GL_NONE, 0, NULL));
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 &msColorFormat, 860 &msColorFormat,
861 NULL, 861 NULL,
862 NULL)) { 862 NULL)) {
863 goto FAILED; 863 goto FAILED;
864 } 864 }
865 } else { 865 } else {
866 desc->fRTFBOID = desc->fTexFBOID; 866 desc->fRTFBOID = desc->fTexFBOID;
867 } 867 }
868 868
869 // below here we may bind the FBO 869 // below here we may bind the FBO
870 fHWBoundRenderTargetInstanceID = 0; 870 fHWBoundRenderTarget = NULL;
871 if (desc->fRTFBOID != desc->fTexFBOID) { 871 if (desc->fRTFBOID != desc->fTexFBOID) {
872 SkASSERT(desc->fSampleCnt > 0); 872 SkASSERT(desc->fSampleCnt > 0);
873 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, 873 GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER,
874 desc->fMSColorRenderbufferID)); 874 desc->fMSColorRenderbufferID));
875 if (!renderbuffer_storage_msaa(fGLContext, 875 if (!renderbuffer_storage_msaa(fGLContext,
876 desc->fSampleCnt, 876 desc->fSampleCnt,
877 msColorFormat, 877 msColorFormat,
878 width, height)) { 878 width, height)) {
879 goto FAILED; 879 goto FAILED;
880 } 880 }
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 GrGLenum status; 1245 GrGLenum status;
1246 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1246 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1247 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status); 1247 SkASSERT(GR_GL_FRAMEBUFFER_COMPLETE == status);
1248 #endif 1248 #endif
1249 } 1249 }
1250 return true; 1250 return true;
1251 } else { 1251 } else {
1252 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb); 1252 GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb);
1253 GrGLuint rb = glsb->renderbufferID(); 1253 GrGLuint rb = glsb->renderbufferID();
1254 1254
1255 fHWBoundRenderTargetInstanceID = 0; 1255 fHWBoundRenderTarget = NULL;
1256 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo)); 1256 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo));
1257 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1257 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1258 GR_GL_STENCIL_ATTACHMENT, 1258 GR_GL_STENCIL_ATTACHMENT,
1259 GR_GL_RENDERBUFFER, rb)); 1259 GR_GL_RENDERBUFFER, rb));
1260 if (glsb->format().fPacked) { 1260 if (glsb->format().fPacked) {
1261 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1261 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
1262 GR_GL_DEPTH_ATTACHMENT, 1262 GR_GL_DEPTH_ATTACHMENT,
1263 GR_GL_RENDERBUFFER, rb)); 1263 GR_GL_RENDERBUFFER, rb));
1264 } else { 1264 } else {
1265 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, 1265 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 return; 1451 return;
1452 } 1452 }
1453 if (NULL == renderTarget) { 1453 if (NULL == renderTarget) {
1454 renderTarget = this->drawState()->getRenderTarget(); 1454 renderTarget = this->drawState()->getRenderTarget();
1455 if (NULL == renderTarget) { 1455 if (NULL == renderTarget) {
1456 return; 1456 return;
1457 } 1457 }
1458 } 1458 }
1459 1459
1460 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); 1460 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget);
1461 if (renderTarget->getInstanceID() != fHWBoundRenderTargetInstanceID) { 1461 if (renderTarget != fHWBoundRenderTarget) {
1462 fHWBoundRenderTargetInstanceID = 0; 1462 fHWBoundRenderTarget = NULL;
1463 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); 1463 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID()));
1464 } 1464 }
1465 switch (this->glCaps().invalidateFBType()) { 1465 switch (this->glCaps().invalidateFBType()) {
1466 case GrGLCaps::kNone_FBFetchType: 1466 case GrGLCaps::kNone_FBFetchType:
1467 SkFAIL("Should never get here."); 1467 SkFAIL("Should never get here.");
1468 break; 1468 break;
1469 case GrGLCaps::kInvalidate_InvalidateFBType: 1469 case GrGLCaps::kInvalidate_InvalidateFBType:
1470 if (0 == glRT->renderFBOID()) { 1470 if (0 == glRT->renderFBOID()) {
1471 // When rendering to the default framebuffer the legal values f or attachments 1471 // When rendering to the default framebuffer the legal values f or attachments
1472 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment 1472 // are GL_COLOR, GL_DEPTH, GL_STENCIL, ... rather than the vari ous FBO attachment
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 } 1715 }
1716 return true; 1716 return true;
1717 } 1717 }
1718 1718
1719 void GrGpuGL::flushRenderTarget(const SkIRect* bound) { 1719 void GrGpuGL::flushRenderTarget(const SkIRect* bound) {
1720 1720
1721 GrGLRenderTarget* rt = 1721 GrGLRenderTarget* rt =
1722 static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget()); 1722 static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget());
1723 SkASSERT(NULL != rt); 1723 SkASSERT(NULL != rt);
1724 1724
1725 uint64_t rtID = rt->getInstanceID(); 1725 if (fHWBoundRenderTarget != rt) {
1726 if (fHWBoundRenderTargetInstanceID != rtID) {
1727 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID())); 1726 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID()));
1728 #ifdef SK_DEBUG 1727 #ifdef SK_DEBUG
1729 // don't do this check in Chromium -- this is causing 1728 // don't do this check in Chromium -- this is causing
1730 // lots of repeated command buffer flushes when the compositor is 1729 // lots of repeated command buffer flushes when the compositor is
1731 // rendering with Ganesh, which is really slow; even too slow for 1730 // rendering with Ganesh, which is really slow; even too slow for
1732 // Debug mode. 1731 // Debug mode.
1733 if (!this->glContext().isChromium()) { 1732 if (!this->glContext().isChromium()) {
1734 GrGLenum status; 1733 GrGLenum status;
1735 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); 1734 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1736 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { 1735 if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
1737 GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x \n", status); 1736 GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x \n", status);
1738 } 1737 }
1739 } 1738 }
1740 #endif 1739 #endif
1741 fHWBoundRenderTargetInstanceID = rtID; 1740 fHWBoundRenderTarget = rt;
1742 const GrGLIRect& vp = rt->getViewport(); 1741 const GrGLIRect& vp = rt->getViewport();
1743 if (fHWViewport != vp) { 1742 if (fHWViewport != vp) {
1744 vp.pushToGLViewport(this->glInterface()); 1743 vp.pushToGLViewport(this->glInterface());
1745 fHWViewport = vp; 1744 fHWViewport = vp;
1746 } 1745 }
1747 } 1746 }
1748 if (NULL == bound || !bound->isEmpty()) { 1747 if (NULL == bound || !bound->isEmpty()) {
1749 rt->flagAsNeedingResolve(bound); 1748 rt->flagAsNeedingResolve(bound);
1750 } 1749 }
1751 1750
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1998 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { 1997 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) {
1999 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); 1998 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target);
2000 if (rt->needsResolve()) { 1999 if (rt->needsResolve()) {
2001 // Some extensions automatically resolves the texture when it is read. 2000 // Some extensions automatically resolves the texture when it is read.
2002 if (this->glCaps().usesMSAARenderBuffers()) { 2001 if (this->glCaps().usesMSAARenderBuffers()) {
2003 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); 2002 SkASSERT(rt->textureFBOID() != rt->renderFBOID());
2004 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); 2003 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID()));
2005 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ; 2004 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())) ;
2006 // make sure we go through flushRenderTarget() since we've modified 2005 // make sure we go through flushRenderTarget() since we've modified
2007 // the bound DRAW FBO ID. 2006 // the bound DRAW FBO ID.
2008 fHWBoundRenderTargetInstanceID = 0; 2007 fHWBoundRenderTarget = NULL;
2009 const GrGLIRect& vp = rt->getViewport(); 2008 const GrGLIRect& vp = rt->getViewport();
2010 const SkIRect dirtyRect = rt->getResolveRect(); 2009 const SkIRect dirtyRect = rt->getResolveRect();
2011 GrGLIRect r; 2010 GrGLIRect r;
2012 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop, 2011 r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop,
2013 dirtyRect.width(), dirtyRect.height(), target->origi n()); 2012 dirtyRect.width(), dirtyRect.height(), target->origi n());
2014 2013
2015 GrAutoTRestore<ScissorState> asr; 2014 GrAutoTRestore<ScissorState> asr;
2016 if (GrGLCaps::kES_Apple_MSFBOType == this->glCaps().msFBOType()) { 2015 if (GrGLCaps::kES_Apple_MSFBOType == this->glCaps().msFBOType()) {
2017 // Apple's extension uses the scissor as the blit bounds. 2016 // Apple's extension uses the scissor as the blit bounds.
2018 asr.reset(&fScissorState); 2017 asr.reset(&fScissorState);
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2292 SkASSERT(NULL != texture); 2291 SkASSERT(NULL != texture);
2293 2292
2294 // If we created a rt/tex and rendered to it without using a texture and now we're texturing 2293 // If we created a rt/tex and rendered to it without using a texture and now we're texturing
2295 // from the rt it will still be the last bound texture, but it needs resolvi ng. So keep this 2294 // from the rt it will still be the last bound texture, but it needs resolvi ng. So keep this
2296 // out of the "last != next" check. 2295 // out of the "last != next" check.
2297 GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderT arget()); 2296 GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderT arget());
2298 if (NULL != texRT) { 2297 if (NULL != texRT) {
2299 this->onResolveRenderTarget(texRT); 2298 this->onResolveRenderTarget(texRT);
2300 } 2299 }
2301 2300
2302 uint64_t textureID = texture->getInstanceID(); 2301 if (fHWBoundTextures[unitIdx] != texture) {
2303 if (fHWBoundTextureInstanceIDs[unitIdx] != textureID) {
2304 this->setTextureUnit(unitIdx); 2302 this->setTextureUnit(unitIdx);
2305 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, texture->textureID())); 2303 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, texture->textureID()));
2306 fHWBoundTextureInstanceIDs[unitIdx] = textureID; 2304 fHWBoundTextures[unitIdx] = texture;
2307 } 2305 }
2308 2306
2309 ResetTimestamp timestamp; 2307 ResetTimestamp timestamp;
2310 const GrGLTexture::TexParams& oldTexParams = texture->getCachedTexParams(&ti mestamp); 2308 const GrGLTexture::TexParams& oldTexParams = texture->getCachedTexParams(&ti mestamp);
2311 bool setAll = timestamp < this->getResetTimestamp(); 2309 bool setAll = timestamp < this->getResetTimestamp();
2312 GrGLTexture::TexParams newTexParams; 2310 GrGLTexture::TexParams newTexParams;
2313 2311
2314 static GrGLenum glMinFilterModes[] = { 2312 static GrGLenum glMinFilterModes[] = {
2315 GR_GL_NEAREST, 2313 GR_GL_NEAREST,
2316 GR_GL_LINEAR, 2314 GR_GL_LINEAR,
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 case GrDrawState::kBoth_DrawFace: 2522 case GrDrawState::kBoth_DrawFace:
2525 GL_CALL(Disable(GR_GL_CULL_FACE)); 2523 GL_CALL(Disable(GR_GL_CULL_FACE));
2526 break; 2524 break;
2527 default: 2525 default:
2528 SkFAIL("Unknown draw face."); 2526 SkFAIL("Unknown draw face.");
2529 } 2527 }
2530 fHWDrawFace = drawState.getDrawFace(); 2528 fHWDrawFace = drawState.getDrawFace();
2531 } 2529 }
2532 } 2530 }
2533 2531
2532 void GrGpuGL::notifyRenderTargetDelete(GrRenderTarget* renderTarget) {
2533 SkASSERT(NULL != renderTarget);
2534 if (fHWBoundRenderTarget == renderTarget) {
2535 fHWBoundRenderTarget = NULL;
2536 }
2537 }
2538
2539 void GrGpuGL::notifyTextureDelete(GrGLTexture* texture) {
2540 for (int s = 0; s < fHWBoundTextures.count(); ++s) {
2541 if (fHWBoundTextures[s] == texture) {
2542 // deleting bound texture does implied bind to 0
2543 fHWBoundTextures[s] = NULL;
2544 }
2545 }
2546 }
2547
2548
2534 GrGLuint GrGpuGL::createGLPathObject() { 2549 GrGLuint GrGpuGL::createGLPathObject() {
2535 if (NULL == fPathNameAllocator.get()) { 2550 if (NULL == fPathNameAllocator.get()) {
2536 static const int range = 65536; 2551 static const int range = 65536;
2537 GrGLuint firstName; 2552 GrGLuint firstName;
2538 GL_CALL_RET(firstName, GenPaths(range)); 2553 GL_CALL_RET(firstName, GenPaths(range));
2539 fPathNameAllocator.reset(SkNEW_ARGS(GrGLNameAllocator, (firstName, first Name + range))); 2554 fPathNameAllocator.reset(SkNEW_ARGS(GrGLNameAllocator, (firstName, first Name + range)));
2540 } 2555 }
2541 2556
2542 GrGLuint name = fPathNameAllocator->allocateName(); 2557 GrGLuint name = fPathNameAllocator->allocateName();
2543 if (0 == name) { 2558 if (0 == name) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2694 *externalType = GR_GL_FLOAT; 2709 *externalType = GR_GL_FLOAT;
2695 break; 2710 break;
2696 2711
2697 default: 2712 default:
2698 return false; 2713 return false;
2699 } 2714 }
2700 return true; 2715 return true;
2701 } 2716 }
2702 2717
2703 void GrGpuGL::setTextureUnit(int unit) { 2718 void GrGpuGL::setTextureUnit(int unit) {
2704 SkASSERT(unit >= 0 && unit < fHWBoundTextureInstanceIDs.count()); 2719 SkASSERT(unit >= 0 && unit < fHWBoundTextures.count());
2705 if (unit != fHWActiveTextureUnitIdx) { 2720 if (unit != fHWActiveTextureUnitIdx) {
2706 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); 2721 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit));
2707 fHWActiveTextureUnitIdx = unit; 2722 fHWActiveTextureUnitIdx = unit;
2708 } 2723 }
2709 } 2724 }
2710 2725
2711 void GrGpuGL::setScratchTextureUnit() { 2726 void GrGpuGL::setScratchTextureUnit() {
2712 // Bind the last texture unit since it is the least likely to be used by GrG LProgram. 2727 // Bind the last texture unit since it is the least likely to be used by GrG LProgram.
2713 int lastUnitIdx = fHWBoundTextureInstanceIDs.count() - 1; 2728 int lastUnitIdx = fHWBoundTextures.count() - 1;
2714 if (lastUnitIdx != fHWActiveTextureUnitIdx) { 2729 if (lastUnitIdx != fHWActiveTextureUnitIdx) {
2715 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + lastUnitIdx)); 2730 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + lastUnitIdx));
2716 fHWActiveTextureUnitIdx = lastUnitIdx; 2731 fHWActiveTextureUnitIdx = lastUnitIdx;
2717 } 2732 }
2718 // clear out the this field so that if a program does use this unit it will rebind the correct 2733 // clear out the this field so that if a program does use this unit it will rebind the correct
2719 // texture. 2734 // texture.
2720 fHWBoundTextureInstanceIDs[lastUnitIdx] = 0; 2735 fHWBoundTextures[lastUnitIdx] = NULL;
2721 } 2736 }
2722 2737
2723 namespace { 2738 namespace {
2724 // Determines whether glBlitFramebuffer could be used between src and dst. 2739 // Determines whether glBlitFramebuffer could be used between src and dst.
2725 inline bool can_blit_framebuffer(const GrSurface* dst, 2740 inline bool can_blit_framebuffer(const GrSurface* dst,
2726 const GrSurface* src, 2741 const GrSurface* src,
2727 const GrGpuGL* gpu, 2742 const GrGpuGL* gpu,
2728 bool* wouldNeedTempFBO = NULL) { 2743 bool* wouldNeedTempFBO = NULL) {
2729 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt > 0) && 2744 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt > 0) &&
2730 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt > 0) && 2745 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt > 0) &&
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
2847 bool copied = false; 2862 bool copied = false;
2848 bool wouldNeedTempFBO = false; 2863 bool wouldNeedTempFBO = false;
2849 if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && 2864 if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) &&
2850 (!wouldNeedTempFBO || !inheritedCouldCopy)) { 2865 (!wouldNeedTempFBO || !inheritedCouldCopy)) {
2851 GrGLuint srcFBO; 2866 GrGLuint srcFBO;
2852 GrGLIRect srcVP; 2867 GrGLIRect srcVP;
2853 srcFBO = bind_surface_as_fbo(this->glInterface(), src, GR_GL_FRAMEBUFFER , &srcVP); 2868 srcFBO = bind_surface_as_fbo(this->glInterface(), src, GR_GL_FRAMEBUFFER , &srcVP);
2854 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); 2869 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture());
2855 SkASSERT(NULL != dstTex); 2870 SkASSERT(NULL != dstTex);
2856 // We modified the bound FBO 2871 // We modified the bound FBO
2857 fHWBoundRenderTargetInstanceID = 0; 2872 fHWBoundRenderTarget = NULL;
2858 GrGLIRect srcGLRect; 2873 GrGLIRect srcGLRect;
2859 srcGLRect.setRelativeTo(srcVP, 2874 srcGLRect.setRelativeTo(srcVP,
2860 srcRect.fLeft, 2875 srcRect.fLeft,
2861 srcRect.fTop, 2876 srcRect.fTop,
2862 srcRect.width(), 2877 srcRect.width(),
2863 srcRect.height(), 2878 srcRect.height(),
2864 src->origin()); 2879 src->origin());
2865 2880
2866 this->setScratchTextureUnit(); 2881 this->setScratchTextureUnit();
2867 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, dstTex->textureID())); 2882 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, dstTex->textureID()));
(...skipping 21 matching lines...) Expand all
2889 } 2904 }
2890 2905
2891 if (!selfOverlap) { 2906 if (!selfOverlap) {
2892 GrGLuint dstFBO; 2907 GrGLuint dstFBO;
2893 GrGLuint srcFBO; 2908 GrGLuint srcFBO;
2894 GrGLIRect dstVP; 2909 GrGLIRect dstVP;
2895 GrGLIRect srcVP; 2910 GrGLIRect srcVP;
2896 dstFBO = bind_surface_as_fbo(this->glInterface(), dst, GR_GL_DRAW_FR AMEBUFFER, &dstVP); 2911 dstFBO = bind_surface_as_fbo(this->glInterface(), dst, GR_GL_DRAW_FR AMEBUFFER, &dstVP);
2897 srcFBO = bind_surface_as_fbo(this->glInterface(), src, GR_GL_READ_FR AMEBUFFER, &srcVP); 2912 srcFBO = bind_surface_as_fbo(this->glInterface(), src, GR_GL_READ_FR AMEBUFFER, &srcVP);
2898 // We modified the bound FBO 2913 // We modified the bound FBO
2899 fHWBoundRenderTargetInstanceID = 0; 2914 fHWBoundRenderTarget = NULL;
2900 GrGLIRect srcGLRect; 2915 GrGLIRect srcGLRect;
2901 GrGLIRect dstGLRect; 2916 GrGLIRect dstGLRect;
2902 srcGLRect.setRelativeTo(srcVP, 2917 srcGLRect.setRelativeTo(srcVP,
2903 srcRect.fLeft, 2918 srcRect.fLeft,
2904 srcRect.fTop, 2919 srcRect.fTop,
2905 srcRect.width(), 2920 srcRect.width(),
2906 srcRect.height(), 2921 srcRect.height(),
2907 src->origin()); 2922 src->origin());
2908 dstGLRect.setRelativeTo(dstVP, 2923 dstGLRect.setRelativeTo(dstVP,
2909 dstRect.fLeft, 2924 dstRect.fLeft,
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
3015 this->setVertexArrayID(gpu, 0); 3030 this->setVertexArrayID(gpu, 0);
3016 } 3031 }
3017 int attrCount = gpu->glCaps().maxVertexAttributes(); 3032 int attrCount = gpu->glCaps().maxVertexAttributes();
3018 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3033 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3019 fDefaultVertexArrayAttribState.resize(attrCount); 3034 fDefaultVertexArrayAttribState.resize(attrCount);
3020 } 3035 }
3021 attribState = &fDefaultVertexArrayAttribState; 3036 attribState = &fDefaultVertexArrayAttribState;
3022 } 3037 }
3023 return attribState; 3038 return attribState;
3024 } 3039 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698