Chromium Code Reviews| Index: src/gpu/gl/GrGpuGL.cpp |
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
| index d29c141c4f77606eea5cc3194e0962d0eeedc32d..4973c0809afb294411b9a7a30fc3bcef4ef16ab9 100644 |
| --- a/src/gpu/gl/GrGpuGL.cpp |
| +++ b/src/gpu/gl/GrGpuGL.cpp |
| @@ -136,7 +136,7 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) |
| SkASSERT(ctx.isInitialized()); |
| fCaps.reset(SkRef(ctx.caps())); |
| - fHWBoundTextures.reset(this->glCaps().maxFragmentTextureUnits()); |
| + fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits()); |
| fHWPathTexGenSettings.reset(this->glCaps().maxFixedFunctionTextureCoords()); |
| GrGLClearErr(fGLContext.interface()); |
| @@ -287,8 +287,8 @@ void GrGpuGL::onResetContext(uint32_t resetBits) { |
| fHWActiveTextureUnitIdx = -1; // invalid |
| if (resetBits & kTextureBinding_GrGLBackendState) { |
| - for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| - fHWBoundTextures[s] = NULL; |
| + for (int s = 0; s < fHWBoundTextureUniqueIDs.count(); ++s) { |
|
robertphillips
2014/07/22 18:15:46
SK_InvalidUniqueID ?
bsalomon
2014/07/22 18:48:45
Done.
|
| + fHWBoundTextureUniqueIDs[s] = 0; |
| } |
| } |
| @@ -312,7 +312,7 @@ void GrGpuGL::onResetContext(uint32_t resetBits) { |
| } |
| if (resetBits & kRenderTarget_GrGLBackendState) { |
|
robertphillips
2014/07/22 18:15:46
same?
bsalomon
2014/07/22 18:48:45
Done.
|
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| } |
| if (resetBits & kPathRendering_GrGLBackendState) { |
| @@ -889,7 +889,7 @@ bool GrGpuGL::createRenderTargetObjects(int width, int height, |
| } |
| // below here we may bind the FBO |
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| if (desc->fRTFBOID != desc->fTexFBOID) { |
| SkASSERT(desc->fSampleCnt > 0); |
| GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, |
| @@ -1274,7 +1274,7 @@ bool GrGpuGL::attachStencilBufferToRenderTarget(GrStencilBuffer* sb, GrRenderTar |
| GrGLStencilBuffer* glsb = static_cast<GrGLStencilBuffer*>(sb); |
| GrGLuint rb = glsb->renderbufferID(); |
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo)); |
| GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| GR_GL_STENCIL_ATTACHMENT, |
| @@ -1485,8 +1485,8 @@ void GrGpuGL::discard(GrRenderTarget* renderTarget) { |
| } |
| GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); |
| - if (renderTarget != fHWBoundRenderTarget) { |
| - fHWBoundRenderTarget = NULL; |
| + if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) { |
| + fHWBoundRenderTargetUniqueID = 0; |
| GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); |
| } |
| switch (this->glCaps().invalidateFBType()) { |
| @@ -1749,7 +1749,8 @@ void GrGpuGL::flushRenderTarget(const SkIRect* bound) { |
| static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget()); |
| SkASSERT(NULL != rt); |
| - if (fHWBoundRenderTarget != rt) { |
| + uint32_t rtID = rt->getUniqueID(); |
| + if (fHWBoundRenderTargetUniqueID != rtID) { |
| GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID())); |
| #ifdef SK_DEBUG |
| // don't do this check in Chromium -- this is causing |
| @@ -1764,7 +1765,7 @@ void GrGpuGL::flushRenderTarget(const SkIRect* bound) { |
| } |
| } |
| #endif |
| - fHWBoundRenderTarget = rt; |
| + fHWBoundRenderTargetUniqueID = rtID; |
| const GrGLIRect& vp = rt->getViewport(); |
| if (fHWViewport != vp) { |
| vp.pushToGLViewport(this->glInterface()); |
| @@ -2007,7 +2008,7 @@ void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { |
| GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID())); |
| // make sure we go through flushRenderTarget() since we've modified |
| // the bound DRAW FBO ID. |
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| const GrGLIRect& vp = rt->getViewport(); |
| const SkIRect dirtyRect = rt->getResolveRect(); |
| GrGLIRect r; |
| @@ -2301,10 +2302,11 @@ void GrGpuGL::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur |
| this->onResolveRenderTarget(texRT); |
| } |
| - if (fHWBoundTextures[unitIdx] != texture) { |
| + uint32_t textureID = texture->getUniqueID(); |
| + if (fHWBoundTextureUniqueIDs[unitIdx] != textureID) { |
| this->setTextureUnit(unitIdx); |
| GL_CALL(BindTexture(GR_GL_TEXTURE_2D, texture->textureID())); |
| - fHWBoundTextures[unitIdx] = texture; |
| + fHWBoundTextureUniqueIDs[unitIdx] = textureID; |
| } |
| ResetTimestamp timestamp; |
| @@ -2532,23 +2534,6 @@ void GrGpuGL::flushMiscFixedFunctionState() { |
| } |
| } |
|
robertphillips
2014/07/22 18:15:46
How is this happening with the new system?
|
| -void GrGpuGL::notifyRenderTargetDelete(GrRenderTarget* renderTarget) { |
| - SkASSERT(NULL != renderTarget); |
| - if (fHWBoundRenderTarget == renderTarget) { |
| - fHWBoundRenderTarget = NULL; |
| - } |
| -} |
| - |
| -void GrGpuGL::notifyTextureDelete(GrGLTexture* texture) { |
| - for (int s = 0; s < fHWBoundTextures.count(); ++s) { |
| - if (fHWBoundTextures[s] == texture) { |
| - // deleting bound texture does implied bind to 0 |
| - fHWBoundTextures[s] = NULL; |
| - } |
| - } |
| -} |
| - |
| - |
| GrGLuint GrGpuGL::createGLPathObject() { |
| if (NULL == fPathNameAllocator.get()) { |
| static const int range = 65536; |
| @@ -2719,7 +2704,7 @@ bool GrGpuGL::configToGLFormats(GrPixelConfig config, |
| } |
| void GrGpuGL::setTextureUnit(int unit) { |
| - SkASSERT(unit >= 0 && unit < fHWBoundTextures.count()); |
| + SkASSERT(unit >= 0 && unit < fHWBoundTextureUniqueIDs.count()); |
| if (unit != fHWActiveTextureUnitIdx) { |
| GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); |
| fHWActiveTextureUnitIdx = unit; |
| @@ -2728,14 +2713,14 @@ void GrGpuGL::setTextureUnit(int unit) { |
| void GrGpuGL::setScratchTextureUnit() { |
| // Bind the last texture unit since it is the least likely to be used by GrGLProgram. |
| - int lastUnitIdx = fHWBoundTextures.count() - 1; |
| + int lastUnitIdx = fHWBoundTextureUniqueIDs.count() - 1; |
| if (lastUnitIdx != fHWActiveTextureUnitIdx) { |
| GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + lastUnitIdx)); |
| fHWActiveTextureUnitIdx = lastUnitIdx; |
| } |
| // clear out the this field so that if a program does use this unit it will rebind the correct |
| // texture. |
| - fHWBoundTextures[lastUnitIdx] = NULL; |
| + fHWBoundTextureUniqueIDs[lastUnitIdx] = 0; |
| } |
| namespace { |
| @@ -2872,7 +2857,7 @@ bool GrGpuGL::onCopySurface(GrSurface* dst, |
| GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); |
| SkASSERT(NULL != dstTex); |
| // We modified the bound FBO |
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| GrGLIRect srcGLRect; |
| srcGLRect.setRelativeTo(srcVP, |
| srcRect.fLeft, |
| @@ -2914,7 +2899,7 @@ bool GrGpuGL::onCopySurface(GrSurface* dst, |
| dstFBO = bind_surface_as_fbo(this->glInterface(), dst, GR_GL_DRAW_FRAMEBUFFER, &dstVP); |
| srcFBO = bind_surface_as_fbo(this->glInterface(), src, GR_GL_READ_FRAMEBUFFER, &srcVP); |
| // We modified the bound FBO |
| - fHWBoundRenderTarget = NULL; |
| + fHWBoundRenderTargetUniqueID = 0; |
| GrGLIRect srcGLRect; |
| GrGLIRect dstGLRect; |
| srcGLRect.setRelativeTo(srcVP, |