blob: bf2940eae624c304e6475b89e300306badcdb8fd [file] [log] [blame]
Dima Zavin6198e542012-02-29 17:02:46 -08001/*
Dima Zavin6198e542012-02-29 17:02:46 -08002 * 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>
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070021#include <limits.h>
22#include <sys/cdefs.h>
23#include <hardware/gralloc.h>
Dima Zavin6198e542012-02-29 17:02:46 -080024#include <pthread.h>
25#include <errno.h>
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070026#include <unistd.h>
Dima Zavin6198e542012-02-29 17:02:46 -080027
Dima Zavin6198e542012-02-29 17:02:46 -080028#include <cutils/native_handle.h>
29
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070030#include <linux/fb.h>
Dima Zavin6198e542012-02-29 17:02:46 -080031
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070032/*****************************************************************************/
Dima Zavina9301d12012-03-01 10:22:09 -080033
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070034struct private_module_t;
Dima Zavin6198e542012-02-29 17:02:46 -080035struct private_handle_t;
36
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070037struct private_module_t {
Dima Zavin6198e542012-02-29 17:02:46 -080038 gralloc_module_t base;
39
Greg Hackmann8c372e32013-01-15 09:29:40 -080040 struct private_handle_t* framebuffer;
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070041 uint32_t flags;
42 uint32_t numBuffers;
43 uint32_t bufferMask;
Dima Zavin6198e542012-02-29 17:02:46 -080044 pthread_mutex_t lock;
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070045 buffer_handle_t currentBuffer;
46 int ionfd;
Dima Zavin6198e542012-02-29 17:02:46 -080047
Greg Hackmannd37bc2b2012-05-23 16:29:43 -070048 int xres;
49 int yres;
50 int line_length;
Dima Zavin6198e542012-02-29 17:02:46 -080051 float xdpi;
52 float ydpi;
53 float fps;
Greg Hackmanndd557382012-05-03 14:51:28 -070054 void *queue;
55 pthread_mutex_t queue_lock;
Dima Zavin6198e542012-02-29 17:02:46 -080056
Dima Zavin6198e542012-02-29 17:02:46 -080057};
58
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070059/*****************************************************************************/
60
Dima Zavin6198e542012-02-29 17:02:46 -080061#ifdef __cplusplus
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070062struct private_handle_t : public native_handle {
Dima Zavin6198e542012-02-29 17:02:46 -080063#else
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070064struct private_handle_t {
Dima Zavin6198e542012-02-29 17:02:46 -080065 struct native_handle nativeHandle;
66#endif
67
Alex Ray06f1fa72013-04-15 11:24:13 -070068// set if using video encoding colorspace
69#define GRALLOC_USAGE_PRIVATE_CHROMA (GRALLOC_USAGE_PRIVATE_0)
70
Dima Zavin6198e542012-02-29 17:02:46 -080071 enum {
72 PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
73 PRIV_FLAGS_USES_UMP = 0x00000002,
Erik Gilling80b3e6c2012-04-05 15:34:47 -070074 PRIV_FLAGS_USES_ION = 0x00000020
Dima Zavin6198e542012-02-29 17:02:46 -080075 };
76
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070077 // file-descriptors
Dima Zavin6198e542012-02-29 17:02:46 -080078 int fd;
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070079 int fd1;
80 int fd2;
81 // ints
Dima Zavin6198e542012-02-29 17:02:46 -080082 int magic;
83 int flags;
84 int size;
Dima Zavin6198e542012-02-29 17:02:46 -080085 int offset;
Dima Zavin6198e542012-02-29 17:02:46 -080086
87 int format;
Dima Zavin6198e542012-02-29 17:02:46 -080088 int width;
89 int height;
Dima Zavin6198e542012-02-29 17:02:46 -080090 int stride;
Rebecca Schultz Zavin70212e52012-08-15 11:17:04 -070091 int vstride;
Alex Rayb528b802013-01-30 21:19:59 -080092 int gamut;
Alex Rayd09ee482013-03-05 12:47:50 -080093 int chroma;
Dima Zavin6198e542012-02-29 17:02:46 -080094
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -070095 // FIXME: the attributes below should be out-of-line
96 void *base;
Rebecca Schultz Zavinec68ab22012-08-27 10:58:52 -070097 void *base1;
98 void *base2;
99 struct ion_handle *handle;
100 struct ion_handle *handle1;
101 struct ion_handle *handle2;
Dima Zavin6198e542012-02-29 17:02:46 -0800102
103#ifdef __cplusplus
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700104 static const int sNumFds = 3;
Alex Rayd09ee482013-03-05 12:47:50 -0800105 static const int sNumInts = 17;
Dima Zavin6198e542012-02-29 17:02:46 -0800106 static const int sMagic = 0x3141592;
Dima Zavin06062cd2012-04-03 00:10:57 -0700107
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700108
109 private_handle_t(int fd, int size, int flags, int w,
Rebecca Schultz Zavin70212e52012-08-15 11:17:04 -0700110 int h, int format, int stride, int vstride) :
Rebecca Schultz Zavinec68ab22012-08-27 10:58:52 -0700111 fd(fd), fd1(-1), fd2(-1), magic(sMagic), flags(flags), size(size),
Rebecca Schultz Zavin70212e52012-08-15 11:17:04 -0700112 offset(0), format(format), width(w), height(h), stride(stride),
Alex Rayd09ee482013-03-05 12:47:50 -0800113 vstride(vstride), gamut(0), chroma(0), base(0), handle(0), handle1(0),
114 handle2(0)
Dima Zavin6198e542012-02-29 17:02:46 -0800115 {
116 version = sizeof(native_handle);
Rebecca Schultz Zavinec68ab22012-08-27 10:58:52 -0700117 numInts = sNumInts + 2;
118 numFds = sNumFds - 2;
119 }
120
121 private_handle_t(int fd, int fd1, int size, int flags, int w,
122 int h, int format, int stride, int vstride) :
123 fd(fd), fd1(fd1), fd2(-1), magic(sMagic), flags(flags), size(size),
124 offset(0), format(format), width(w), height(h), stride(stride),
Alex Rayd09ee482013-03-05 12:47:50 -0800125 vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0),
126 handle(0), handle1(0), handle2(0)
Rebecca Schultz Zavinec68ab22012-08-27 10:58:52 -0700127 {
128 version = sizeof(native_handle);
129 numInts = sNumInts + 1;
130 numFds = sNumFds - 1;
Dima Zavin6198e542012-02-29 17:02:46 -0800131 }
132
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700133 private_handle_t(int fd, int fd1, int fd2, int size, int flags, int w,
Rebecca Schultz Zavin70212e52012-08-15 11:17:04 -0700134 int h, int format, int stride, int vstride) :
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700135 fd(fd), fd1(fd1), fd2(fd2), magic(sMagic), flags(flags), size(size),
Rebecca Schultz Zavin70212e52012-08-15 11:17:04 -0700136 offset(0), format(format), width(w), height(h), stride(stride),
Alex Rayd09ee482013-03-05 12:47:50 -0800137 vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0),
138 handle(0), handle1(0), handle2(0)
Dima Zavin6198e542012-02-29 17:02:46 -0800139 {
140 version = sizeof(native_handle);
Dima Zavin6198e542012-02-29 17:02:46 -0800141 numInts = sNumInts;
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700142 numFds = sNumFds;
Dima Zavin6198e542012-02-29 17:02:46 -0800143 }
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700144 ~private_handle_t() {
Dima Zavin6198e542012-02-29 17:02:46 -0800145 magic = 0;
146 }
147
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700148 static int validate(const native_handle* h) {
Dima Zavin6198e542012-02-29 17:02:46 -0800149 const private_handle_t* hnd = (const private_handle_t*)h;
Dima Zavin6198e542012-02-29 17:02:46 -0800150 if (!h || h->version != sizeof(native_handle) ||
Rebecca Schultz Zavinec68ab22012-08-27 10:58:52 -0700151 hnd->numInts + hnd->numFds != sNumInts + sNumFds ||
152 hnd->magic != sMagic)
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700153 {
154 ALOGE("invalid gralloc handle (at %p)", reinterpret_cast<void *>(const_cast<native_handle *>(h)));
Dima Zavin6198e542012-02-29 17:02:46 -0800155 return -EINVAL;
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700156 }
Dima Zavin6198e542012-02-29 17:02:46 -0800157 return 0;
158 }
159
160 static private_handle_t* dynamicCast(const native_handle* in)
161 {
162 if (validate(in) == 0)
163 return (private_handle_t*) in;
164
165 return NULL;
166 }
Rebecca Schultz Zavina8b0b072012-06-26 12:50:15 -0700167
Dima Zavin6198e542012-02-29 17:02:46 -0800168#endif
169};
170
171#endif /* GRALLOC_PRIV_H_ */