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
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_DISPLAY_HARDWARE_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_DISPLAY_HARDWARE_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Region.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <GLES/gl.h>
261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <GLES/glext.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <EGL/eglext.h>
291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include <pixelflinger/pixelflinger.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#include "GLExtensions.h"
33781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "DisplayHardware/DisplayHardwareBase.h"
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianclass FramebufferNativeWindow;
39e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopianclass HWComposer;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass DisplayHardware : public DisplayHardwareBase
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
45781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        COPY_BITS_EXTENSION         = 0x00000008,
46781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        BUFFER_PRESERVED            = 0x00010000,
47781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        PARTIAL_UPDATES             = 0x00020000,   // video driver feature
48781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        SLOW_CONFIG                 = 0x00040000,   // software
49781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        SWAP_RECTANGLE              = 0x00080000,
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DisplayHardware(
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const sp<SurfaceFlinger>& flinger,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t displayIndex);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~DisplayHardware();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void releaseScreen() const;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void acquireScreen() const;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Flip the front and back buffers if the back buffer is "dirty".  Might
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // be instantaneous, might involve copying the frame buffer around.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void flip(const Region& dirty) const;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float       getDpiX() const;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float       getDpiY() const;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float       getRefreshRate() const;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float       getDensity() const;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int         getWidth() const;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int         getHeight() const;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PixelFormat getFormat() const;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t    getFlags() const;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void        makeCurrent() const;
74967dce306267109a6e8aec408b65609ac5642a03Mathias Agopian    uint32_t    getMaxTextureSize() const;
75967dce306267109a6e8aec408b65609ac5642a03Mathias Agopian    uint32_t    getMaxViewportDims() const;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getPageFlipCount() const;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay getEGLDisplay() const { return mDisplay; }
79e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopian
8094720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling    void dump(String8& res) const;
8194720d7ec40d2b5ee200d95a46588cdb0fb30e66Erik Gilling
82e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopian    // Hardware Composer
83e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopian    HWComposer& getHwComposer() const;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85b1a1874625a6aca967601fcda53a82d8d712df45Mathias Agopian    status_t compositionComplete() const;
86b1a1874625a6aca967601fcda53a82d8d712df45Mathias Agopian
8788cde07df05c275da4e6d5746d79847eea723855Mathias Agopian    Rect getBounds() const {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Rect(mWidth, mHeight);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9088cde07df05c275da4e6d5746d79847eea723855Mathias Agopian    inline Rect bounds() const { return getBounds(); }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9204262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian    // only for debugging
9304262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian    int getCurrentBufferIndex() const;
9404262e9f842edf20168399b6a70f0d67e518fe69Mathias Agopian
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void init(uint32_t displayIndex) __attribute__((noinline));
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void fini() __attribute__((noinline));
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99a0bd0d84555c8e503e05b60cd959406a47d76f70Mathias Agopian    sp<SurfaceFlinger> mFlinger;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay      mDisplay;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface      mSurface;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext      mContext;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig       mConfig;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float           mDpiX;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float           mDpiY;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float           mRefreshRate;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float           mDensity;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int             mWidth;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int             mHeight;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PixelFormat     mFormat;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t        mFlags;
1121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    mutable uint32_t mPageFlipCount;
113c94dce521b57763c6ace6cee206214fd476fe8f9Mathias Agopian    GLint           mMaxViewportDims[2];
114967dce306267109a6e8aec408b65609ac5642a03Mathias Agopian    GLint           mMaxTextureSize;
1151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
116e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopian    HWComposer*     mHwc;
117e0d5f5bcf5a8b26f4ad75f549cbf380b2c9faf20Mathias Agopian
1181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    sp<FramebufferNativeWindow> mNativeWindow;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_DISPLAY_HARDWARE_H
124