gralloc_priv.h revision 689fa73c067e1618bbdb62f32c2a34750b8ec48b
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2008 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 160c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes 179b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#ifndef GRALLOC_PRIV_H_ 189b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#define GRALLOC_PRIV_H_ 19f66330a747eff155eb571b634fc9d901c55a78a7Elliott Hughes 200cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers#include <stdint.h> 210cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers#include <asm/page.h> 229b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro#include <limits.h> 23726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes#include <sys/cdefs.h> 241f5393447b9f45be7918042d9ee7b521376de866Ian Rogers#include <hardware/gralloc.h> 250c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#include <pthread.h> 260c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#include <errno.h> 270c9cd5692fbbc5d92fcdc1ef41ef881a492b00ceElliott Hughes#include <unistd.h> 28f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom 29c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes#include <cutils/native_handle.h> 30c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes 31f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom#if HAVE_ANDROID_OS 325174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes#include <linux/fb.h> 33a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes#endif 34a2501990dd0f68baf38ce19251949d7bb3ecfe5aElliott Hughes 355174fe6e4e931c423e910366ff22ce0838567940Elliott Hughes/*****************************************************************************/ 364dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes 375174fe6e4e931c423e910366ff22ce0838567940Elliott Hughesstruct private_module_t; 384d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 39b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughesinline size_t roundUpToPageSize(size_t x) { 40726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes return (x + (PAGESIZE-1)) & ~(PAGESIZE-1); 41726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes} 42726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes 43b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughesint mapFrameBufferLocked(struct private_module_t* module); 44b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 45b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes/*****************************************************************************/ 46b264f081424642b06b0bbe7102781895d41faa9dElliott Hughes 47b264f081424642b06b0bbe7102781895d41faa9dElliott Hughesclass Locker { 48726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes pthread_mutex_t mutex; 49726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughespublic: 50726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes class Autolock { 51726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes Locker& locker; 52726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes public: 534d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline Autolock(Locker& locker) : locker(locker) { locker.lock(); } 544d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline ~Autolock() { locker.unlock(); } 554d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom }; 564d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline Locker() { pthread_mutex_init(&mutex, 0); } 574d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline ~Locker() { pthread_mutex_destroy(&mutex); } 584d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline void lock() { pthread_mutex_lock(&mutex); } 594d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom inline void unlock() { pthread_mutex_unlock(&mutex); } 604d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom}; 614d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 624d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom/*****************************************************************************/ 634d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 644d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstromstruct private_handle_t; 654d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom 664d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstromstruct private_module_t { 674d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom gralloc_module_t base; 68726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes 694d5714378c3433ba7e351cbf6a6713fb49c31784Brian Carlstrom private_handle_t* framebuffer; 70726079d3e2e50854cd6ca4c393f4529a796dba58Elliott Hughes uint32_t flags; 71c7ac37f0b8b64cfb53d8b9cc8dddbb34be3dd5eeElliott Hughes uint32_t numBuffers; 72b465ab0e103d7760df903c1fddf4fa6b89d5d1f5Elliott Hughes uint32_t bufferMask; 7366f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier pthread_mutex_t lock; 7400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers buffer_handle_t currentBuffer; 75b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers int pmem_master; 7677405796564c6c1353807cda18b28678a719bd68Elliott Hughes void* pmem_master_base; 7700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers 781f5393447b9f45be7918042d9ee7b521376de866Ian Rogers struct fb_var_screeninfo info; 791f5393447b9f45be7918042d9ee7b521376de866Ian Rogers struct fb_fix_screeninfo finfo; 801f5393447b9f45be7918042d9ee7b521376de866Ian Rogers float xdpi; 811f5393447b9f45be7918042d9ee7b521376de866Ian Rogers float ydpi; 8277405796564c6c1353807cda18b28678a719bd68Elliott Hughes float fps; 8377405796564c6c1353807cda18b28678a719bd68Elliott Hughes 8477405796564c6c1353807cda18b28678a719bd68Elliott Hughes enum { 8577405796564c6c1353807cda18b28678a719bd68Elliott Hughes // flag to indicate we'll post this buffer 8677405796564c6c1353807cda18b28678a719bd68Elliott Hughes PRIV_USAGE_LOCKED_FOR_POST = 0x80000000 8777405796564c6c1353807cda18b28678a719bd68Elliott Hughes }; 8877405796564c6c1353807cda18b28678a719bd68Elliott Hughes}; 8977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9077405796564c6c1353807cda18b28678a719bd68Elliott Hughes/*****************************************************************************/ 9177405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9277405796564c6c1353807cda18b28678a719bd68Elliott Hughesstruct private_handle_t : public native_handle 9300f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers{ 9400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers enum { 9577405796564c6c1353807cda18b28678a719bd68Elliott Hughes PRIV_FLAGS_FRAMEBUFFER = 0x00000001, 9677405796564c6c1353807cda18b28678a719bd68Elliott Hughes PRIV_FLAGS_USES_PMEM = 0x00000002, 9750b35e2fd1a68cd1240e4a9d9f363e11764957d1Ian Rogers }; 9877405796564c6c1353807cda18b28678a719bd68Elliott Hughes 9966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier enum { 10077405796564c6c1353807cda18b28678a719bd68Elliott Hughes LOCK_STATE_WRITE = 1<<31, 10177405796564c6c1353807cda18b28678a719bd68Elliott Hughes LOCK_STATE_MAPPED = 1<<30, 10277405796564c6c1353807cda18b28678a719bd68Elliott Hughes LOCK_STATE_READ_MASK = 0x3FFFFFFF 10377405796564c6c1353807cda18b28678a719bd68Elliott Hughes }; 10477405796564c6c1353807cda18b28678a719bd68Elliott Hughes 105b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers int fd; 10666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier int magic; 10777405796564c6c1353807cda18b28678a719bd68Elliott Hughes int flags; 10866f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier int size; 10977405796564c6c1353807cda18b28678a719bd68Elliott Hughes int offset; 11077405796564c6c1353807cda18b28678a719bd68Elliott Hughes // FIXME: the attributes below should be out-of-line 11177405796564c6c1353807cda18b28678a719bd68Elliott Hughes int base; 11200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers int lockState; 113b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers int writeOwner; 11466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier int pid; 11577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 11666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier static const int sNumInts = 8; 11777405796564c6c1353807cda18b28678a719bd68Elliott Hughes static const int sNumFds = 1; 11877405796564c6c1353807cda18b28678a719bd68Elliott Hughes static const int sMagic = 0x3141592; 11977405796564c6c1353807cda18b28678a719bd68Elliott Hughes 12077405796564c6c1353807cda18b28678a719bd68Elliott Hughes private_handle_t(int fd, int size, int flags) : 121f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes fd(fd), magic(sMagic), flags(flags), size(size), offset(0), 122f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes base(0), lockState(0), writeOwner(0), pid(getpid()) 12377405796564c6c1353807cda18b28678a719bd68Elliott Hughes { 124f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes version = sizeof(native_handle); 12577405796564c6c1353807cda18b28678a719bd68Elliott Hughes numInts = sNumInts; 126f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes numFds = sNumFds; 127f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes } 12877405796564c6c1353807cda18b28678a719bd68Elliott Hughes ~private_handle_t() { 129f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes magic = 0; 13077405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 131f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 132f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes bool usesPhysicallyContiguousMemory() { 13377405796564c6c1353807cda18b28678a719bd68Elliott Hughes return (flags & PRIV_FLAGS_USES_PMEM) != 0; 134f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes } 13577405796564c6c1353807cda18b28678a719bd68Elliott Hughes 136f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes static int validate(const native_handle* h) { 137f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes if (!h || h->version != sizeof(native_handle) || 13877405796564c6c1353807cda18b28678a719bd68Elliott Hughes h->numInts!=sNumInts || h->numFds!=sNumFds) { 139f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return -EINVAL; 14077405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 14177405796564c6c1353807cda18b28678a719bd68Elliott Hughes const private_handle_t* hnd = (const private_handle_t*)h; 14200f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers if (hnd->magic != sMagic) 143b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers return -EINVAL; 14466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier return 0; 14577405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 14666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier 14777405796564c6c1353807cda18b28678a719bd68Elliott Hughes static private_handle_t* dynamicCast(const native_handle* in) { 14877405796564c6c1353807cda18b28678a719bd68Elliott Hughes if (validate(in) == 0) { 14977405796564c6c1353807cda18b28678a719bd68Elliott Hughes return (private_handle_t*) in; 15077405796564c6c1353807cda18b28678a719bd68Elliott Hughes } 151f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes return NULL; 152f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes } 15377405796564c6c1353807cda18b28678a719bd68Elliott Hughes}; 154f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes 15577405796564c6c1353807cda18b28678a719bd68Elliott Hughes#endif /* GRALLOC_PRIV_H_ */ 156f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes