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