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