RenderProxy.cpp revision 668f0e38ef0277d55d3118af37e17b8c435df85c
14f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck/* 24f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Copyright (C) 2013 The Android Open Source Project 34f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * 44f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 54f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * you may not use this file except in compliance with the License. 64f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * You may obtain a copy of the License at 74f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * 84f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * http://www.apache.org/licenses/LICENSE-2.0 94f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * 104f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Unless required by applicable law or agreed to in writing, software 114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * distributed under the License is distributed on an "AS IS" BASIS, 124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * See the License for the specific language governing permissions and 144f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * limitations under the License. 154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck */ 164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define LOG_TAG "RenderProxy" 184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderProxy.h" 204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "CanvasContext.h" 224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderTask.h" 234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderThread.h" 244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include "../DeferredLayerUpdater.h" 264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "../DisplayList.h" 2719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include "../LayerRenderer.h" 284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "../Rect.h" 294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace android { 314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace uirenderer { 324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace renderthread { 334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define ARGS(method) method ## Args 354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 3619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#define CREATE_BRIDGE0(name) CREATE_BRIDGE(name,,,,,,,,) 374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define CREATE_BRIDGE1(name, a1) CREATE_BRIDGE(name, a1,,,,,,,) 384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define CREATE_BRIDGE2(name, a1, a2) CREATE_BRIDGE(name, a1,a2,,,,,,) 394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define CREATE_BRIDGE3(name, a1, a2, a3) CREATE_BRIDGE(name, a1,a2,a3,,,,,) 404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define CREATE_BRIDGE4(name, a1, a2, a3, a4) CREATE_BRIDGE(name, a1,a2,a3,a4,,,,) 414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define CREATE_BRIDGE(name, a1, a2, a3, a4, a5, a6, a7, a8) \ 424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck typedef struct { \ 434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck a1; a2; a3; a4; a5; a6; a7; a8; \ 444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } ARGS(name); \ 454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck static void* Bridge_ ## name(ARGS(name)* args) 464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define SETUP_TASK(method) \ 484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck LOG_ALWAYS_FATAL_IF( METHOD_INVOKE_PAYLOAD_SIZE < sizeof(ARGS(method)), \ 494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck "METHOD_INVOKE_PAYLOAD_SIZE %d is smaller than sizeof(" #method "Args) %d", \ 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck METHOD_INVOKE_PAYLOAD_SIZE, sizeof(ARGS(method))); \ 514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck MethodInvokeRenderTask* task = createTask((RunnableMethod) Bridge_ ## method); \ 524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ARGS(method) *args = (ARGS(method) *) task->payload() 534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE1(createContext, bool translucent) { 554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return new CanvasContext(args->translucent); 564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckRenderProxy::RenderProxy(bool translucent) 594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck : mRenderThread(RenderThread::getInstance()) 604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck , mContext(0) { 614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(createContext); 624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->translucent = translucent; 634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck mContext = (CanvasContext*) postAndWait(task); 64668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.setContext(mContext); 654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckRenderProxy::~RenderProxy() { 684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck destroyContext(); 694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE1(destroyContext, CanvasContext* context) { 724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck delete args->context; 734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::destroyContext() { 774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (mContext) { 784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(destroyContext); 794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck mContext = 0; 81668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.setContext(0); 82668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck // This is also a fence as we need to be certain that there are no 83668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck // outstanding mDrawFrame tasks posted before it is destroyed 84668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck postAndWait(task); 854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE2(initialize, CanvasContext* context, EGLNativeWindowType window) { 894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return (void*) args->context->initialize(args->window); 904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckbool RenderProxy::initialize(EGLNativeWindowType window) { 934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(initialize); 944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->window = window; 964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return (bool) postAndWait(task); 974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE2(updateSurface, CanvasContext* context, EGLNativeWindowType window) { 1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context->updateSurface(args->window); 1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 1024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1044f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::updateSurface(EGLNativeWindowType window) { 1054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(updateSurface); 1064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->window = window; 1084f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck post(task); 1094f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1104f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE3(setup, CanvasContext* context, int width, int height) { 1124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context->setup(args->width, args->height); 1134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 1144f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::setup(int width, int height) { 1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(setup); 1184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 1194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->width = width; 1204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->height = height; 1214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck post(task); 1224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 124668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckvoid RenderProxy::setDisplayListData(RenderNode* renderNode, DisplayListData* newData) { 125668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.setDisplayListData(renderNode, newData); 1264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 128e18264b079481a244b30e3f71012c53bbd861f92John Reckvoid RenderProxy::drawDisplayList(RenderNode* displayList, 1294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom) { 130668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.setRenderNode(displayList); 131668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.setDirty(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom); 132668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.drawFrame(&mRenderThread); 1334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE1(destroyCanvas, CanvasContext* context) { 1364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context->destroyCanvas(); 1374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 1384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::destroyCanvas() { 1414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(destroyCanvas); 1424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 1434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck post(task); 1444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE2(attachFunctor, CanvasContext* context, Functor* functor) { 1474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context->attachFunctor(args->functor); 1484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 1494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::attachFunctor(Functor* functor) { 1524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(attachFunctor); 1534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 1544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->functor = functor; 1554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck post(task); 1564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckCREATE_BRIDGE2(detachFunctor, CanvasContext* context, Functor* functor) { 1594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context->detachFunctor(args->functor); 1604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return NULL; 1614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::detachFunctor(Functor* functor) { 1644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SETUP_TASK(detachFunctor); 1654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->context = mContext; 1664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck args->functor = functor; 1674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck post(task); 1684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 1694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 170fc53ef27793a39e9effd829e9cae02a9ca14147eJohn ReckCREATE_BRIDGE2(runWithGlContext, CanvasContext* context, RenderTask* task) { 171fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck args->context->runWithGlContext(args->task); 172fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck return NULL; 173fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck} 174fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck 175fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reckvoid RenderProxy::runWithGlContext(RenderTask* gltask) { 176fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck SETUP_TASK(runWithGlContext); 177fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck args->context = mContext; 178fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck args->task = gltask; 179fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck postAndWait(task); 180fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck} 181fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck 18219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckCREATE_BRIDGE2(createDisplayListLayer, int width, int height) { 18319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck Layer* layer = LayerRenderer::createRenderLayer(args->width, args->height); 18419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck if (!layer) return 0; 18519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 186668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck return new DeferredLayerUpdater(layer); 18719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 18819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 18919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckDeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) { 19019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SETUP_TASK(createDisplayListLayer); 19119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->width = width; 19219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->height = height; 19319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void* retval = postAndWait(task); 19419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); 195668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.addLayer(layer); 19619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return layer; 19719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 19819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 19919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckCREATE_BRIDGE0(createTextureLayer) { 20019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck Layer* layer = LayerRenderer::createTextureLayer(); 20119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck if (!layer) return 0; 20219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return new DeferredLayerUpdater(layer); 20319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 20419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 20519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckDeferredLayerUpdater* RenderProxy::createTextureLayer() { 20619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SETUP_TASK(createTextureLayer); 20719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void* retval = postAndWait(task); 20819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); 209668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.addLayer(layer); 21019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return layer; 21119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 21219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 21319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckCREATE_BRIDGE1(destroyLayer, Layer* layer) { 21419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck LayerRenderer::destroyLayer(args->layer); 21519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return NULL; 21619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 21719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 21819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John ReckCREATE_BRIDGE3(copyLayerInto, CanvasContext* context, DeferredLayerUpdater* layer, 21919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SkBitmap* bitmap) { 22019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck bool success = args->context->copyLayerInto(args->layer, args->bitmap); 22119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return (void*) success; 22219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 22319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 22419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckbool RenderProxy::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) { 22519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SETUP_TASK(copyLayerInto); 22619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->context = mContext; 22719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->layer = layer; 22819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->bitmap = bitmap; 22919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return (bool) postAndWait(task); 23019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 23119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 23219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckvoid RenderProxy::destroyLayer(DeferredLayerUpdater* layer) { 233668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck mDrawFrameTask.removeLayer(layer); 23419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SETUP_TASK(destroyLayer); 23519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck args->layer = layer->detachBackingLayer(); 23619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck post(task); 23719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck} 23819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 2394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John ReckMethodInvokeRenderTask* RenderProxy::createTask(RunnableMethod method) { 2404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // TODO: Consider having a small pool of these to avoid alloc churn 2414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return new MethodInvokeRenderTask(method); 2424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid RenderProxy::post(RenderTask* task) { 2454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck mRenderThread.queue(task); 2464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckvoid* RenderProxy::postAndWait(MethodInvokeRenderTask* task) { 2494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void* retval; 2504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck task->setReturnPtr(&retval); 2514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition); 2524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck AutoMutex _lock(mSyncMutex); 2534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck mRenderThread.queue(&syncTask); 2544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck mSyncCondition.wait(mSyncMutex); 2554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return retval; 2564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} 2574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace renderthread */ 2594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace uirenderer */ 2604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace android */ 261