1fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
2fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *
4fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Permission is hereby granted, free of charge, to any person obtaining a
5fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * copy of this software and associated documentation files (the
6fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * "Software"), to deal in the Software without restriction, including
7fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * without limitation the rights to use, copy, modify, merge, publish,
8fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * distribute, sub license, and/or sell copies of the Software, and to
9fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * permit persons to whom the Software is furnished to do so, subject to
10fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * the following conditions:
11fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *
12fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * The above copyright notice and this permission notice (including the
13fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * next paragraph) shall be included in all copies or substantial portions
14fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * of the Software.
15fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *
16fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *
24fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Authors:
25fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *    Fei Jiang  <fei.jiang@intel.com>
26fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *    Austin Yuan <austin.yuan@intel.com>
27fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang *
28fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */
29fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
30fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include "android/psb_gralloc.h"
31fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <cutils/log.h>
32fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <utils/threads.h>
33fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <ui/PixelFormat.h>
34fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <hardware/gralloc.h>
35fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <system/graphics.h>
36fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <hardware/hardware.h>
37eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#ifdef BAYTRAIL
38eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#include <ufo/gralloc.h>
3976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
402046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil#include <hal/hal_public.h>
4176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#include <sync/sync.h>
422046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil#endif
432046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil
44fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangusing namespace android;
45fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
46fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#ifdef  LOG_TAG
47fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#undef  LOG_TAG
48fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#endif
49fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
50fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#define LOG_TAG "pvr_drv_video"
51fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
5276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL
5376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachanstatic const gralloc_module_t *mGralloc;
5476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
5576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachanstatic const hw_device_t *mGralloc;
5676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif
57fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
58fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_lock(buffer_handle_t handle,
5976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan                 int usage, int left, int top, int width, int height,
6076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan                 void** vaddr)
61fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
62b7c527a64448cfeedb2fe114b673af667f92faf2hding    int err, j;
63fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
6476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    if (!mGralloc) {
6546ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__);
662db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu        if (gralloc_init()) {
67cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID);
682db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu            return -1;
692db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu        }
702db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu    }
712db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu
7276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL
7376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = mGralloc->lock(mGralloc, handle, usage,
7476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan                         left, top, width, height,
7576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan                         vaddr);
7676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
7776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    const gralloc1_rect_t r = {
7876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        .left   = left,
7976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        .top    = top,
8076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        .width  = width,
8176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        .height = height
8276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    };
8376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_lock_async_img(mGralloc, handle, usage, &r, vaddr, -1);
84098d51ceb6eb2ef08c89224446163aa17aee7cbcDaniel Cardenas#endif
8576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    ALOGV("gralloc_lock: handle is %p, usage is %x, vaddr is %p.\n", handle, usage, *vaddr);
86fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (err){
8746ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGE("lock(...) failed %d (%s).\n", err, strerror(-err));
88751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        return -1;
89751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    } else {
9046ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGV("lock returned with address %p\n", *vaddr);
91751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    }
92fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
93fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return err;
94fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
95fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
96fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_unlock(buffer_handle_t handle)
97fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
98fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int err;
99fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
10076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    if (!mGralloc) {
10146ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__);
1022db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu        if (gralloc_init()) {
103cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID);
1042db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu            return -1;
1052db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu        }
1062db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu    }
1072db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu
10876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL
10976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = mGralloc->unlock(mGralloc, handle);
11076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
11176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    int releaseFence = -1;
11276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_unlock_async_img(mGralloc, handle, &releaseFence);
11376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    if (releaseFence >= 0) {
11476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        sync_wait(releaseFence, -1);
11576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan        close(releaseFence);
11676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    }
11776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif
118fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (err) {
11946ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGE("unlock(...) failed %d (%s)", err, strerror(-err));
120751400dde1eac64dd41c7de33fcddf8a939e4ab2hding        return -1;
121751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    } else {
12246ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGV("unlock returned\n");
123751400dde1eac64dd41c7de33fcddf8a939e4ab2hding    }
124fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
125fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return err;
126fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
127fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
12806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Huint gralloc_register(buffer_handle_t handle)
12906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu{
13006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    int err = 0;
13106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
13276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    if (!mGralloc) {
13306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGW("%s: gralloc module has not been initialized.", __func__);
13406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        if (gralloc_init()) {
13506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu            ALOGE("%s: can't find the %s module", __func__,
13606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu                    GRALLOC_HARDWARE_MODULE_ID);
13706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu            return -1;
13806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        }
13906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    }
14006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
14176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_register_img(mGralloc, handle);
14206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    if (err) {
14306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err));
14406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        return -1;
14506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    } else {
14606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGV("registered buffer %p successfully\n", handle);
14706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    }
14806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
14906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    return err;
15006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu}
15106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
15206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Huint gralloc_unregister(buffer_handle_t handle)
15306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu{
15406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    int err = 0;
15506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
15676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    if (!mGralloc) {
15706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGW("%s: gralloc module has not been initialized.", __func__);
15806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        if (gralloc_init()) {
15906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu            ALOGE("%s: can't find the %s module", __func__,
16006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu                    GRALLOC_HARDWARE_MODULE_ID);
16106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu            return -1;
16206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        }
16306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    }
16406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
16576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_unregister_img(mGralloc, handle);
16606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    if (err) {
16706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err));
16806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        return -1;
16906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    } else {
17006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu        ALOGV("unregistered buffer %p successfully\n", handle);
17106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    }
17206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
17306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu    return err;
17406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu}
17506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu
176fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_init(void)
177fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
17876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    int err;
17976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan
18076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL
18176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = hw_get_module(GRALLOC_HW_MODULE_ID, (const hw_module_t **)&mGralloc);
18276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
18376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_open_img(&mGralloc);
18476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif
185fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (err) {
18646ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGE("FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return -1;
188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    } else
18946ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGD("hw_get_module returned\n");
190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return 0;
192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
194707b8b113fe163bc866f6de89ce08385772ef4e7nguoint gralloc_getdisplaystatus(buffer_handle_t handle,  int* status)
195707b8b113fe163bc866f6de89ce08385772ef4e7nguo{
196707b8b113fe163bc866f6de89ce08385772ef4e7nguo    int err;
19776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan
19876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL
19976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    *status = mGralloc->perform(mGralloc, INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_STATUS, handle);
20076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = 0;
20176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else
20296fcbcb36c67aff2f6a723c468d500c1e2c98504Vinil Cheeramvelil    uint32_t _status = 0U;
20376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan    err = gralloc_get_display_status_img(mGralloc, handle, &_status);
20496fcbcb36c67aff2f6a723c468d500c1e2c98504Vinil Cheeramvelil    *status = (int)_status;
205eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#endif
206707b8b113fe163bc866f6de89ce08385772ef4e7nguo    if (err){
20746ec2e2bd4bfdfe667d89afad353cf3c351e705eywan        ALOGE("gralloc_getdisplaystatus(...) failed %d (%s).\n", err, strerror(-err));
208707b8b113fe163bc866f6de89ce08385772ef4e7nguo        return -1;
209707b8b113fe163bc866f6de89ce08385772ef4e7nguo    }
210707b8b113fe163bc866f6de89ce08385772ef4e7nguo
211707b8b113fe163bc866f6de89ce08385772ef4e7nguo    return err;
212707b8b113fe163bc866f6de89ce08385772ef4e7nguo}
2132046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil
2142046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelilint gralloc_getbuffd(buffer_handle_t handle)
2152046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil{
2162046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil    return ((IMG_native_handle_t*)handle)->fd[0];
2172046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil}
218