|
18 | 18 | #include "OpenGLRenderer.h" |
19 | 19 |
|
20 | 20 | #include "LayerRenderer.h" |
| 21 | +#include "renderthread/EglManager.h" |
| 22 | +#include "renderthread/RenderTask.h" |
21 | 23 |
|
22 | 24 | namespace android { |
23 | 25 | namespace uirenderer { |
24 | 26 |
|
25 | | -static void defaultLayerDestroyer(Layer* layer) { |
26 | | - Caches::getInstance().resourceCache.decrementRefcount(layer); |
27 | | -} |
| 27 | +class DeleteLayerTask : public renderthread::RenderTask { |
| 28 | +public: |
| 29 | + DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer) |
| 30 | + : mEglManager(eglManager) |
| 31 | + , mLayer(layer) |
| 32 | + {} |
| 33 | + |
| 34 | + virtual void run() { |
| 35 | + mEglManager.requireGlContext(); |
| 36 | + LayerRenderer::destroyLayer(mLayer); |
| 37 | + mLayer = 0; |
| 38 | + delete this; |
| 39 | + } |
28 | 40 |
|
29 | | -DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer) |
| 41 | +private: |
| 42 | + renderthread::EglManager& mEglManager; |
| 43 | + Layer* mLayer; |
| 44 | +}; |
| 45 | + |
| 46 | +DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer) |
30 | 47 | : mSurfaceTexture(0) |
31 | 48 | , mTransform(0) |
32 | 49 | , mNeedsGLContextAttach(false) |
33 | 50 | , mUpdateTexImage(false) |
34 | 51 | , mLayer(layer) |
35 | 52 | , mCaches(Caches::getInstance()) |
36 | | - , mDestroyer(destroyer) { |
| 53 | + , mRenderThread(thread) { |
37 | 54 | mWidth = mLayer->layer.getWidth(); |
38 | 55 | mHeight = mLayer->layer.getHeight(); |
39 | 56 | mBlend = mLayer->isBlend(); |
40 | 57 | mColorFilter = SkSafeRef(mLayer->getColorFilter()); |
41 | 58 | mAlpha = mLayer->getAlpha(); |
42 | 59 | mMode = mLayer->getMode(); |
43 | | - |
44 | | - if (!mDestroyer) { |
45 | | - mDestroyer = defaultLayerDestroyer; |
46 | | - } |
47 | 60 | } |
48 | 61 |
|
49 | 62 | DeferredLayerUpdater::~DeferredLayerUpdater() { |
50 | 63 | SkSafeUnref(mColorFilter); |
51 | 64 | setTransform(0); |
52 | | - mDestroyer(mLayer); |
| 65 | + mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer)); |
| 66 | + mLayer = 0; |
53 | 67 | } |
54 | 68 |
|
55 | 69 | void DeferredLayerUpdater::setPaint(const SkPaint* paint) { |
@@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() { |
121 | 135 |
|
122 | 136 | void DeferredLayerUpdater::detachSurfaceTexture() { |
123 | 137 | if (mSurfaceTexture.get()) { |
124 | | - mSurfaceTexture->detachFromContext(); |
| 138 | + mRenderThread.eglManager().requireGlContext(); |
| 139 | + status_t err = mSurfaceTexture->detachFromContext(); |
| 140 | + if (err != 0) { |
| 141 | + // TODO: Elevate to fatal exception |
| 142 | + ALOGE("Failed to detach SurfaceTexture from context %d", err); |
| 143 | + } |
125 | 144 | mSurfaceTexture = 0; |
126 | 145 | mLayer->clearTexture(); |
127 | 146 | } |
|
0 commit comments