FramebufferNativeWindow.cpp revision 35b48d10bc9e064201d3d54d2d476314684a7a05
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/Rect.h> 310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian#include <ui/FramebufferNativeWindow.h> 3235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian#include <ui/GraphicLog.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 * 714b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn * In fact this is an implementation of ANativeWindow 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 1214b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<uint32_t&>(ANativeWindow::flags) = fbDev->flags; 1224b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<float&>(ANativeWindow::xdpi) = fbDev->xdpi; 1234b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<float&>(ANativeWindow::ydpi) = fbDev->ydpi; 1244b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<int&>(ANativeWindow::minSwapInterval) = 125a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->minSwapInterval; 1264b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<int&>(ANativeWindow::maxSwapInterval) = 127a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->maxSwapInterval; 128a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } else { 129a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen LOGE("Couldn't get gralloc module"); 130a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } 131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1324b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::setSwapInterval = setSwapInterval; 1334b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::dequeueBuffer = dequeueBuffer; 1344b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::lockBuffer = lockBuffer; 1354b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::queueBuffer = queueBuffer; 1364b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::query = query; 1374b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::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( 1724b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* 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 17835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian// only for debugging / logging 17935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopianint FramebufferNativeWindow::getCurrentBufferIndex() const 18035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian{ 18135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian Mutex::Autolock _l(mutex); 18235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = mCurrentBufferIndex; 18335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian return index; 18435b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian} 18535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 1864b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::dequeueBuffer(ANativeWindow* window, 187076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t** buffer) 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 189076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 190076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 191076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian int index = self->mBufferHead++; 19435b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian if (self->mBufferHead >= self->mNumBuffers) 19535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian self->mBufferHead = 0; 19635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 19735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 19835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_DEQUEUE_BEFORE, index); 19935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait for a free buffer 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (!self->mNumFreeBuffers) { 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // get this buffer 205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers--; 20635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian self->mCurrentBufferIndex = index; 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *buffer = self->buffers[index].get(); 209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 21035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_DEQUEUE_AFTER, index); 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2144b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::lockBuffer(ANativeWindow* window, 215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer) 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 22035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = self->mCurrentBufferIndex; 22135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 22235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_LOCK_BEFORE, index); 22335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait that the buffer we're locking is not front anymore 225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (self->front == buffer) { 226076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 22935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_LOCK_AFTER, index); 23035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 2310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return NO_ERROR; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2344b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::queueBuffer(ANativeWindow* window, 235076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer) 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 240076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle; 24135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 24235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = self->mCurrentBufferIndex; 24335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 24435b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_POST_BEFORE, index); 24535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int res = fb->post(fb, handle); 24735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 24835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_POST_AFTER, index); 24935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 250076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->front = static_cast<NativeBuffer*>(buffer); 251076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers++; 252076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.broadcast(); 253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return res; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2564b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::query(ANativeWindow* window, 257cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian int what, int* value) 258cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 259cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian FramebufferNativeWindow* self = getSelf(window); 260cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian Mutex::Autolock _l(self->mutex); 261cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian framebuffer_device_t* fb = self->fbDev; 262cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian switch (what) { 263cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_WIDTH: 264cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->width; 265cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 266cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_HEIGHT: 267cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->height; 268cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 2696b1f41004fa48e96bab61f508867314261de660bMathias Agopian case NATIVE_WINDOW_FORMAT: 2706b1f41004fa48e96bab61f508867314261de660bMathias Agopian *value = fb->format; 2716b1f41004fa48e96bab61f508867314261de660bMathias Agopian return NO_ERROR; 272cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 27342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian *value = 0; 274cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return BAD_VALUE; 275cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 276cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 2774b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::perform(ANativeWindow* window, 2785221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian int operation, ...) 2795221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian{ 2805221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian switch (operation) { 2815221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian case NATIVE_WINDOW_SET_USAGE: 28255fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian case NATIVE_WINDOW_CONNECT: 28355fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian case NATIVE_WINDOW_DISCONNECT: 2845221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian break; 2855221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian default: 2865221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NAME_NOT_FOUND; 2875221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian } 2885221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NO_ERROR; 2895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian} 2905221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 294076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 29542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopianusing namespace android; 296076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLNativeWindowType android_createDisplaySurface(void) 298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 29942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian FramebufferNativeWindow* w; 30042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian w = new FramebufferNativeWindow(); 30142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (w->getDevice() == NULL) { 30242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian // get a ref so it can be destroyed when we exit this block 30342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian sp<FramebufferNativeWindow> ref(w); 30442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return NULL; 30542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 30642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return (EGLNativeWindowType)w; 307076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 308