Merge "Allow ~Layer() to happen after onGLContextDestroyed" into lmp-mr1-dev
This commit is contained in:
@ -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",
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user