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