gralloc_priv.h revision 98aa5b4b045d0f2addf9ee4e6b9c240e6bf5a045
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 <limits.h>
22#include <sys/cdefs.h>
23#include <hardware/gralloc.h>
24#include <pthread.h>
25#include <errno.h>
26#include <unistd.h>
27
28#include <cutils/native_handle.h>
29
30#include <linux/fb.h>
31
32/*****************************************************************************/
33
34struct private_module_t;
35struct private_handle_t;
36typedef int ion_user_handle_t;
37
38struct private_module_t {
39    gralloc_module_t base;
40
41    struct private_handle_t* framebuffer;
42    uint32_t flags;
43    uint32_t numBuffers;
44    uint32_t bufferMask;
45    pthread_mutex_t lock;
46    buffer_handle_t currentBuffer;
47    int ionfd;
48
49    int xres;
50    int yres;
51    int line_length;
52    float xdpi;
53    float ydpi;
54    float fps;
55    void *queue;
56    pthread_mutex_t queue_lock;
57
58};
59
60/*****************************************************************************/
61
62#ifdef __cplusplus
63struct private_handle_t : public native_handle {
64#else
65struct private_handle_t {
66    struct native_handle nativeHandle;
67#endif
68
69// set if using video encoding colorspace
70#define GRALLOC_USAGE_PRIVATE_CHROMA (GRALLOC_USAGE_PRIVATE_0)
71
72    enum {
73        PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
74        PRIV_FLAGS_USES_UMP    = 0x00000002,
75        PRIV_FLAGS_USES_ION    = 0x00000020
76    };
77
78    // file-descriptors
79    int     fd;
80    int     fd1;
81    int     fd2;
82    // ints
83    int     magic;
84    int     flags;
85    int     size;
86    int     offset;
87
88    int     format;
89    int     width;
90    int     height;
91    int     stride;
92    int     vstride;
93    int     gamut;
94    int     chroma;
95
96    // FIXME: the attributes below should be out-of-line
97    void    *base;
98    void    *base1;
99    void    *base2;
100    ion_user_handle_t handle;
101    ion_user_handle_t handle1;
102    ion_user_handle_t handle2;
103
104#ifdef __cplusplus
105    static const int sNumFds = 3;
106    static const int sNumInts = 17;
107    static const int sMagic = 0x3141592;
108
109
110    private_handle_t(int fd, int size, int flags, int w,
111		     int h, int format, int stride, int vstride) :
112        fd(fd), fd1(-1), fd2(-1), magic(sMagic), flags(flags), size(size),
113        offset(0), format(format), width(w), height(h), stride(stride),
114        vstride(vstride), gamut(0), chroma(0), base(0), handle(0), handle1(0),
115        handle2(0)
116    {
117        version = sizeof(native_handle);
118        numInts = sNumInts + 2;
119        numFds = sNumFds - 2;
120    }
121
122    private_handle_t(int fd, int fd1, int size, int flags, int w,
123		     int h, int format, int stride, int vstride) :
124        fd(fd), fd1(fd1), fd2(-1), magic(sMagic), flags(flags), size(size),
125        offset(0), format(format), width(w), height(h), stride(stride),
126        vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0),
127        handle(0), handle1(0), handle2(0)
128    {
129        version = sizeof(native_handle);
130        numInts = sNumInts + 1;
131        numFds = sNumFds - 1;
132    }
133
134    private_handle_t(int fd, int fd1, int fd2, int size, int flags, int w,
135		     int h, int format, int stride, int vstride) :
136        fd(fd), fd1(fd1), fd2(fd2), magic(sMagic), flags(flags), size(size),
137        offset(0), format(format), width(w), height(h), stride(stride),
138        vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0),
139        handle(0), handle1(0), handle2(0)
140    {
141        version = sizeof(native_handle);
142        numInts = sNumInts;
143        numFds = sNumFds;
144    }
145    ~private_handle_t() {
146        magic = 0;
147    }
148
149    static int validate(const native_handle* h) {
150        const private_handle_t* hnd = (const private_handle_t*)h;
151        if (!h || h->version != sizeof(native_handle) ||
152            hnd->numInts + hnd->numFds != sNumInts + sNumFds ||
153            hnd->magic != sMagic)
154        {
155            ALOGE("invalid gralloc handle (at %p)", reinterpret_cast<void *>(const_cast<native_handle *>(h)));
156            return -EINVAL;
157        }
158        return 0;
159    }
160
161    static private_handle_t* dynamicCast(const native_handle* in)
162    {
163        if (validate(in) == 0)
164            return (private_handle_t*) in;
165
166        return NULL;
167    }
168
169#endif
170};
171
172#endif /* GRALLOC_PRIV_H_ */
173