gralloc_priv.h revision 988b8bd553180e8d71b4028ecb721f46312efe62
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef GRALLOC_PRIV_H_
18#define GRALLOC_PRIV_H_
19
20#include <stdint.h>
21#include <asm/page.h>
22#include <limits.h>
23#include <sys/cdefs.h>
24#include <hardware/gralloc.h>
25#include <pthread.h>
26
27#include <cutils/native_handle.h>
28
29#if HAVE_ANDROID_OS
30#include <linux/fb.h>
31#endif
32
33/*****************************************************************************/
34
35inline size_t roundUpToPageSize(size_t x) {
36    return (x + (PAGESIZE-1)) & ~(PAGESIZE-1);
37}
38
39int gralloc_map(gralloc_module_t const* module,
40        buffer_handle_t handle, void** vaddr);
41
42int gralloc_unmap(gralloc_module_t const* module,
43        buffer_handle_t handle);
44
45
46int mapFrameBufferLocked(struct private_module_t* module);
47
48/*****************************************************************************/
49
50struct private_handle_t;
51
52struct private_module_t {
53    gralloc_module_t base;
54
55    private_handle_t* framebuffer;
56    uint32_t flags;
57    uint32_t numBuffers;
58    uint32_t bufferMask;
59    pthread_mutex_t lock;
60    buffer_handle_t currentBuffer;
61    struct fb_var_screeninfo info;
62    struct fb_fix_screeninfo finfo;
63    float xdpi;
64    float ydpi;
65    float fps;
66
67    enum {
68        // flag to indicate we'll post this buffer
69        PRIV_USAGE_LOCKED_FOR_POST = 0x80000000
70    };
71};
72
73/*****************************************************************************/
74
75struct private_handle_t : public native_handle
76{
77    enum {
78        PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
79        PRIV_FLAGS_USES_PMEM   = 0x00000002,
80        PRIV_FLAGS_MAPPED      = 0x00000004,    // FIXME: should be out-of-line
81        PRIV_FLAGS_LOCKED      = 0x00000008     // FIXME: should be out-of-line
82    };
83
84    int     fd;
85    int     magic;
86    int     base;   // FIXME: should be out-of-line (meaningless with ipc)
87    int     flags;
88    int     size;
89
90    static const int sNumInts = 4;
91    static const int sNumFds = 1;
92    static const int sMagic = 0x3141592;
93
94    private_handle_t(int fd, int size, int flags) :
95        fd(fd), magic(sMagic), base(0), flags(flags), size(size) {
96        version = sizeof(native_handle);
97        numInts = sNumInts;
98        numFds = sNumFds;
99    }
100
101    ~private_handle_t() {
102        magic = 0;
103    }
104
105    bool usesPhysicallyContiguousMemory() {
106        return (flags & PRIV_FLAGS_USES_PMEM) != 0;
107    }
108
109    static int validate(const native_handle* h) {
110        if (!h || h->version != sizeof(native_handle) ||
111                h->numInts!=sNumInts || h->numFds!=sNumFds) {
112            return -EINVAL;
113        }
114        const private_handle_t* hnd = (const private_handle_t*)h;
115        if (hnd->magic != sMagic)
116            return -EINVAL;
117        return 0;
118    }
119
120    static private_handle_t* dynamicCast(const native_handle* in) {
121        if (validate(in) == 0) {
122            return (private_handle_t*) in;
123        }
124        return NULL;
125    }
126};
127
128/*****************************************************************************/
129
130template<typename T>
131struct growable_sorted_array_t {
132    int size;
133    int count;
134    T* data;
135
136    growable_sorted_array_t() : size(0), count(0), data(0) {
137    }
138
139    growable_sorted_array_t(int initialSize)
140        : size(initialSize), count(0), data(0)
141    {
142        data = new T[initialSize];
143    }
144
145    ~growable_sorted_array_t() {
146        delete[] data;
147    }
148
149    /** Returns true if we found an exact match.
150     * Argument index is set to the the first index >= key in place.
151     * Index will be in range 0..count inclusive.
152     *
153     */
154    bool find(const T& key, int& index) {
155        return binarySearch(0, count-1, key, index);
156    }
157
158    T* at(int index){
159        if (index >= 0  && index < count) {
160            return data + index;
161        }
162        return 0;
163    }
164
165    void insert(int index, const T& item) {
166        if (index >= 0 && index <= count) {
167            if (count + 1 > size) {
168                int newSize = size * 2;
169                if (newSize < count + 1) {
170                    newSize = count + 1;
171                }
172                T* newData = new T[newSize];
173                if (size > 0) {
174                    memcpy(newData, data, sizeof(T) * count);
175                }
176                data = newData;
177                size = newSize;
178            }
179            int toMove = count - index;
180            if (toMove > 0) {
181                memmove(data + index + 1, data + index, sizeof(T) * toMove);
182            }
183            count++;
184            data[index] = item;
185        }
186    }
187
188    void remove(int index) {
189        if (index >= 0 && index < count) {
190            int toMove = (count - 1) - index;
191            if (toMove > 0) {
192                memmove(data + index, data + index + 1, sizeof(T) * toMove);
193            }
194            count--;
195        }
196    }
197
198    /** Return the first index >= key. May be in range first..last+1. */
199    int binarySearch(int first, int last, const T& key, int& index)
200    {
201        while (first <= last) {
202            int mid = (first + last) / 2;
203            int cmp = compare(key, data[mid]);
204            if (cmp > 0) {
205                first = mid + 1;
206            } else if (cmp < 0) {
207                last = mid - 1;
208            } else {
209                index = mid;
210                return true;
211            }
212        }
213        index = first;
214        return false;
215    }
216};
217
218
219#endif /* GRALLOC_PRIV_H_ */
220