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