RenderProxy.cpp revision 18f16e6fba74eda173e1e7c869e6e2e2acc073ff
1f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock/*
2f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * Copyright (C) 2013 The Android Open Source Project
3f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock *
4f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * you may not use this file except in compliance with the License.
6f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * You may obtain a copy of the License at
7f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock *
8f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock *
10f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * Unless required by applicable law or agreed to in writing, software
11f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * See the License for the specific language governing permissions and
14f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock * limitations under the License.
15f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock */
16f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
17f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define LOG_TAG "RenderProxy"
18f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
19782cd6711bc15e3f03456210b3543a67606d6591Jason Monk#include "RenderProxy.h"
20782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
21782cd6711bc15e3f03456210b3543a67606d6591Jason Monk#include "CanvasContext.h"
225adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock#include "RenderTask.h"
234b006a84909945a411a8a3a4d168fe944d1fe8ebJulia Reynolds#include "RenderThread.h"
242feab1644bd23709318f2a18f0490e07cd531f60Julia Reynolds
25f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#include "../DeferredLayerUpdater.h"
26f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#include "../DisplayList.h"
27f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#include "../LayerRenderer.h"
28f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#include "../Rect.h"
29bb0ec5554593fbf3dc58f05fbe11f839767fc0bcTakayuki Hoshi
3077bb25af3dbf34b6c88549ae931b069a788316fcJohn Spurlocknamespace android {
31c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsnamespace uirenderer {
32f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlocknamespace renderthread {
33f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
34f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define ARGS(method) method ## Args
35f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
36f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define CREATE_BRIDGE0(name) CREATE_BRIDGE(name,,,,,,,,)
37f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define CREATE_BRIDGE1(name, a1) CREATE_BRIDGE(name, a1,,,,,,,)
38f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define CREATE_BRIDGE2(name, a1, a2) CREATE_BRIDGE(name, a1,a2,,,,,,)
39f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define CREATE_BRIDGE3(name, a1, a2, a3) CREATE_BRIDGE(name, a1,a2,a3,,,,,)
40f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock#define CREATE_BRIDGE4(name, a1, a2, a3, a4) CREATE_BRIDGE(name, a1,a2,a3,a4,,,,)
415adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock#define CREATE_BRIDGE(name, a1, a2, a3, a4, a5, a6, a7, a8) \
42f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    typedef struct { \
43f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        a1; a2; a3; a4; a5; a6; a7; a8; \
44f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    } ARGS(name); \
45f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    static void* Bridge_ ## name(ARGS(name)* args)
46f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
47568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds#define SETUP_TASK(method) \
48568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    LOG_ALWAYS_FATAL_IF( METHOD_INVOKE_PAYLOAD_SIZE < sizeof(ARGS(method)), \
49568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds        "METHOD_INVOKE_PAYLOAD_SIZE %d is smaller than sizeof(" #method "Args) %d", \
50f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock                METHOD_INVOKE_PAYLOAD_SIZE, sizeof(ARGS(method))); \
51f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    MethodInvokeRenderTask* task = new MethodInvokeRenderTask((RunnableMethod) Bridge_ ## method); \
5203c548f292b71eaad576bbc10208283467c775b3Julia Reynolds    ARGS(method) *args = (ARGS(method) *) task->payload()
53f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
54f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockCREATE_BRIDGE2(createContext, bool translucent, RenderNode* rootRenderNode) {
55f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    return new CanvasContext(args->translucent, args->rootRenderNode);
56f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
575adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock
585adeabc61d41f89af7f9e01e9f07136618547b9bJohn SpurlockRenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode)
59f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        : mRenderThread(RenderThread::getInstance())
60f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        , mContext(0) {
61f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SETUP_TASK(createContext);
62f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->translucent = translucent;
63f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->rootRenderNode = rootRenderNode;
64f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    mContext = (CanvasContext*) postAndWait(task);
655adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock    mDrawFrameTask.setContext(&mRenderThread, mContext);
665adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock}
675adeabc61d41f89af7f9e01e9f07136618547b9bJohn Spurlock
684b006a84909945a411a8a3a4d168fe944d1fe8ebJulia ReynoldsRenderProxy::~RenderProxy() {
69f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    destroyContext();
70f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
71f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
72f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockCREATE_BRIDGE1(destroyContext, CanvasContext* context) {
73f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    delete args->context;
745c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein    return NULL;
75de850bbcaa61c1874b803f2086443febbafd81a4Jason Monk}
76568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds
77f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlockvoid RenderProxy::destroyContext() {
78782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    if (mContext) {
79782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        SETUP_TASK(destroyContext);
80782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        args->context = mContext;
81782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        mContext = 0;
82f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        mDrawFrameTask.setContext(NULL, NULL);
83e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk        // This is also a fence as we need to be certain that there are no
84aa911b37ae7e805fdcc15c48b156a03b3d151514Jason Monk        // outstanding mDrawFrame tasks posted before it is destroyed
85f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        postAndWait(task);
86f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    }
87f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
88f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
89f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockCREATE_BRIDGE2(setFrameInterval, RenderThread* thread, nsecs_t frameIntervalNanos) {
90f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->thread->timeLord().setFrameInterval(args->frameIntervalNanos);
91f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    return NULL;
92f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
93782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
94f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlockvoid RenderProxy::setFrameInterval(nsecs_t frameIntervalNanos) {
95f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SETUP_TASK(setFrameInterval);
96f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->thread = &mRenderThread;
97782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    args->frameIntervalNanos = frameIntervalNanos;
98782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    post(task);
99f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
100e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk
101e138f55512d7dc5854c9f6d98ec987f5c773f12cJason MonkCREATE_BRIDGE2(initialize, CanvasContext* context, EGLNativeWindowType window) {
102f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    return (void*) args->context->initialize(args->window);
1034b006a84909945a411a8a3a4d168fe944d1fe8ebJulia Reynolds}
104f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
105f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlockbool RenderProxy::initialize(const sp<ANativeWindow>& window) {
106f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SETUP_TASK(initialize);
107782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    args->context = mContext;
108f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->window = window.get();
109568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    return (bool) postAndWait(task);
110c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
111c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
112568585b47c2c1ca6c52b2230918761776472c830Julia ReynoldsCREATE_BRIDGE2(updateSurface, CanvasContext* context, EGLNativeWindowType window) {
113c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->context->updateSurface(args->window);
114c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return NULL;
115c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
11603c548f292b71eaad576bbc10208283467c775b3Julia Reynolds
117f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlockvoid RenderProxy::updateSurface(const sp<ANativeWindow>& window) {
118f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SETUP_TASK(updateSurface);
1196aa83b4ca0859c3f59413ef092f8d843f8646f0eJulia Reynolds    args->context = mContext;
1202feab1644bd23709318f2a18f0490e07cd531f60Julia Reynolds    args->window = window.get();
121c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    postAndWait(task);
122c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
12376b52b3f9b0dde7d7800508271cf5851d92b25d5John Spurlock
1245adeabc61d41f89af7f9e01e9f07136618547b9bJohn SpurlockCREATE_BRIDGE2(pauseSurface, CanvasContext* context, EGLNativeWindowType window) {
12577bb25af3dbf34b6c88549ae931b069a788316fcJohn Spurlock    args->context->pauseSurface(args->window);
12677bb25af3dbf34b6c88549ae931b069a788316fcJohn Spurlock    return NULL;
127c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
128782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
129c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid RenderProxy::pauseSurface(const sp<ANativeWindow>& window) {
130f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SETUP_TASK(pauseSurface);
131f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->context = mContext;
132f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->window = window.get();
133dbfb40f163f98a9aadba68e38222ee4734d17ebaJulia Reynolds    postAndWait(task);
134c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
135f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
136f55b7f2fb614b917b7d1943396880978258dd1bbJohn SpurlockCREATE_BRIDGE3(setup, CanvasContext* context, int width, int height) {
137f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    args->context->setup(args->width, args->height);
138f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    return NULL;
13922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock}
14076b52b3f9b0dde7d7800508271cf5851d92b25d5John Spurlock
141f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlockvoid RenderProxy::setup(int width, int height) {
14222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock    SETUP_TASK(setup);
14322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock    args->context = mContext;
14422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock    args->width = width;
1453f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    args->height = height;
146c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    post(task);
147f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
148e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk
149c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid RenderProxy::syncAndDrawFrame(nsecs_t frameTimeNanos,
150e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk        int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom) {
151782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    mDrawFrameTask.setDirty(dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
152f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    mDrawFrameTask.drawFrame(frameTimeNanos);
153782cd6711bc15e3f03456210b3543a67606d6591Jason Monk}
154782cd6711bc15e3f03456210b3543a67606d6591Jason Monk
155782cd6711bc15e3f03456210b3543a67606d6591Jason MonkCREATE_BRIDGE1(destroyCanvasAndSurface, CanvasContext* context) {
156782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    args->context->destroyCanvasAndSurface();
157568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    return NULL;
158568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds}
1595c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein
160c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid RenderProxy::destroyCanvasAndSurface() {
161782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    SETUP_TASK(destroyCanvasAndSurface);
162782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    args->context = mContext;
163782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    // destroyCanvasAndSurface() needs a fence as when it returns the
164782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    // underlying BufferQueue is going to be released from under
165782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    // the render thread.
166f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    postAndWait(task);
167c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
168c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
169c791e05f768ff66e801f872cfdf27cc62b6195dbJulia ReynoldsCREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) {
170c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->context->invokeFunctor(args->functor);
171782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    return NULL;
172782cd6711bc15e3f03456210b3543a67606d6591Jason Monk}
173de850bbcaa61c1874b803f2086443febbafd81a4Jason Monk
174c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) {
175c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    ATRACE_CALL();
176c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    SETUP_TASK(invokeFunctor);
177c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->context = mContext;
178c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->functor = functor;
179782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    if (waitForCompletion) {
180782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        postAndWait(task);
181782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    } else {
182782cd6711bc15e3f03456210b3543a67606d6591Jason Monk        post(task);
183782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    }
184c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
185f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
186f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockCREATE_BRIDGE2(runWithGlContext, CanvasContext* context, RenderTask* task) {
18703c548f292b71eaad576bbc10208283467c775b3Julia Reynolds    args->context->runWithGlContext(args->task);
188c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return NULL;
189c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
190568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds
191568585b47c2c1ca6c52b2230918761776472c830Julia Reynoldsvoid RenderProxy::runWithGlContext(RenderTask* gltask) {
192568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    SETUP_TASK(runWithGlContext);
193568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    args->context = mContext;
194568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    args->task = gltask;
195f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    postAndWait(task);
196f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
197f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
198f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockCREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) {
199f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    Layer* layer = args->context->createRenderLayer(args->width, args->height);
200f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    if (!layer) return 0;
201f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    return new DeferredLayerUpdater(layer);
202568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds}
203c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
204f88d8082a86bee00c604cbbcfb5261f5573936feJohn SpurlockDeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) {
205782cd6711bc15e3f03456210b3543a67606d6591Jason Monk    SETUP_TASK(createDisplayListLayer);
206f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->width = width;
207f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->height = height;
208f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    args->context = mContext;
2096d712e06f7c35d4120ce8ded5961d3bb97c44cabJorim Jaggi    void* retval = postAndWait(task);
210568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
211568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    mDrawFrameTask.addLayer(layer);
212c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return layer;
213f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
214f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
2153f5d713d6027f316be847ddf85bdcdec3ce27584Jun MukaiCREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
2163f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    Layer* layer = args->context->createTextureLayer();
2173f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    if (!layer) return 0;
2183f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    return new DeferredLayerUpdater(layer);
2193f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai}
2203f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai
2213f5d713d6027f316be847ddf85bdcdec3ce27584Jun MukaiDeferredLayerUpdater* RenderProxy::createTextureLayer() {
2223f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    SETUP_TASK(createTextureLayer);
2233f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    args->context = mContext;
2243f5d713d6027f316be847ddf85bdcdec3ce27584Jun Mukai    void* retval = postAndWait(task);
225f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
226568585b47c2c1ca6c52b2230918761776472c830Julia Reynolds    mDrawFrameTask.addLayer(layer);
227c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return layer;
228f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
229f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
23036007d262a87ec48a4db72017152302aee8db314Muyuan LiCREATE_BRIDGE1(destroyLayer, Layer* layer) {
23136007d262a87ec48a4db72017152302aee8db314Muyuan Li    LayerRenderer::destroyLayer(args->layer);
23236007d262a87ec48a4db72017152302aee8db314Muyuan Li    return NULL;
233f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock}
234f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock
235c791e05f768ff66e801f872cfdf27cc62b6195dbJulia ReynoldsCREATE_BRIDGE3(copyLayerInto, CanvasContext* context, DeferredLayerUpdater* layer,
23622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock        SkBitmap* bitmap) {
23722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock    bool success = args->context->copyLayerInto(args->layer, args->bitmap);
238c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return (void*) success;
239c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
240c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
241c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsbool RenderProxy::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {
242c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    SETUP_TASK(copyLayerInto);
243c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->context = mContext;
244c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->layer = layer;
245c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->bitmap = bitmap;
246c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    return (bool) postAndWait(task);
247c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
248c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
249c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid RenderProxy::destroyLayer(DeferredLayerUpdater* layer) {
250c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    mDrawFrameTask.removeLayer(layer);
251c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    SETUP_TASK(destroyLayer);
252c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    args->layer = layer->detachBackingLayer();
253c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    post(task);
254c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds}
25536007d262a87ec48a4db72017152302aee8db314Muyuan Li
25636007d262a87ec48a4db72017152302aee8db314Muyuan LiCREATE_BRIDGE0(fence) {
25736007d262a87ec48a4db72017152302aee8db314Muyuan Li    // Intentionally empty
25836007d262a87ec48a4db72017152302aee8db314Muyuan Li    return NULL;
25936007d262a87ec48a4db72017152302aee8db314Muyuan Li}
26036007d262a87ec48a4db72017152302aee8db314Muyuan Li
26136007d262a87ec48a4db72017152302aee8db314Muyuan Livoid RenderProxy::fence() {
26236007d262a87ec48a4db72017152302aee8db314Muyuan Li    SETUP_TASK(fence);
26336007d262a87ec48a4db72017152302aee8db314Muyuan Li    postAndWait(task);
26436007d262a87ec48a4db72017152302aee8db314Muyuan Li}
26536007d262a87ec48a4db72017152302aee8db314Muyuan Li
266dbfb40f163f98a9aadba68e38222ee4734d17ebaJulia Reynoldsvoid RenderProxy::post(RenderTask* task) {
267dbfb40f163f98a9aadba68e38222ee4734d17ebaJulia Reynolds    mRenderThread.queue(task);
26836007d262a87ec48a4db72017152302aee8db314Muyuan Li}
269c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds
270c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynoldsvoid* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {
271c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    void* retval;
272f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    task->setReturnPtr(&retval);
273f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock    SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition);
274c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    AutoMutex _lock(mSyncMutex);
275aa911b37ae7e805fdcc15c48b156a03b3d151514Jason Monk    mRenderThread.queue(&syncTask);
276c791e05f768ff66e801f872cfdf27cc62b6195dbJulia Reynolds    mSyncCondition.wait(mSyncMutex);
277e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk    return retval;
278e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk}
279e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk
280e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk} /* namespace renderthread */
281e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk} /* namespace uirenderer */
282e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk} /* namespace android */
283e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk