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