FramebufferNativeWindow.cpp revision 1e16b13857809eaa9bd17fb60ac0a471dc92844b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License Version 2.0(the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
180926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian#define LOG_TAG "FramebufferNativeWindow"
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <errno.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/threads.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/SurfaceComposerClient.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h>
310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian#include <ui/FramebufferNativeWindow.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <pixelflinger/pixelflinger.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/hardware.h>
39076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4158a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
477189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianclass NativeBuffer
487189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian    : public EGLNativeBase<
497189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        android_native_buffer_t,
507189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        NativeBuffer,
517189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        LightRefBase<NativeBuffer> >
527189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian{
537189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianpublic:
547189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian    NativeBuffer(int w, int h, int f, int u) : BASE() {
557189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        android_native_buffer_t::width  = w;
567189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        android_native_buffer_t::height = h;
577189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        android_native_buffer_t::format = f;
587189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian        android_native_buffer_t::usage  = u;
597189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian    }
607189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianprivate:
617189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian    friend class LightRefBase<NativeBuffer>;
627189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian    ~NativeBuffer() { }; // this class cannot be overloaded
637189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian};
647189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
657189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
66076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
67076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * This implements the (main) framebuffer management. This class is used
68076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * mostly by SurfaceFlinger, but also by command line GL application.
69076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
70076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * In fact this is an implementation of android_native_window_t on top of
71076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * the framebuffer.
72076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
73076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Currently it is pretty simple, it manages only two buffers (the front and
74076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * back buffer).
75076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
76076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian */
77076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
78076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianFramebufferNativeWindow::FramebufferNativeWindow()
791e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    : BASE(), fbDev(0), grDev(0), mUpdateOnDemand(false)
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    hw_module_t const* module;
82076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {
83076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        int stride;
84076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        framebuffer_open(module, &fbDev);
85076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        gralloc_open(module, &grDev);
86076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        int err;
87076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
88076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
891e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian        mUpdateOnDemand = (fbDev->setUpdateRect != 0);
901e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
91076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // initialize the buffer FIFO
92076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mNumBuffers = 2;
93076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mNumFreeBuffers = 2;
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mBufferHead = mNumBuffers-1;
95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffers[0] = new NativeBuffer(
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffers[1] = new NativeBuffer(
98076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB);
99076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        err = grDev->alloc(grDev,
101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, fbDev->format,
102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride);
103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        LOGE_IF(err, "fb buffer 0 allocation failed w=%d, h=%d, err=%s",
105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, strerror(-err));
106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        err = grDev->alloc(grDev,
108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, fbDev->format,
109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride);
110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        LOGE_IF(err, "fb buffer 1 allocation failed w=%d, h=%d, err=%s",
112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                fbDev->width, fbDev->height, strerror(-err));
113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
115aa8c0ff7a36b4840dcf3e72c9696b86d192c4314Mathias Agopian    const_cast<uint32_t&>(android_native_window_t::flags) = fbDev->flags;
116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const_cast<float&>(android_native_window_t::xdpi) = fbDev->xdpi;
117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const_cast<float&>(android_native_window_t::ydpi) = fbDev->ydpi;
118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const_cast<int&>(android_native_window_t::minSwapInterval) =
119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        fbDev->minSwapInterval;
120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const_cast<int&>(android_native_window_t::maxSwapInterval) =
121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        fbDev->maxSwapInterval;
122076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t::setSwapInterval = setSwapInterval;
124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t::dequeueBuffer = dequeueBuffer;
125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t::lockBuffer = lockBuffer;
126076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t::queueBuffer = queueBuffer;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianFramebufferNativeWindow::~FramebufferNativeWindow() {
130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    grDev->free(grDev, buffers[0]->handle);
131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    grDev->free(grDev, buffers[1]->handle);
132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    gralloc_close(grDev);
133076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    framebuffer_close(fbDev);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1361e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopianstatus_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r)
1371e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian{
1381e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    if (!mUpdateOnDemand) {
1391e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian        return INVALID_OPERATION;
1401e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    }
1411e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian    return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height());
1421e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian}
1431e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian
144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::setSwapInterval(
145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window, int interval)
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    framebuffer_device_t* fb = getSelf(window)->fbDev;
148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return fb->setSwapInterval(fb, interval);
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::dequeueBuffer(android_native_window_t* window,
152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_buffer_t** buffer)
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    FramebufferNativeWindow* self = getSelf(window);
155076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(self->mutex);
156076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    framebuffer_device_t* fb = self->fbDev;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // wait for a free buffer
159076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    while (!self->mNumFreeBuffers) {
160076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        self->mCondition.wait(self->mutex);
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
162076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // get this buffer
163076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    self->mNumFreeBuffers--;
164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int index = self->mBufferHead++;
165076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (self->mBufferHead >= self->mNumBuffers)
166076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        self->mBufferHead = 0;
167076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
168076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    *buffer = self->buffers[index].get();
169076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
173076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::lockBuffer(android_native_window_t* window,
174076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_buffer_t* buffer)
175076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
176076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    FramebufferNativeWindow* self = getSelf(window);
177076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(self->mutex);
178076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
179076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // wait that the buffer we're locking is not front anymore
180076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    while (self->front == buffer) {
181076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        self->mCondition.wait(self->mutex);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
183076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1840926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return NO_ERROR;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::queueBuffer(android_native_window_t* window,
188076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_buffer_t* buffer)
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
190076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    FramebufferNativeWindow* self = getSelf(window);
191076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(self->mutex);
192076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    framebuffer_device_t* fb = self->fbDev;
193076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle;
194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int res = fb->post(fb, handle);
195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    self->front = static_cast<NativeBuffer*>(buffer);
196076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    self->mNumFreeBuffers++;
197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    self->mCondition.broadcast();
198076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return res;
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLNativeWindowType android_createDisplaySurface(void)
207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return new android::FramebufferNativeWindow();
209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
211