19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian#ifndef ANDROID_FRAMEBUFFER_NATIVE_WINDOW_H
18dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian#define ANDROID_FRAMEBUFFER_NATIVE_WINDOW_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <utils/threads.h>
2694720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling#include <utils/String8.h>
271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <ui/Rect.h>
281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <pixelflinger/pixelflinger.h>
301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
31ac2523b161df2bb507cc88906bb070878266770dMathias Agopian#include <ui/egl/android_natives.h>
32ac2523b161df2bb507cc88906bb070878266770dMathias Agopian
3384043438cfa7f0f934cb8884315e9db2fd3c7e2cRodrigo Obregon#define NUM_FRAME_BUFFERS  2
341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianextern "C" EGLNativeWindowType android_createDisplaySurface(void);
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Surface;
42ac2523b161df2bb507cc88906bb070878266770dMathias Agopianclass NativeBuffer;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// ---------------------------------------------------------------------------
451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianclass FramebufferNativeWindow
471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    : public EGLNativeBase<
488b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn        ANativeWindow,
491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        FramebufferNativeWindow,
501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        LightRefBase<FramebufferNativeWindow> >
511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianpublic:
531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    FramebufferNativeWindow();
541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    framebuffer_device_t const * getDevice() const { return fbDev; }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5797b8056c3182a973c67d3c1b196150d4b9e30f3aMathias Agopian    bool isUpdateOnDemand() const { return mUpdateOnDemand; }
5897b8056c3182a973c67d3c1b196150d4b9e30f3aMathias Agopian    status_t setUpdateRectangle(const Rect& updateRect);
59b1a1874625a6aca967601fcda53a82d8d712df45Mathias Agopian    status_t compositionComplete();
6094720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling
6194720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling    void dump(String8& result);
6294720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling
6304262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian    // for debugging only
6404262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian    int getCurrentBufferIndex() const;
6504262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    friend class LightRefBase<FramebufferNativeWindow>;
681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    ~FramebufferNativeWindow(); // this class cannot be overloaded
698b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn    static int setSwapInterval(ANativeWindow* window, int interval);
70b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev    static int dequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer);
71b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev    static int lockBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer);
72b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev    static int queueBuffer(ANativeWindow* window, ANativeWindowBuffer* buffer);
734d7c1ce651bd5e283e694fa34641e1dc080613c0Iliyan Malchev    static int query(const ANativeWindow* window, int what, int* value);
748b49bd1a2f8117e1c22884f0150e72cbcf838f32Dianne Hackborn    static int perform(ANativeWindow* window, int operation, ...);
751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    framebuffer_device_t* fbDev;
771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    alloc_device_t* grDev;
781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7984043438cfa7f0f934cb8884315e9db2fd3c7e2cRodrigo Obregon    sp<NativeBuffer> buffers[NUM_FRAME_BUFFERS];
801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    sp<NativeBuffer> front;
811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    mutable Mutex mutex;
831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    Condition mCondition;
841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int32_t mNumBuffers;
851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int32_t mNumFreeBuffers;
861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int32_t mBufferHead;
8704262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian    int32_t mCurrentBufferIndex;
8897b8056c3182a973c67d3c1b196150d4b9e30f3aMathias Agopian    bool mUpdateOnDemand;
89cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian};
90cbc4c9f8d56317b2fe8964c15c9785ebeef98ca7Mathias Agopian
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian#endif // ANDROID_FRAMEBUFFER_NATIVE_WINDOW_H
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
97