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