FramebufferNativeWindow.cpp revision a455793a8d068a06ae65e1e04170eb24851c0eb1
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> 2842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian#include <utils/RefBase.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/SurfaceComposerClient.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h> 320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian#include <ui/FramebufferNativeWindow.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <pixelflinger/pixelflinger.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/hardware.h> 40076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h> 4358a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 487189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianclass NativeBuffer 497189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian : public EGLNativeBase< 507189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian android_native_buffer_t, 517189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian NativeBuffer, 527189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian LightRefBase<NativeBuffer> > 537189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian{ 547189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianpublic: 557189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian NativeBuffer(int w, int h, int f, int u) : BASE() { 567189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian android_native_buffer_t::width = w; 577189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian android_native_buffer_t::height = h; 587189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian android_native_buffer_t::format = f; 597189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian android_native_buffer_t::usage = u; 607189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian } 617189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianprivate: 627189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian friend class LightRefBase<NativeBuffer>; 637189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian ~NativeBuffer() { }; // this class cannot be overloaded 647189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian}; 657189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian 667189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian 67076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 68076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * This implements the (main) framebuffer management. This class is used 69076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * mostly by SurfaceFlinger, but also by command line GL application. 70076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * 71076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * In fact this is an implementation of android_native_window_t on top of 72076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * the framebuffer. 73076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * 74076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Currently it is pretty simple, it manages only two buffers (the front and 75076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * back buffer). 76076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * 77076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian */ 78076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 79076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianFramebufferNativeWindow::FramebufferNativeWindow() 801e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian : BASE(), fbDev(0), grDev(0), mUpdateOnDemand(false) 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 82076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian hw_module_t const* module; 83076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { 84076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int stride; 85076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int err; 8642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian err = framebuffer_open(module, &fbDev); 8742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err)); 8842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian 8942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian err = gralloc_open(module, &grDev); 9042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian LOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err)); 91076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 9242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian // bail out if we can't initialize the modules 9342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (!fbDev || !grDev) 9442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return; 95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 961e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian mUpdateOnDemand = (fbDev->setUpdateRect != 0); 971e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 98076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // initialize the buffer FIFO 99076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mNumBuffers = 2; 100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mNumFreeBuffers = 2; 101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mBufferHead = mNumBuffers-1; 102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffers[0] = new NativeBuffer( 103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); 104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffers[1] = new NativeBuffer( 105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); 106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian err = grDev->alloc(grDev, 108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, fbDev->format, 109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GRALLOC_USAGE_HW_FB, &buffers[0]->handle, &buffers[0]->stride); 110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LOGE_IF(err, "fb buffer 0 allocation failed w=%d, h=%d, err=%s", 112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, strerror(-err)); 113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian err = grDev->alloc(grDev, 115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, fbDev->format, 116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GRALLOC_USAGE_HW_FB, &buffers[1]->handle, &buffers[1]->stride); 117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LOGE_IF(err, "fb buffer 1 allocation failed w=%d, h=%d, err=%s", 119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian fbDev->width, fbDev->height, strerror(-err)); 120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 121a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen const_cast<uint32_t&>(android_native_window_t::flags) = fbDev->flags; 122a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen const_cast<float&>(android_native_window_t::xdpi) = fbDev->xdpi; 123a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen const_cast<float&>(android_native_window_t::ydpi) = fbDev->ydpi; 124a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen const_cast<int&>(android_native_window_t::minSwapInterval) = 125a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->minSwapInterval; 126a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen const_cast<int&>(android_native_window_t::maxSwapInterval) = 127a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->maxSwapInterval; 128a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } else { 129a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen LOGE("Couldn't get gralloc module"); 130a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } 131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t::setSwapInterval = setSwapInterval; 133076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t::dequeueBuffer = dequeueBuffer; 134076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t::lockBuffer = lockBuffer; 135076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t::queueBuffer = queueBuffer; 136cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian android_native_window_t::query = query; 1375221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian android_native_window_t::perform = perform; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias AgopianFramebufferNativeWindow::~FramebufferNativeWindow() 14142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian{ 14242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (grDev) { 14342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (buffers[0] != NULL) 14442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian grDev->free(grDev, buffers[0]->handle); 14542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (buffers[1] != NULL) 14642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian grDev->free(grDev, buffers[1]->handle); 14742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian gralloc_close(grDev); 14842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 14942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian 15042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (fbDev) { 15142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian framebuffer_close(fbDev); 15242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1551e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopianstatus_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) 1561e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian{ 1571e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian if (!mUpdateOnDemand) { 1581e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian return INVALID_OPERATION; 1591e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 1601e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height()); 1611e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian} 1621e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 16374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t FramebufferNativeWindow::compositionComplete() 16474faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian{ 16574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian if (fbDev->compositionComplete) { 16674faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian return fbDev->compositionComplete(fbDev); 16774faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian } 16874faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian return INVALID_OPERATION; 16974faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 17074faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian 171076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::setSwapInterval( 172076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window, int interval) 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 174076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = getSelf(window)->fbDev; 175076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return fb->setSwapInterval(fb, interval); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::dequeueBuffer(android_native_window_t* window, 179076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t** buffer) 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 181076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 182076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 183076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait for a free buffer 186076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (!self->mNumFreeBuffers) { 187076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 189076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // get this buffer 190076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers--; 191076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int index = self->mBufferHead++; 192076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (self->mBufferHead >= self->mNumBuffers) 193076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mBufferHead = 0; 194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *buffer = self->buffers[index].get(); 196076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::lockBuffer(android_native_window_t* window, 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer) 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait that the buffer we're locking is not front anymore 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (self->front == buffer) { 208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2110926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return NO_ERROR; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::queueBuffer(android_native_window_t* window, 215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer) 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle; 221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int res = fb->post(fb, handle); 222076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->front = static_cast<NativeBuffer*>(buffer); 223076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers++; 224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.broadcast(); 225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return res; 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianint FramebufferNativeWindow::query(android_native_window_t* window, 229cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian int what, int* value) 230cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 231cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian FramebufferNativeWindow* self = getSelf(window); 232cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian Mutex::Autolock _l(self->mutex); 233cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian framebuffer_device_t* fb = self->fbDev; 234cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian switch (what) { 235cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_WIDTH: 236cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->width; 237cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 238cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_HEIGHT: 239cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->height; 240cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 2416b1f41004fa48e96bab61f508867314261de660bMathias Agopian case NATIVE_WINDOW_FORMAT: 2426b1f41004fa48e96bab61f508867314261de660bMathias Agopian *value = fb->format; 2436b1f41004fa48e96bab61f508867314261de660bMathias Agopian return NO_ERROR; 244cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 24542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian *value = 0; 246cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return BAD_VALUE; 247cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 248cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 2495221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopianint FramebufferNativeWindow::perform(android_native_window_t* window, 2505221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian int operation, ...) 2515221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian{ 2525221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian switch (operation) { 2535221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian case NATIVE_WINDOW_SET_USAGE: 2545221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian break; 2555221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian default: 2565221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NAME_NOT_FOUND; 2575221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian } 2585221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NO_ERROR; 2595221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian} 2605221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 26542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopianusing namespace android; 266076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 267076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLNativeWindowType android_createDisplaySurface(void) 268076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 26942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian FramebufferNativeWindow* w; 27042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian w = new FramebufferNativeWindow(); 27142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (w->getDevice() == NULL) { 27242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian // get a ref so it can be destroyed when we exit this block 27342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian sp<FramebufferNativeWindow> ref(w); 27442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return NULL; 27542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 27642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return (EGLNativeWindowType)w; 277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 278