m_state = Unpainted;
}
+void BaseTile::discardBackTexture() {
+ android::AutoMutex lock(m_atomicSync);
+ if (m_backTexture) {
+ m_backTexture->release(this);
+ m_backTexture = 0;
+ }
+}
+
bool BaseTile::swapTexturesIfNeeded() {
android::AutoMutex lock(m_atomicSync);
if (m_state == ReadyToSwap) {
// only used for prioritization - the higher, the more relevant the tile is
unsigned long long drawCount() { return m_drawCount; }
void discardTextures();
+ void discardBackTexture();
bool swapTexturesIfNeeded();
void backTextureTransfer();
void backTextureTransferFail();
if (m_ownTextureId)
GLUtils::deleteTexture(&m_ownTextureId);
- releaseAndRemoveFromTile();
+ if (m_owner) {
+ // clear both Tile->Texture and Texture->Tile links
+ m_owner->removeTexture(this);
+ release(m_owner);
+ }
}
void BaseTileTexture::destroyTextures(SharedTexture** textures)
return true;
}
-void BaseTileTexture::releaseAndRemoveFromTile()
-{
- // NOTE: only call on UI thread, so m_owner won't be changing
- if (m_owner) {
- // clear both Tile->Texture and Texture->Tile links
- m_owner->removeTexture(this);
- release(m_owner);
- }
-}
-
void BaseTileTexture::setTile(TextureInfo* info, int x, int y,
float scale, TilePainter* painter,
unsigned int pictureCount)
XLOG("ERROR update a tile which is dirty already @ index %d", index);
}
+ m_transferQueue[index].savedBaseTileTexturePtr = renderInfo->baseTile->backTexture();
m_transferQueue[index].savedBaseTilePtr = renderInfo->baseTile;
m_transferQueue[index].status = pendingBlit;
m_transferQueue[index].uploadType = type;
// since tiles in the queue may be from another webview, remove
// their textures so that they will be repainted / retransferred
BaseTile* tile = m_transferQueue[index].savedBaseTilePtr;
- if (tile) {
- BaseTileTexture* texture = tile->backTexture();
- if (texture)
- texture->releaseAndRemoveFromTile();
+ BaseTileTexture* texture = m_transferQueue[index].savedBaseTileTexturePtr;
+ if (tile && texture && texture->owner() == tile) {
+ // since tile destruction removes textures on the UI thread, the
+ // texture->owner ptr guarantees the tile is valid
+ tile->discardBackTexture();
+ XLOG("transfer queue discarded tile %p, removed texture", tile);
}
- XLOG("transfer queue discarded tile %p, removed texture", tile);
m_transferQueue[index].savedBaseTilePtr = 0;
+ m_transferQueue[index].savedBaseTileTexturePtr = 0;
m_transferQueue[index].status = emptyItem;
}
index = (index + 1) % ST_BUFFER_NUMBER;
TileTransferData()
: status(emptyItem)
, savedBaseTilePtr(0)
+ , savedBaseTileTexturePtr(0)
, uploadType(DEFAULT_UPLOAD_TYPE)
, bitmap(0)
, m_syncKHR(EGL_NO_SYNC_KHR)
TransferItemStatus status;
BaseTile* savedBaseTilePtr;
+ BaseTileTexture* savedBaseTileTexturePtr;
TextureTileInfo tileInfo;
TextureUploadType uploadType;
// This is only useful in Cpu upload code path, so it will be dynamically