| Index: src/gpu/gl/GrGpuGL.cpp
|
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
|
| index d29c141c4f77606eea5cc3194e0962d0eeedc32d..a0e08e5a00b295e393e11835c5538c0155ba98dd 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) {
|
| + fHWBoundTextureUniqueIDs[s] = SK_InvalidUniqueID;
|
| }
|
| }
|
|
|
| @@ -312,7 +312,7 @@ void GrGpuGL::onResetContext(uint32_t resetBits) {
|
| }
|
|
|
| if (resetBits & kRenderTarget_GrGLBackendState) {
|
| - fHWBoundRenderTarget = NULL;
|
| + fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
|
| }
|
|
|
| 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 = SK_InvalidUniqueID;
|
| 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 = SK_InvalidUniqueID;
|
| 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 = SK_InvalidUniqueID;
|
| 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 = SK_InvalidUniqueID;
|
| 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() {
|
| }
|
| }
|
|
|
| -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] = SK_InvalidUniqueID;
|
| }
|
|
|
| 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 = SK_InvalidUniqueID;
|
| 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 = SK_InvalidUniqueID;
|
| GrGLIRect srcGLRect;
|
| GrGLIRect dstGLRect;
|
| srcGLRect.setRelativeTo(srcVP,
|
|
|