diff options
| author | 2014-04-09 18:10:27 +0000 | |
|---|---|---|
| committer | 2014-04-09 18:10:28 +0000 | |
| commit | a040977de8b3ec791bf3b7e0115630e8c27fd8ca (patch) | |
| tree | 124fdfa7d8f44ec591393d04e47b8a6bc8bb6b53 /libs/hwui | |
| parent | daa610cc42ae68db0af1b63755fe3a7531f47dcc (diff) | |
| parent | f7d9c1dc84671d4e99657ef071d275700d85bb11 (diff) | |
Merge "Fix ThreadedRenderer.setEnabled()"
Diffstat (limited to 'libs/hwui')
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 18 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 3 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 22 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 5 |
4 files changed, 34 insertions, 14 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index c231f6fbf00b..af3534495658 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -347,6 +347,7 @@ void CanvasContext::setSurface(EGLNativeWindowType window) { if (mEglSurface != EGL_NO_SURFACE) { mDirtyRegionsEnabled = mGlobalContext->enableDirtyRegions(mEglSurface); + mGlobalContext->makeCurrent(mEglSurface); mHaveNewSurface = true; } } @@ -356,14 +357,15 @@ void CanvasContext::swapBuffers() { mHaveNewSurface = false; } -void CanvasContext::makeCurrent() { +void CanvasContext::requireSurface() { + LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE, + "requireSurface() called but no surface set!"); mGlobalContext->makeCurrent(mEglSurface); } bool CanvasContext::initialize(EGLNativeWindowType window) { if (mCanvas) return false; setSurface(window); - makeCurrent(); mCanvas = new OpenGLRenderer(); mCanvas->initProperties(); return true; @@ -371,7 +373,11 @@ bool CanvasContext::initialize(EGLNativeWindowType window) { void CanvasContext::updateSurface(EGLNativeWindowType window) { setSurface(window); - makeCurrent(); +} + +void CanvasContext::pauseSurface(EGLNativeWindowType window) { + // TODO: For now we just need a fence, in the future suspend any animations + // and such to prevent from trying to render into this surface } void CanvasContext::setup(int width, int height) { @@ -460,7 +466,7 @@ void CanvasContext::invokeFunctors() { if (!mCanvas) return; - makeCurrent(); + requireSurface(); Rect dirty; mCanvas->invokeFunctors(dirty); } @@ -491,12 +497,12 @@ void CanvasContext::runWithGlContext(RenderTask* task) { } Layer* CanvasContext::createRenderLayer(int width, int height) { - requireGlContext(); + requireSurface(); return LayerRenderer::createRenderLayer(width, height); } Layer* CanvasContext::createTextureLayer() { - requireGlContext(); + requireSurface(); return LayerRenderer::createTextureLayer(); } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 6f1c37f3242a..9f6494480dfa 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -63,6 +63,7 @@ public: bool initialize(EGLNativeWindowType window); void updateSurface(EGLNativeWindowType window); + void pauseSurface(EGLNativeWindowType window); void setup(int width, int height); void setDisplayListData(RenderNode* displayList, DisplayListData* newData); void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters); @@ -83,7 +84,7 @@ public: private: void setSurface(EGLNativeWindowType window); void swapBuffers(); - void makeCurrent(); + void requireSurface(); friend class InvokeFunctorsTask; void invokeFunctors(); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index e817e616f016..a7c955ed50d5 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -92,10 +92,10 @@ CREATE_BRIDGE2(initialize, CanvasContext* context, EGLNativeWindowType window) { return (void*) args->context->initialize(args->window); } -bool RenderProxy::initialize(EGLNativeWindowType window) { +bool RenderProxy::initialize(const sp<ANativeWindow>& window) { SETUP_TASK(initialize); args->context = mContext; - args->window = window; + args->window = window.get(); return (bool) postAndWait(task); } @@ -104,11 +104,23 @@ CREATE_BRIDGE2(updateSurface, CanvasContext* context, EGLNativeWindowType window return NULL; } -void RenderProxy::updateSurface(EGLNativeWindowType window) { +void RenderProxy::updateSurface(const sp<ANativeWindow>& window) { SETUP_TASK(updateSurface); args->context = mContext; - args->window = window; - post(task); + args->window = window.get(); + postAndWait(task); +} + +CREATE_BRIDGE2(pauseSurface, CanvasContext* context, EGLNativeWindowType window) { + args->context->pauseSurface(args->window); + return NULL; +} + +void RenderProxy::pauseSurface(const sp<ANativeWindow>& window) { + SETUP_TASK(pauseSurface); + args->context = mContext; + args->window = window.get(); + postAndWait(task); } CREATE_BRIDGE3(setup, CanvasContext* context, int width, int height) { diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index c50da7976bb5..489bf20c1528 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -59,8 +59,9 @@ public: ANDROID_API RenderProxy(bool translucent); ANDROID_API virtual ~RenderProxy(); - ANDROID_API bool initialize(EGLNativeWindowType window); - ANDROID_API void updateSurface(EGLNativeWindowType window); + ANDROID_API bool initialize(const sp<ANativeWindow>& window); + ANDROID_API void updateSurface(const sp<ANativeWindow>& window); + ANDROID_API void pauseSurface(const sp<ANativeWindow>& window); ANDROID_API void setup(int width, int height); ANDROID_API void setDisplayListData(RenderNode* renderNode, DisplayListData* newData); ANDROID_API void drawDisplayList(RenderNode* displayList, |