diff options
Diffstat (limited to 'libs/hwui/renderthread/RenderProxy.cpp')
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 0901963..f90a26a 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -47,13 +47,13 @@ namespace renderthread { #define SETUP_TASK(method) \ LOG_ALWAYS_FATAL_IF( METHOD_INVOKE_PAYLOAD_SIZE < sizeof(ARGS(method)), \ - "METHOD_INVOKE_PAYLOAD_SIZE %d is smaller than sizeof(" #method "Args) %d", \ + "METHOD_INVOKE_PAYLOAD_SIZE %zu is smaller than sizeof(" #method "Args) %zu", \ METHOD_INVOKE_PAYLOAD_SIZE, sizeof(ARGS(method))); \ MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \ ARGS(method) *args = (ARGS(method) *) task->payload() -CREATE_BRIDGE2(createContext, bool translucent, RenderNode* rootRenderNode) { - return new CanvasContext(args->translucent, args->rootRenderNode); +CREATE_BRIDGE3(createContext, RenderThread* thread, bool translucent, RenderNode* rootRenderNode) { + return new CanvasContext(*args->thread, args->translucent, args->rootRenderNode); } RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode) @@ -62,6 +62,7 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode) SETUP_TASK(createContext); args->translucent = translucent; args->rootRenderNode = rootRenderNode; + args->thread = &mRenderThread; mContext = (CanvasContext*) postAndWait(task); mDrawFrameTask.setContext(&mRenderThread, mContext); } @@ -180,8 +181,7 @@ void RenderProxy::setOpaque(bool opaque) { } int RenderProxy::syncAndDrawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos, - float density, int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom) { - mDrawFrameTask.setDirty(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); + float density) { mDrawFrameTask.setDensity(density); return mDrawFrameTask.drawFrame(frameTimeNanos, recordDurationNanos); } @@ -200,20 +200,29 @@ void RenderProxy::destroyCanvasAndSurface() { postAndWait(task); } -CREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) { - args->context->invokeFunctor(args->functor); +CREATE_BRIDGE2(invokeFunctor, RenderThread* thread, Functor* functor) { + CanvasContext::invokeFunctor(*args->thread, args->functor); return NULL; } void RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) { ATRACE_CALL(); + RenderThread& thread = RenderThread::getInstance(); SETUP_TASK(invokeFunctor); - args->context = mContext; + args->thread = &thread; args->functor = functor; if (waitForCompletion) { - postAndWait(task); + // waitForCompletion = true is expected to be fairly rare and only + // happen in destruction. Thus it should be fine to temporarily + // create a Mutex + Mutex mutex; + Condition condition; + SignalingRenderTask syncTask(task, &mutex, &condition); + AutoMutex _lock(mutex); + thread.queue(&syncTask); + condition.wait(mutex); } else { - post(task); + thread.queue(task); } } @@ -234,7 +243,7 @@ CREATE_BRIDGE1(destroyLayer, Layer* layer) { return NULL; } -static void enqueueDestroyLayer(Layer* layer) { +void RenderProxy::enqueueDestroyLayer(Layer* layer) { SETUP_TASK(destroyLayer); args->layer = layer; RenderThread::getInstance().queue(task); @@ -243,7 +252,7 @@ static void enqueueDestroyLayer(Layer* layer) { CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) { Layer* layer = args->context->createRenderLayer(args->width, args->height); if (!layer) return 0; - return new DeferredLayerUpdater(layer, enqueueDestroyLayer); + return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer); } DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) { @@ -259,7 +268,7 @@ DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) { Layer* layer = args->context->createTextureLayer(); if (!layer) return 0; - return new DeferredLayerUpdater(layer, enqueueDestroyLayer); + return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer); } DeferredLayerUpdater* RenderProxy::createTextureLayer() { @@ -337,6 +346,22 @@ void RenderProxy::dumpProfileInfo(int fd) { postAndWait(task); } +CREATE_BRIDGE4(setTextureAtlas, RenderThread* thread, GraphicBuffer* buffer, int64_t* map, size_t size) { + CanvasContext::setTextureAtlas(*args->thread, args->buffer, args->map, args->size); + args->buffer->decStrong(0); + return NULL; +} + +void RenderProxy::setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size) { + SETUP_TASK(setTextureAtlas); + args->thread = &mRenderThread; + args->buffer = buffer.get(); + args->buffer->incStrong(0); + args->map = map; + args->size = size; + post(task); +} + void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } |