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