gralloc_priv.h revision 471812b710583ffdb5b4bda6c7c85c893762b0f2
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
32a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin/* UGH.. HACK */
33a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavinenum {
34a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_HW_FIMC1        = 0x01000000,
35a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_HW_ION          = 0x02000000,
36a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_YUV_ADDR        = 0x04000000,
37a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    /* SEC Private usage , for Overlay path at HWC */
38a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_HWC_HWOVERLAY     = 0x20000000,
39a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin
40a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    /* SEC Private usage , for HWC to set HDMI S3D format */
41a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    /* HDMI should display this buffer as S3D SBS LR/RL*/
42a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_PRIVATE_SBS_LR        = 0x00400000,
43a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_PRIVATE_SBS_RL        = 0x00200000,
44a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    /* HDMI should display this buffer as 3D TB LR/RL*/
45a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin    GRALLOC_USAGE_PRIVATE_TB_LR         = 0x00100000,
4680b3e6c2d2e0f3d1412a6b25a9a8ea4766d8017eErik Gilling    GRALLOC_USAGE_PRIVATE_TB_RL         = 0x00080000
47a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin};
48a9301d154ee59354bf167fcde8ec76de2b8ccb33Dima Zavin
496198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin/*
5006062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin * HWC_HWOVERLAY is flag for location of glReadPixel().
5106062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin * Enable this define if you want that glReadPixel() is in HWComposer.
5206062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin * If you disable this define, glReadPixel() is not called in threadloop().
536198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin */
546198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define HWC_HWOVERLAY 1
556198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
566198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#define GRALLOC_ARM_UMP_MODULE 1
576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t;
596198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
606198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_module_t
616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
626198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    gralloc_module_t base;
636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
646198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t* framebuffer;
656198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t flags;
666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t numBuffers;
676198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    uint32_t bufferMask;
686198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    pthread_mutex_t lock;
696198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    buffer_handle_t currentBuffer;
706198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int ion_client;
716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
726198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct fb_var_screeninfo info;
736198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct fb_fix_screeninfo finfo;
746198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float xdpi;
756198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float ydpi;
766198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    float fps;
7706062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin    int enableVSync;
786198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
796198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
806198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_USAGE_LOCKED_FOR_POST = 0x80000000
816198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
826198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin};
836198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
846198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus
856198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t : public native_handle
866198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
876198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#else
886198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavinstruct private_handle_t
896198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin{
906198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    struct native_handle nativeHandle;
916198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif
926198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
936198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
946198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
956198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        PRIV_FLAGS_USES_UMP    = 0x00000002,
9680b3e6c2d2e0f3d1412a6b25a9a8ea4766d8017eErik Gilling        PRIV_FLAGS_USES_ION    = 0x00000020
976198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
986198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
996198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    enum {
1006198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_WRITE     =   1<<31,
1016198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_MAPPED    =   1<<30,
1026198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        LOCK_STATE_READ_MASK =   0x3FFFFFFF
1036198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    };
1046198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1056198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following member is for ION memory only
1066198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     fd;
107471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    int     u_fd;
108471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    int     v_fd;
1096198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     magic;
1106198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     flags;
1116198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     size;
1126198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     base;
1136198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     lockState;
1146198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     writeOwner;
1156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     pid;
1166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1176198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following members are for UMP memory only
1186198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ump_secure_id  ump_id;
1196198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ump_handle     ump_mem_handle;
1206198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1216198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    // Following members is for framebuffer only
1226198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     offset;
1236198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     paddr;
1246198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1256198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     format;
1266198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     usage;
1276198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     width;
1286198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     height;
1296198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     bpp;
1306198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     stride;
1316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1326198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    /* Following members are for YUV information */
1336198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int yaddr;
1346198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int uoffset;
1356198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    unsigned int voffset;
1366198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    int     ion_client;
1376198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1386198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#ifdef __cplusplus
1396198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static const int sNumInts = 21;
140471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin    static const int sNumFds = 3;
1416198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static const int sMagic = 0x3141592;
14206062cd9cf56278ef6a46768fc489e34ac5714b5Dima Zavin
1436198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t(int flags, int size, int base, int lock_state, ump_secure_id secure_id, ump_handle handle):
144471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin	fd(0),
145471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        u_fd(0),
146471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        v_fd(0),
1476198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic(sMagic),
1486198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        flags(flags),
1496198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        size(size),
1506198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        base(base),
1516198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        lockState(lock_state),
1526198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        writeOwner(0),
1536198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        pid(getpid()),
1546198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_id(secure_id),
1556198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_mem_handle(handle),
156471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        offset(0),
1576198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        format(0),
1586198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        usage(0),
1596198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        width(0),
1606198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        height(0),
1616198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        bpp(0),
1626198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        stride(0),
1636198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        yaddr(0),
1646198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        uoffset(0),
165471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        voffset(0)
1666198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1676198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        version = sizeof(native_handle);
1686198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numFds = sNumFds;
1696198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numInts = sNumInts;
1706198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
1716198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
1726198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    private_handle_t(int flags, int size, int base, int lock_state, int fb_file, int fb_offset):
1736198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic(sMagic),
1746198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        flags(flags),
1756198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        size(size),
1766198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        base(base),
1776198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        lockState(lock_state),
1786198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        writeOwner(0),
1796198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        pid(getpid()),
1806198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_id(UMP_INVALID_SECURE_ID),
1816198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        ump_mem_handle(UMP_INVALID_MEMORY_HANDLE),
1826198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        fd(fb_file),
183471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        u_fd(0),
184471812b710583ffdb5b4bda6c7c85c893762b0f2Rebecca Schultz Zavin        v_fd(0),
1856198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        format(0),
1866198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        usage(0),
1876198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        width(0),
1886198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        height(0),
1896198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        bpp(0),
1906198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        stride(0),
1916198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        yaddr(0),
1926198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        uoffset(0),
1936198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        voffset(0),
1946198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        offset(fb_offset)
1956198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
1966198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        version = sizeof(native_handle);
1976198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numFds = sNumFds;
1986198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        numInts = sNumInts;
1996198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2006198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2016198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    ~private_handle_t()
2026198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
2036198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        magic = 0;
2046198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2056198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2066198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    bool usesPhysicallyContiguousMemory()
2076198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
2086198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return (flags & PRIV_FLAGS_FRAMEBUFFER) ? true : false;
2096198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2106198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2116198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static int validate(const native_handle* h)
2126198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
2136198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        const private_handle_t* hnd = (const private_handle_t*)h;
2146198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2156198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        if (!h || h->version != sizeof(native_handle) ||
2166198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            h->numInts != sNumInts ||
2176198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            h->numFds != sNumFds ||
2186198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            hnd->magic != sMagic)
2196198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            return -EINVAL;
2206198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2216198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return 0;
2226198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2236198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2246198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    static private_handle_t* dynamicCast(const native_handle* in)
2256198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    {
2266198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        if (validate(in) == 0)
2276198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin            return (private_handle_t*) in;
2286198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2296198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin        return NULL;
2306198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin    }
2316198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif
2326198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin};
2336198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin
2346198e543e1160e4d73e50bd7e78c1c1c94e5c138Dima Zavin#endif /* GRALLOC_PRIV_H_ */
235