FramebufferNativeWindow.cpp revision 8f9dbf9e13b927de2524116c30544f7dfbbbf56c
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< 50697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer, 517189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian NativeBuffer, 527189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian LightRefBase<NativeBuffer> > 537189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian{ 547189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopianpublic: 557189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian NativeBuffer(int w, int h, int f, int u) : BASE() { 56697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer::width = w; 57697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer::height = h; 58697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer::format = f; 59697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer::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; 8671484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon int i; 8742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian err = framebuffer_open(module, &fbDev); 8842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err)); 8942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian 9042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian err = gralloc_open(module, &grDev); 9142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian LOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err)); 92076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 9342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian // bail out if we can't initialize the modules 9442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (!fbDev || !grDev) 9542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return; 96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 971e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian mUpdateOnDemand = (fbDev->setUpdateRect != 0); 981e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 99076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // initialize the buffer FIFO 10071484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon mNumBuffers = NUM_FRAME_BUFFERS; 10171484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon mNumFreeBuffers = NUM_FRAME_BUFFERS; 102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian mBufferHead = mNumBuffers-1; 103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 10471484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon for (i = 0; i < mNumBuffers; i++) 10571484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon { 10671484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon buffers[i] = new NativeBuffer( 10771484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon fbDev->width, fbDev->height, fbDev->format, GRALLOC_USAGE_HW_FB); 10871484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon } 10971484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon 11071484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon for (i = 0; i < mNumBuffers; i++) 11171484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon { 11271484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon err = grDev->alloc(grDev, 11371484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon fbDev->width, fbDev->height, fbDev->format, 11471484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon GRALLOC_USAGE_HW_FB, &buffers[i]->handle, &buffers[i]->stride); 11571484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon 11671484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon LOGE_IF(err, "fb buffer %d allocation failed w=%d, h=%d, err=%s", 11771484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon i, fbDev->width, fbDev->height, strerror(-err)); 11871484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon 11971484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon if (err) 12071484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon { 12171484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon mNumBuffers = i; 12271484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon mNumFreeBuffers = i; 12371484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon mBufferHead = mNumBuffers-1; 12471484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon break; 12571484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon } 12671484f2f76457287a1fbf5791f530c2b2459aa0cRodrigo Obregon } 127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1284b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<uint32_t&>(ANativeWindow::flags) = fbDev->flags; 1294b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<float&>(ANativeWindow::xdpi) = fbDev->xdpi; 1304b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<float&>(ANativeWindow::ydpi) = fbDev->ydpi; 1314b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<int&>(ANativeWindow::minSwapInterval) = 132a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->minSwapInterval; 1334b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn const_cast<int&>(ANativeWindow::maxSwapInterval) = 134a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen fbDev->maxSwapInterval; 135a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } else { 136a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen LOGE("Couldn't get gralloc module"); 137a455793a8d068a06ae65e1e04170eb24851c0eb1Marco Nelissen } 138076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1394b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::setSwapInterval = setSwapInterval; 1404b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::dequeueBuffer = dequeueBuffer; 1414b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::lockBuffer = lockBuffer; 1424b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::queueBuffer = queueBuffer; 1434b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::query = query; 1444b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow::perform = perform; 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias AgopianFramebufferNativeWindow::~FramebufferNativeWindow() 14842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian{ 14942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (grDev) { 15042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (buffers[0] != NULL) 15142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian grDev->free(grDev, buffers[0]->handle); 15242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (buffers[1] != NULL) 15342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian grDev->free(grDev, buffers[1]->handle); 15442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian gralloc_close(grDev); 15542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 15642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian 15742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (fbDev) { 15842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian framebuffer_close(fbDev); 15942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1621e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopianstatus_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) 1631e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian{ 1641e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian if (!mUpdateOnDemand) { 1651e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian return INVALID_OPERATION; 1661e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian } 1671e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian return fbDev->setUpdateRect(fbDev, r.left, r.top, r.width(), r.height()); 1681e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian} 1691e16b13857809eaa9bd17fb60ac0a471dc92844bMathias Agopian 17074faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopianstatus_t FramebufferNativeWindow::compositionComplete() 17174faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian{ 17274faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian if (fbDev->compositionComplete) { 17374faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian return fbDev->compositionComplete(fbDev); 17474faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian } 17574faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian return INVALID_OPERATION; 17674faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian} 17774faca212e2675aa55a30235c77cb6403471a4b9Mathias Agopian 178076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianint FramebufferNativeWindow::setSwapInterval( 1794b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window, int interval) 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 181076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = getSelf(window)->fbDev; 182076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return fb->setSwapInterval(fb, interval); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1851d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gillingvoid FramebufferNativeWindow::dump(String8& result) { 1861d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling if (fbDev->common.version >= 1 && fbDev->dump) { 1871d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling const size_t SIZE = 4096; 1881d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling char buffer[SIZE]; 1891d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling 1901d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling fbDev->dump(fbDev, buffer, SIZE); 1911d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling result.append(buffer); 1921d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling } 1931d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling} 1941d21a9cafc534c34a2f28c985c4c7aa176d0e67bErik Gilling 19535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian// only for debugging / logging 19635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopianint FramebufferNativeWindow::getCurrentBufferIndex() const 19735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian{ 19835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian Mutex::Autolock _l(mutex); 19935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = mCurrentBufferIndex; 20035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian return index; 20135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian} 20235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 2034b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::dequeueBuffer(ANativeWindow* window, 204697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer** buffer) 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian int index = self->mBufferHead++; 21135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian if (self->mBufferHead >= self->mNumBuffers) 21235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian self->mBufferHead = 0; 21335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 21435b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 21535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_DEQUEUE_BEFORE, index); 21635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait for a free buffer 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (!self->mNumFreeBuffers) { 219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // get this buffer 222076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers--; 22335b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian self->mCurrentBufferIndex = index; 224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *buffer = self->buffers[index].get(); 226076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 22735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_DEQUEUE_AFTER, index); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2314b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::lockBuffer(ANativeWindow* window, 232697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer) 233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 235076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 23735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = self->mCurrentBufferIndex; 23835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 23935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_LOCK_BEFORE, index); 24035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 241076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // wait that the buffer we're locking is not front anymore 242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian while (self->front == buffer) { 243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.wait(self->mutex); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 245076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 24635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_LOCK_AFTER, index); 24735b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 2480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return NO_ERROR; 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2514b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::queueBuffer(ANativeWindow* window, 252697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer) 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 254076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian FramebufferNativeWindow* self = getSelf(window); 255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian Mutex::Autolock _l(self->mutex); 256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian framebuffer_device_t* fb = self->fbDev; 257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle; 25835b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 25935b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian const int index = self->mCurrentBufferIndex; 26035b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian GraphicLog& logger(GraphicLog::getInstance()); 26135b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_POST_BEFORE, index); 26235b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 263076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int res = fb->post(fb, handle); 26435b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 26535b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian logger.log(GraphicLog::SF_FB_POST_AFTER, index); 26635b48d10bc9e064201d3d54d2d476314684a7a05Mathias Agopian 267076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->front = static_cast<NativeBuffer*>(buffer); 268076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mNumFreeBuffers++; 269076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian self->mCondition.broadcast(); 270076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return res; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27341abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchevint FramebufferNativeWindow::query(const ANativeWindow* window, 274cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian int what, int* value) 275cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 27641abd67302b52aefadc2b3dea42226f16bf6d9baIliyan Malchev const FramebufferNativeWindow* self = getSelf(window); 277cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian Mutex::Autolock _l(self->mutex); 278cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian framebuffer_device_t* fb = self->fbDev; 279cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian switch (what) { 280cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_WIDTH: 281cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->width; 282cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 283cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian case NATIVE_WINDOW_HEIGHT: 284cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian *value = fb->height; 285cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return NO_ERROR; 2866b1f41004fa48e96bab61f508867314261de660bMathias Agopian case NATIVE_WINDOW_FORMAT: 2876b1f41004fa48e96bab61f508867314261de660bMathias Agopian *value = fb->format; 2886b1f41004fa48e96bab61f508867314261de660bMathias Agopian return NO_ERROR; 289391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis case NATIVE_WINDOW_CONCRETE_TYPE: 290391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis *value = NATIVE_WINDOW_FRAMEBUFFER; 291391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis return NO_ERROR; 292cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 29342db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian *value = 0; 294cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian return BAD_VALUE; 295cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 296cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 2974b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackbornint FramebufferNativeWindow::perform(ANativeWindow* window, 2985221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian int operation, ...) 2995221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian{ 3005221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian switch (operation) { 3015221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian case NATIVE_WINDOW_SET_USAGE: 302bee205fd58a27c10a0895de5339e76025d429d2bJamie Gennis case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 30355fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian case NATIVE_WINDOW_CONNECT: 30455fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian case NATIVE_WINDOW_DISCONNECT: 3055221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian break; 3068f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian case NATIVE_WINDOW_LOCK: 3078f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian return INVALID_OPERATION; 3088f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian case NATIVE_WINDOW_UNLOCK_AND_POST: 3098f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian return INVALID_OPERATION; 3105221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian default: 3115221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NAME_NOT_FOUND; 3125221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian } 3135221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian return NO_ERROR; 3145221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian} 3155221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 319076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 32042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopianusing namespace android; 321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLNativeWindowType android_createDisplaySurface(void) 323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 32442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian FramebufferNativeWindow* w; 32542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian w = new FramebufferNativeWindow(); 32642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian if (w->getDevice() == NULL) { 32742db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian // get a ref so it can be destroyed when we exit this block 32842db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian sp<FramebufferNativeWindow> ref(w); 32942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return NULL; 33042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian } 33142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian return (EGLNativeWindowType)w; 332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 333