gralloc_priv.h revision 6198e543e1160e4d73e50bd7e78c1c1c94e5c138
16198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin/*
26198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
36198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin *
46198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Copyright (C) 2008 The Android Open Source Project
56198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin *
66198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License");
76198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * you may not use this file except in compliance with the License.
86198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * You may obtain a copy of the License at
96198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin *
106198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin *      http://www.apache.org/licenses/LICENSE-2.0
116198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin *
126198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Unless required by applicable law or agreed to in writing, software
136198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS,
146198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * See the License for the specific language governing permissions and
166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * limitations under the License.
176198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin */
186198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
196198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifndef GRALLOC_PRIV_H_
206198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define GRALLOC_PRIV_H_
216198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
226198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <stdint.h>
236198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <pthread.h>
246198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <errno.h>
256198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <linux/fb.h>
266198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
276198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <hardware/gralloc.h>
286198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include <cutils/native_handle.h>
296198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
306198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#include "ump.h"
316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
326198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin/*
336198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * HWC_HWOVERLAY is flag for location of glFinish().
346198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * Enable this define if you want that glFinish() is in HWComposer.
356198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin * If you disable this define, glFinish() is called in threadloop().
366198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin */
376198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define HWC_HWOVERLAY 1
386198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
396198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define GRALLOC_ARM_UMP_MODULE 1
406198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
416198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t;
426198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
436198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_module_t
446198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
456198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    gralloc_module_t base;
466198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
476198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t* framebuffer;
486198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t flags;
496198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t numBuffers;
506198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t bufferMask;
516198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    pthread_mutex_t lock;
526198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    buffer_handle_t currentBuffer;
536198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int ion_client;
546198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
556198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct fb_var_screeninfo info;
566198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct fb_fix_screeninfo finfo;
576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float xdpi;
586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float ydpi;
596198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float fps;
606198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
626198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_USAGE_LOCKED_FOR_POST = 0x80000000
636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
646198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin};
656198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus
676198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t : public native_handle
686198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
696198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#else
706198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t
716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
726198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct native_handle nativeHandle;
736198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif
746198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
756198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
766198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
776198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_FLAGS_USES_UMP    = 0x00000002,
786198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_FLAGS_USES_ION    = 0x00000020,
796198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
806198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
816198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
826198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_WRITE     =   1<<31,
836198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_MAPPED    =   1<<30,
846198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_READ_MASK =   0x3FFFFFFF
856198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
866198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
876198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following member is for ION memory only
886198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     fd;
896198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     magic;
906198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     flags;
916198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     size;
926198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     base;
936198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     lockState;
946198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     writeOwner;
956198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     pid;
966198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
976198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following members are for UMP memory only
986198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ump_secure_id  ump_id;
996198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ump_handle     ump_mem_handle;
1006198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1016198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following members is for framebuffer only
1026198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     offset;
1036198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     paddr;
1046198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1056198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     format;
1066198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     usage;
1076198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     width;
1086198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     height;
1096198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     bpp;
1106198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     stride;
1116198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1126198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    /* Following members are for YUV information */
1136198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int yaddr;
1146198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int uoffset;
1156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int voffset;
1166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     ion_client;
1176198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1186198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus
1196198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static const int sNumInts = 21;
1206198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static const int sNumFds = 1;
1216198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static const int sMagic = 0x3141592;
1226198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t(int flags, int size, int base, int lock_state, ump_secure_id secure_id, ump_handle handle):
1236198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic(sMagic),
1246198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        flags(flags),
1256198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        size(size),
1266198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        base(base),
1276198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        lockState(lock_state),
1286198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        writeOwner(0),
1296198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        pid(getpid()),
1306198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_id(secure_id),
1316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_mem_handle(handle),
1326198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        fd(0),
1336198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        format(0),
1346198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        usage(0),
1356198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        width(0),
1366198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        height(0),
1376198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        bpp(0),
1386198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        stride(0),
1396198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        yaddr(0),
1406198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        uoffset(0),
1416198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        voffset(0),
1426198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        offset(0)
1436198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1446198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        version = sizeof(native_handle);
1456198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numFds = sNumFds;
1466198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numInts = sNumInts;
1476198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1486198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1496198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t(int flags, int size, int base, int lock_state, int fb_file, int fb_offset):
1506198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic(sMagic),
1516198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        flags(flags),
1526198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        size(size),
1536198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        base(base),
1546198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        lockState(lock_state),
1556198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        writeOwner(0),
1566198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        pid(getpid()),
1576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_id(UMP_INVALID_SECURE_ID),
1586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_mem_handle(UMP_INVALID_MEMORY_HANDLE),
1596198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        fd(fb_file),
1606198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        format(0),
1616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        usage(0),
1626198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        width(0),
1636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        height(0),
1646198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        bpp(0),
1656198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        stride(0),
1666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        yaddr(0),
1676198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        uoffset(0),
1686198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        voffset(0),
1696198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        offset(fb_offset)
1706198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        version = sizeof(native_handle);
1726198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numFds = sNumFds;
1736198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numInts = sNumInts;
1746198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1756198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1766198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ~private_handle_t()
1776198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1786198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic = 0;
1796198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1806198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1816198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    bool usesPhysicallyContiguousMemory()
1826198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1836198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return (flags & PRIV_FLAGS_FRAMEBUFFER) ? true : false;
1846198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1856198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1866198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static int validate(const native_handle* h)
1876198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1886198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        const private_handle_t* hnd = (const private_handle_t*)h;
1896198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1906198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        if (!h || h->version != sizeof(native_handle) ||
1916198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            h->numInts != sNumInts ||
1926198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            h->numFds != sNumFds ||
1936198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            hnd->magic != sMagic)
1946198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            return -EINVAL;
1956198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1966198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return 0;
1976198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1986198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1996198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static private_handle_t* dynamicCast(const native_handle* in)
2006198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
2016198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        if (validate(in) == 0)
2026198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            return (private_handle_t*) in;
2036198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2046198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return NULL;
2056198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2066198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif
2076198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin};
2086198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2096198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif /* GRALLOC_PRIV_H_ */
210