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