diff options
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 82 |
1 files changed, 23 insertions, 59 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index c231f6f..3638184 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -313,14 +313,11 @@ CanvasContext::CanvasContext(bool translucent) , mDirtyRegionsEnabled(false) , mOpaque(!translucent) , mCanvas(0) - , mHaveNewSurface(false) - , mInvokeFunctorsPending(false) - , mInvokeFunctorsTask(this) { + , mHaveNewSurface(false) { mGlobalContext = GlobalContext::get(); } CanvasContext::~CanvasContext() { - removeFunctorsTask(); destroyCanvas(); } @@ -347,6 +344,7 @@ void CanvasContext::setSurface(EGLNativeWindowType window) { if (mEglSurface != EGL_NO_SURFACE) { mDirtyRegionsEnabled = mGlobalContext->enableDirtyRegions(mEglSurface); + mGlobalContext->makeCurrent(mEglSurface); mHaveNewSurface = true; } } @@ -356,14 +354,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 +370,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) { @@ -379,15 +382,13 @@ void CanvasContext::setup(int width, int height) { mCanvas->setViewport(width, height); } -void CanvasContext::setDisplayListData(RenderNode* displayList, DisplayListData* newData) { - displayList->setData(newData); -} - -void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters) { +void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, + bool* hasFunctors) { + LOG_ALWAYS_FATAL_IF(!mCanvas, "Cannot process layer updates without a canvas!"); mGlobalContext->makeCurrent(mEglSurface); for (size_t i = 0; i < layerUpdaters->size(); i++) { DeferredLayerUpdater* update = layerUpdaters->itemAt(i); - LOG_ALWAYS_FATAL_IF(!update->apply(), "Failed to update layer!"); + LOG_ALWAYS_FATAL_IF(!update->apply(hasFunctors), "Failed to update layer!"); if (update->backingLayer()->deferredUpdateScheduled) { mCanvas->pushLayerUpdate(update->backingLayer()); } @@ -428,60 +429,23 @@ void CanvasContext::drawDisplayList(RenderNode* displayList, Rect* dirty) { } } -void InvokeFunctorsTask::run() { - mContext->invokeFunctors(); -} - -void CanvasContext::attachFunctor(Functor* functor) { - if (!mCanvas) return; - - mCanvas->attachFunctor(functor); - removeFunctorsTask(); - queueFunctorsTask(0); -} - -void CanvasContext::detachFunctor(Functor* functor) { - if (!mCanvas) return; - - mCanvas->detachFunctor(functor); -} - void CanvasContext::invokeFunctor(Functor* functor) { + ATRACE_CALL(); DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext; if (mGlobalContext->hasContext()) { requireGlContext(); mode = DrawGlInfo::kModeProcess; } - (*functor)(mode, NULL); -} - -void CanvasContext::invokeFunctors() { - mInvokeFunctorsPending = false; - - if (!mCanvas) return; - - makeCurrent(); - Rect dirty; - mCanvas->invokeFunctors(dirty); -} - -void CanvasContext::removeFunctorsTask() { - if (!mInvokeFunctorsPending) return; - - mInvokeFunctorsPending = false; - mRenderThread.remove(&mInvokeFunctorsTask); -} - -void CanvasContext::queueFunctorsTask(int delayMs) { - if (mInvokeFunctorsPending) return; - - mInvokeFunctorsPending = true; - mRenderThread.queueDelayed(&mInvokeFunctorsTask, delayMs); + // TODO: Remove the dummy info in the future + DrawGlInfo dummyInfo; + memset(&dummyInfo, 0, sizeof(DrawGlInfo)); + (*functor)(mode, &dummyInfo); } bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { requireGlContext(); - layer->apply(); + bool hasFunctors; + layer->apply(&hasFunctors); return LayerRenderer::copyLayer(layer->backingLayer(), bitmap); } @@ -491,12 +455,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(); } |