Merge "Allow ~Layer() to happen after onGLContextDestroyed" into lmp-mr1-dev

This commit is contained in:
John Reck
2015-01-29 20:13:04 +00:00
committed by Android (Google) Code Review
5 changed files with 26 additions and 7 deletions

View File

@ -273,7 +273,7 @@ void Caches::dumpMemoryUsage(String8 &log) {
layerCache.getSize(), layerCache.getMaxSize(), layerCache.getCount());
if (mRenderState) {
int memused = 0;
for (std::set<const Layer*>::iterator it = mRenderState->mActiveLayers.begin();
for (std::set<Layer*>::iterator it = mRenderState->mActiveLayers.begin();
it != mRenderState->mActiveLayers.end(); it++) {
const Layer* layer = *it;
log.appendFormat(" Layer size %dx%d; isTextureLayer()=%d; texid=%u fbo=%u; refs=%d\n",

View File

@ -69,17 +69,25 @@ Layer::Layer(Type layerType, RenderState& renderState, const uint32_t layerWidth
}
Layer::~Layer() {
renderState.requireGLContext();
renderState.unregisterLayer(this);
SkSafeUnref(colorFilter);
removeFbo();
deleteTexture();
if (stencil || fbo || texture.id) {
renderState.requireGLContext();
removeFbo();
deleteTexture();
}
delete[] mesh;
delete deferredList;
delete renderer;
}
void Layer::onGlContextLost() {
removeFbo();
deleteTexture();
}
uint32_t Layer::computeIdealWidth(uint32_t layerWidth) {
return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE);
}

View File

@ -285,6 +285,12 @@ public:
*/
void postDecStrong();
/**
* Lost the GL context but the layer is still around, mark it invalid internally
* so the dtor knows not to do any GL work
*/
void onGlContextLost();
/**
* Bounds of the layer.
*/

View File

@ -41,6 +41,10 @@ void RenderState::onGLContextCreated() {
mCaches->textureCache.setAssetAtlas(&mAssetAtlas);
}
static void layerLostGlContext(Layer* layer) {
layer->onGlContextLost();
}
void RenderState::onGLContextDestroyed() {
/*
size_t size = mActiveLayers.size();
@ -73,6 +77,7 @@ void RenderState::onGLContextDestroyed() {
LOG_ALWAYS_FATAL("%d layers have survived gl context destruction", size);
}
*/
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
mAssetAtlas.terminate();
}

View File

@ -53,10 +53,10 @@ public:
void debugOverdraw(bool enable, bool clear);
void registerLayer(const Layer* layer) {
void registerLayer(Layer* layer) {
mActiveLayers.insert(layer);
}
void unregisterLayer(const Layer* layer) {
void unregisterLayer(Layer* layer) {
mActiveLayers.erase(layer);
}
@ -90,7 +90,7 @@ private:
renderthread::RenderThread& mRenderThread;
Caches* mCaches;
AssetAtlas mAssetAtlas;
std::set<const Layer*> mActiveLayers;
std::set<Layer*> mActiveLayers;
std::set<renderthread::CanvasContext*> mRegisteredContexts;
GLsizei mViewportWidth;