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());
|
layerCache.getSize(), layerCache.getMaxSize(), layerCache.getCount());
|
||||||
if (mRenderState) {
|
if (mRenderState) {
|
||||||
int memused = 0;
|
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++) {
|
it != mRenderState->mActiveLayers.end(); it++) {
|
||||||
const Layer* layer = *it;
|
const Layer* layer = *it;
|
||||||
log.appendFormat(" Layer size %dx%d; isTextureLayer()=%d; texid=%u fbo=%u; refs=%d\n",
|
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() {
|
Layer::~Layer() {
|
||||||
renderState.requireGLContext();
|
|
||||||
renderState.unregisterLayer(this);
|
renderState.unregisterLayer(this);
|
||||||
SkSafeUnref(colorFilter);
|
SkSafeUnref(colorFilter);
|
||||||
|
|
||||||
|
if (stencil || fbo || texture.id) {
|
||||||
|
renderState.requireGLContext();
|
||||||
removeFbo();
|
removeFbo();
|
||||||
deleteTexture();
|
deleteTexture();
|
||||||
|
}
|
||||||
|
|
||||||
delete[] mesh;
|
delete[] mesh;
|
||||||
delete deferredList;
|
delete deferredList;
|
||||||
delete renderer;
|
delete renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Layer::onGlContextLost() {
|
||||||
|
removeFbo();
|
||||||
|
deleteTexture();
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t Layer::computeIdealWidth(uint32_t layerWidth) {
|
uint32_t Layer::computeIdealWidth(uint32_t layerWidth) {
|
||||||
return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE);
|
return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,6 +285,12 @@ public:
|
|||||||
*/
|
*/
|
||||||
void postDecStrong();
|
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.
|
* Bounds of the layer.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ void RenderState::onGLContextCreated() {
|
|||||||
mCaches->textureCache.setAssetAtlas(&mAssetAtlas);
|
mCaches->textureCache.setAssetAtlas(&mAssetAtlas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void layerLostGlContext(Layer* layer) {
|
||||||
|
layer->onGlContextLost();
|
||||||
|
}
|
||||||
|
|
||||||
void RenderState::onGLContextDestroyed() {
|
void RenderState::onGLContextDestroyed() {
|
||||||
/*
|
/*
|
||||||
size_t size = mActiveLayers.size();
|
size_t size = mActiveLayers.size();
|
||||||
@@ -73,6 +77,7 @@ void RenderState::onGLContextDestroyed() {
|
|||||||
LOG_ALWAYS_FATAL("%d layers have survived gl context destruction", size);
|
LOG_ALWAYS_FATAL("%d layers have survived gl context destruction", size);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
|
||||||
mAssetAtlas.terminate();
|
mAssetAtlas.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ public:
|
|||||||
|
|
||||||
void debugOverdraw(bool enable, bool clear);
|
void debugOverdraw(bool enable, bool clear);
|
||||||
|
|
||||||
void registerLayer(const Layer* layer) {
|
void registerLayer(Layer* layer) {
|
||||||
mActiveLayers.insert(layer);
|
mActiveLayers.insert(layer);
|
||||||
}
|
}
|
||||||
void unregisterLayer(const Layer* layer) {
|
void unregisterLayer(Layer* layer) {
|
||||||
mActiveLayers.erase(layer);
|
mActiveLayers.erase(layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ private:
|
|||||||
renderthread::RenderThread& mRenderThread;
|
renderthread::RenderThread& mRenderThread;
|
||||||
Caches* mCaches;
|
Caches* mCaches;
|
||||||
AssetAtlas mAssetAtlas;
|
AssetAtlas mAssetAtlas;
|
||||||
std::set<const Layer*> mActiveLayers;
|
std::set<Layer*> mActiveLayers;
|
||||||
std::set<renderthread::CanvasContext*> mRegisteredContexts;
|
std::set<renderthread::CanvasContext*> mRegisteredContexts;
|
||||||
|
|
||||||
GLsizei mViewportWidth;
|
GLsizei mViewportWidth;
|
||||||
|
|||||||
Reference in New Issue
Block a user