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