RenderProxy.cpp revision 8de65a8e05285df52a1e6f0c1d5616dd233298a7
135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly/* 235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * Copyright (C) 2013 The Android Open Source Project 335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * 435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * Licensed under the Apache License, Version 2.0 (the "License"); 5768b82a9dfbdd8504eae2736d283a60a37c7a547Clay Murphy * you may not use this file except in compliance with the License. 635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * You may obtain a copy of the License at 735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * 835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * http://www.apache.org/licenses/LICENSE-2.0 935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * 1035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * Unless required by applicable law or agreed to in writing, software 1135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * distributed under the License is distributed on an "AS IS" BASIS, 1235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * See the License for the specific language governing permissions and 1435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly * limitations under the License. 1535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly */ 1635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 1735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define LOG_TAG "RenderProxy" 1835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 1935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "RenderProxy.h" 2035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 2135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "CanvasContext.h" 2235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "RenderTask.h" 2335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "RenderThread.h" 2435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 2535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "../DeferredLayerUpdater.h" 2635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "../DisplayList.h" 2735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "../LayerRenderer.h" 2835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#include "../Rect.h" 2935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 3035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lynamespace android { 3135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lynamespace uirenderer { 3235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lynamespace renderthread { 3335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 3435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define ARGS(method) method ## Args 3535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 3635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE0(name) CREATE_BRIDGE(name,,,,,,,,) 3735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE1(name, a1) CREATE_BRIDGE(name, a1,,,,,,,) 3835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE2(name, a1, a2) CREATE_BRIDGE(name, a1,a2,,,,,,) 3935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE3(name, a1, a2, a3) CREATE_BRIDGE(name, a1,a2,a3,,,,,) 4035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE4(name, a1, a2, a3, a4) CREATE_BRIDGE(name, a1,a2,a3,a4,,,,) 4135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define CREATE_BRIDGE(name, a1, a2, a3, a4, a5, a6, a7, a8) \ 4235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly typedef struct { \ 4335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly a1; a2; a3; a4; a5; a6; a7; a8; \ 4435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly } ARGS(name); \ 4535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly static void* Bridge_ ## name(ARGS(name)* args) 4635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 4735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly#define SETUP_TASK(method) \ 4835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly LOG_ALWAYS_FATAL_IF( METHOD_INVOKE_PAYLOAD_SIZE < sizeof(ARGS(method)), \ 4935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly "METHOD_INVOKE_PAYLOAD_SIZE %d is smaller than sizeof(" #method "Args) %d", \ 5035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly METHOD_INVOKE_PAYLOAD_SIZE, sizeof(ARGS(method))); \ 5135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \ 5235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly ARGS(method) *args = (ARGS(method) *) task->payload() 5335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 5435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE1(createContext, bool translucent) { 5535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return new CanvasContext(args->translucent); 5635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 5735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 5835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyRenderProxy::RenderProxy(bool translucent) 5935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly : mRenderThread(RenderThread::getInstance()) 6035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly , mContext(0) { 6135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(createContext); 6235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->translucent = translucent; 6335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mContext = (CanvasContext*) postAndWait(task); 6435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.setContext(mContext); 6535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 6635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 6735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyRenderProxy::~RenderProxy() { 6835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly destroyContext(); 6935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 7035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 7135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE1(destroyContext, CanvasContext* context) { 7235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly delete args->context; 7335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 7435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 7535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 7635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::destroyContext() { 7735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly if (mContext) { 7835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // Flush any pending changes to ensure all garbage is destroyed 7935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.flushStateChanges(&mRenderThread); 8035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 8135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(destroyContext); 8235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 8335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mContext = 0; 8435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.setContext(0); 8535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // This is also a fence as we need to be certain that there are no 8635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // outstanding mDrawFrame tasks posted before it is destroyed 8735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly postAndWait(task); 8835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly } 8935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 9035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 9135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(initialize, CanvasContext* context, EGLNativeWindowType window) { 9235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return (void*) args->context->initialize(args->window); 9335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 9435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 9535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lybool RenderProxy::initialize(EGLNativeWindowType window) { 9635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(initialize); 9735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 9835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->window = window; 9935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return (bool) postAndWait(task); 10035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 10135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 10235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(updateSurface, CanvasContext* context, EGLNativeWindowType window) { 10335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->updateSurface(args->window); 10435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 10535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 10635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 10735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::updateSurface(EGLNativeWindowType window) { 10835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(updateSurface); 10935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 11035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->window = window; 11135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 11235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 11335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 11435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE3(setup, CanvasContext* context, int width, int height) { 11535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->setup(args->width, args->height); 11635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 11735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 11835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 11935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::setup(int width, int height) { 12035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(setup); 12135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 12235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->width = width; 12335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->height = height; 12435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 12535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 12635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 12735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::drawDisplayList(RenderNode* displayList, 12835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom) { 12935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.setRenderNode(displayList); 13035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.setDirty(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); 13135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.drawFrame(&mRenderThread); 13235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 13335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 13435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE1(destroyCanvas, CanvasContext* context) { 13535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->destroyCanvas(); 13635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 13735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 13835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 13935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::destroyCanvas() { 14035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // If the canvas is being destroyed we won't be drawing again anytime soon 14135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // So flush any pending state changes to allow for resource cleanup. 14235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.flushStateChanges(&mRenderThread); 14335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 14435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(destroyCanvas); 14535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 14635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 14735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 14835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 14935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(attachFunctor, CanvasContext* context, Functor* functor) { 15035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->attachFunctor(args->functor); 15135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 15235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 15335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 15435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::attachFunctor(Functor* functor) { 15535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(attachFunctor); 15635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 15735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->functor = functor; 15835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 15935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 16035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 16135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(detachFunctor, CanvasContext* context, Functor* functor) { 16235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->detachFunctor(args->functor); 16335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 16435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 16535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 16635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::detachFunctor(Functor* functor) { 16735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(detachFunctor); 16835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 16935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->functor = functor; 17035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 17135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 17235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 17335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) { 17435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->invokeFunctor(args->functor); 17535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 17635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 17735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 17835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) { 17935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(invokeFunctor); 18035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 18135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->functor = functor; 18235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly if (waitForCompletion) { 18335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly postAndWait(task); 18435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly } else { 18535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 18635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly } 18735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 18835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 18935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE2(runWithGlContext, CanvasContext* context, RenderTask* task) { 19035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context->runWithGlContext(args->task); 19135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 19235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 19335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 19435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::runWithGlContext(RenderTask* gltask) { 19535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(runWithGlContext); 19635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 19735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->task = gltask; 19835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly postAndWait(task); 199b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy} 200b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy 201b61f06cd20569ce1291181c8d997c354ecfc1ecfClay MurphyCREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) { 20235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly Layer* layer = args->context->createRenderLayer(args->width, args->height); 203b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy if (!layer) return 0; 20435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return new DeferredLayerUpdater(layer); 20535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 20635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 20735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyDeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) { 20835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(createDisplayListLayer); 20935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->width = width; 210768b82a9dfbdd8504eae2736d283a60a37c7a547Clay Murphy args->height = height; 21135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 21235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly void* retval = postAndWait(task); 21335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); 21435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.addLayer(layer); 21535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return layer; 21635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 21735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 21835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE1(createTextureLayer, CanvasContext* context) { 21935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly Layer* layer = args->context->createTextureLayer(); 22035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly if (!layer) return 0; 22135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return new DeferredLayerUpdater(layer); 22235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 22335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 22435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyDeferredLayerUpdater* RenderProxy::createTextureLayer() { 22535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(createTextureLayer); 22635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 22735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly void* retval = postAndWait(task); 22835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); 22935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.addLayer(layer); 23035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return layer; 23135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 23235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 23335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE1(destroyLayer, Layer* layer) { 23435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly LayerRenderer::destroyLayer(args->layer); 23535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 23635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 23735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 23835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE3(copyLayerInto, CanvasContext* context, DeferredLayerUpdater* layer, 23935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SkBitmap* bitmap) { 24035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly bool success = args->context->copyLayerInto(args->layer, args->bitmap); 24135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return (void*) success; 24235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 24335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 24435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lybool RenderProxy::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { 24535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(copyLayerInto); 24635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->context = mContext; 24735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->layer = layer; 24835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->bitmap = bitmap; 24935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return (bool) postAndWait(task); 25035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 25135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 25235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::destroyLayer(DeferredLayerUpdater* layer) { 25335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mDrawFrameTask.removeLayer(layer); 25435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(destroyLayer); 25535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly args->layer = layer->detachBackingLayer(); 25635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly post(task); 25735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 25835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 25935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert LyCREATE_BRIDGE0(fence) { 26035f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly // Intentionally empty 26135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly return NULL; 26235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 26335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 26435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid RenderProxy::fence() { 26535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SETUP_TASK(fence); 26635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly postAndWait(task); 267b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy} 268b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy 269b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphyvoid RenderProxy::post(RenderTask* task) { 270b61f06cd20569ce1291181c8d997c354ecfc1ecfClay Murphy mRenderThread.queue(task); 27135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 27235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 27335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Lyvoid* RenderProxy::postAndWait(MethodInvokeRenderTask* task) { 27435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly void* retval; 27535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly task->setReturnPtr(&retval); 27635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition); 27735f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly AutoMutex _lock(mSyncMutex); 27835f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mRenderThread.queue(&syncTask); 27935f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly mSyncCondition.wait(mSyncMutex); 280291670d0f6dae2c19a0e38b8d3491bd87bac1a41Clay Murphy return retval; 28135f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} 28235f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly 28335f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} /* namespace renderthread */ 28435f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} /* namespace uirenderer */ 28535f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly} /* namespace android */ 28635f2fda6aaeaf733ab68a3b7f7ccc67f009c09a9Robert Ly