16198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin/* 26198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Copyright (C) 2008 The Android Open Source Project 36198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * 46198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 56198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * you may not use this file except in compliance with the License. 66198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * You may obtain a copy of the License at 76198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * 86198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * http://www.apache.org/licenses/LICENSE-2.0 96198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * 106198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Unless required by applicable law or agreed to in writing, software 116198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS, 126198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * See the License for the specific language governing permissions and 146198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * limitations under the License. 156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin */ 166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 176198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifndef GRALLOC_PRIV_H_ 186198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define GRALLOC_PRIV_H_ 196198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 206198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <stdint.h> 21a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin#include <limits.h> 22a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin#include <sys/cdefs.h> 23a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin#include <hardware/gralloc.h> 246198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <pthread.h> 256198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <errno.h> 26a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin#include <unistd.h> 276198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 286198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <cutils/native_handle.h> 296198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 30a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin#include <linux/fb.h> 316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 32a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin/*****************************************************************************/ 336198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 34a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavinstruct private_module_t; 356198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t; 366198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 37a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavinstruct private_module_t { 386198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin gralloc_module_t base; 396198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 408c372e39ec50e4f441fcc04de8dc1a7f67ae268aGreg Hackmann struct private_handle_t* framebuffer; 41a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin uint32_t flags; 42a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin uint32_t numBuffers; 43a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin uint32_t bufferMask; 446198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin pthread_mutex_t lock; 45a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin buffer_handle_t currentBuffer; 46a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin int ionfd; 476198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 48d37bc2b200444ac2133738a4f106adaadf41ff91Greg Hackmann int xres; 49d37bc2b200444ac2133738a4f106adaadf41ff91Greg Hackmann int yres; 50d37bc2b200444ac2133738a4f106adaadf41ff91Greg Hackmann int line_length; 516198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin float xdpi; 526198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin float ydpi; 536198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin float fps; 54dd55738117261ad61b68ec4651fdea0d01ead073Greg Hackmann void *queue; 55dd55738117261ad61b68ec4651fdea0d01ead073Greg Hackmann pthread_mutex_t queue_lock; 566198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin}; 586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 59a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin/*****************************************************************************/ 60a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin 616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus 62a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavinstruct private_handle_t : public native_handle { 636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#else 64a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavinstruct private_handle_t { 656198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin struct native_handle nativeHandle; 666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif 676198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 6806f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray// set if using video encoding colorspace 6906f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray#define GRALLOC_USAGE_PRIVATE_CHROMA (GRALLOC_USAGE_PRIVATE_0) 7006f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray 716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin enum { 726198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 736198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin PRIV_FLAGS_USES_UMP = 0x00000002, 7480b3e6c2d2e0f3d1412a6b25a9a8ea4766d8017eErik Gilling PRIV_FLAGS_USES_ION = 0x00000020 756198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin }; 766198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 77a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin // file-descriptors 786198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int fd; 79a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin int fd1; 80a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin int fd2; 81a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin // ints 826198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int magic; 836198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int flags; 846198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int size; 856198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int offset; 866198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 876198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int format; 886198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int width; 896198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int height; 906198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin int stride; 9170212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int vstride; 92b528b809765d8b92a9d4f35e127e6427ab459453Alex Ray int gamut; 93d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray int chroma; 946198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 95a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin // FIXME: the attributes below should be out-of-line 96a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin void *base; 97ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin void *base1; 98ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin void *base2; 99ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin struct ion_handle *handle; 100ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin struct ion_handle *handle1; 101ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin struct ion_handle *handle2; 1026198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 1036198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus 104471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin static const int sNumFds = 3; 105d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray static const int sNumInts = 17; 1066198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin static const int sMagic = 0x3141592; 10706062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin 108a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin 109a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin private_handle_t(int fd, int size, int flags, int w, 11070212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int h, int format, int stride, int vstride) : 111ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin fd(fd), fd1(-1), fd2(-1), magic(sMagic), flags(flags), size(size), 11270212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin offset(0), format(format), width(w), height(h), stride(stride), 113d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray vstride(vstride), gamut(0), chroma(0), base(0), handle(0), handle1(0), 114d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray handle2(0) 1156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin { 1166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin version = sizeof(native_handle); 117ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin numInts = sNumInts + 2; 118ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin numFds = sNumFds - 2; 119ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } 120ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin 121ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin private_handle_t(int fd, int fd1, int size, int flags, int w, 122ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin int h, int format, int stride, int vstride) : 123ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin fd(fd), fd1(fd1), fd2(-1), magic(sMagic), flags(flags), size(size), 124ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin offset(0), format(format), width(w), height(h), stride(stride), 125d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0), 126d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray handle(0), handle1(0), handle2(0) 127ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin { 128ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin version = sizeof(native_handle); 129ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin numInts = sNumInts + 1; 130ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin numFds = sNumFds - 1; 1316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin } 1326198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 133a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin private_handle_t(int fd, int fd1, int fd2, int size, int flags, int w, 13470212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int h, int format, int stride, int vstride) : 135a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin fd(fd), fd1(fd1), fd2(fd2), magic(sMagic), flags(flags), size(size), 13670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin offset(0), format(format), width(w), height(h), stride(stride), 137d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray vstride(vstride), gamut(0), chroma(0), base(0), base1(0), base2(0), 138d09ee48e1cd72e2b14cdba926a409fec3c9fbe43Alex Ray handle(0), handle1(0), handle2(0) 1396198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin { 1406198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin version = sizeof(native_handle); 1416198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin numInts = sNumInts; 142a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin numFds = sNumFds; 1436198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin } 144a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin ~private_handle_t() { 1456198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin magic = 0; 1466198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin } 1476198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 148a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin static int validate(const native_handle* h) { 1496198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin const private_handle_t* hnd = (const private_handle_t*)h; 1506198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin if (!h || h->version != sizeof(native_handle) || 151ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin hnd->numInts + hnd->numFds != sNumInts + sNumFds || 152ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin hnd->magic != sMagic) 153a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin { 154a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin ALOGE("invalid gralloc handle (at %p)", reinterpret_cast<void *>(const_cast<native_handle *>(h))); 1556198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin return -EINVAL; 156a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin } 1576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin return 0; 1586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin } 1596198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 1606198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin static private_handle_t* dynamicCast(const native_handle* in) 1616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin { 1626198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin if (validate(in) == 0) 1636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin return (private_handle_t*) in; 1646198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 1656198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin return NULL; 1666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin } 167a8b0b07d250370ddc8291b5853325693959b6861Rebecca Schultz Zavin 1686198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif 1696198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin}; 1706198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin 1716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif /* GRALLOC_PRIV_H_ */ 172