1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Copyright (C) 2007 The Android Open Source Project
3076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
4076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * you may not use this file except in compliance with the License.
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * You may obtain a copy of the License at
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
8076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
10076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Unless required by applicable law or agreed to in writing, software
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * See the License for the specific language governing permissions and
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * limitations under the License.
15076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian */
16076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
173330b203039dea366d4981db1408a460134b2d2cMathias Agopian#define LOG_TAG "GraphicBufferMapper"
18cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian#define ATRACE_TAG ATRACE_TAG_GRAPHICS
19076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
20076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <stdint.h>
21076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <errno.h>
22076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
23d31824004277f554000417cea349d69f18655e95Dan Stoza// We would eliminate the non-conforming zero-length array, but we can't since
24d31824004277f554000417cea349d69f18655e95Dan Stoza// this is effectively included from the Linux kernel
25d31824004277f554000417cea349d69f18655e95Dan Stoza#pragma clang diagnostic push
26d31824004277f554000417cea349d69f18655e95Dan Stoza#pragma clang diagnostic ignored "-Wzero-length-array"
278f3960179c56767e5077be8337792bd4e244b7d7Francis Hart#include <sync/sync.h>
28d31824004277f554000417cea349d69f18655e95Dan Stoza#pragma clang diagnostic pop
298f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/Errors.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/Log.h>
32cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian#include <utils/Trace.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
343330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBufferMapper.h>
35076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/Rect.h>
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
38076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
398b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
40076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiannamespace android {
41076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
42076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
433330b203039dea366d4981db1408a460134b2d2cMathias AgopianANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferMapper )
444243e666213029a293935987c979831093fb0779Mathias Agopian
453330b203039dea366d4981db1408a460134b2d2cMathias AgopianGraphicBufferMapper::GraphicBufferMapper()
46076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    : mAllocMod(0)
47076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
48076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    hw_module_t const* module;
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
50e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (err == 0) {
52d31824004277f554000417cea349d69f18655e95Dan Stoza        mAllocMod = reinterpret_cast<gralloc_module_t const *>(module);
53076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
54076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
55076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
563330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle)
57076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
58cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
59b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
600a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
610a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->registerBuffer(mAllocMod, handle);
620a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
6332397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "registerBuffer(%p) failed %d (%s)",
640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            handle, err, strerror(-err));
65076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
66076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
67076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
683330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::unregisterBuffer(buffer_handle_t handle)
69076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
70cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
71b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
720a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
730a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->unregisterBuffer(mAllocMod, handle);
740a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
7532397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "unregisterBuffer(%p) failed %d (%s)",
760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            handle, err, strerror(-err));
77076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
78076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
79076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
80d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBufferMapper::lock(buffer_handle_t handle,
81d31824004277f554000417cea349d69f18655e95Dan Stoza        uint32_t usage, const Rect& bounds, void** vaddr)
82076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
83cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
84b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
850a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
86d31824004277f554000417cea349d69f18655e95Dan Stoza    err = mAllocMod->lock(mAllocMod, handle, static_cast<int>(usage),
870a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian            bounds.left, bounds.top, bounds.width(), bounds.height(),
880a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian            vaddr);
890a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
9032397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
91076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
92076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
93076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
94c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvalastatus_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle,
95d31824004277f554000417cea349d69f18655e95Dan Stoza        uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr)
96c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala{
97c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    ATRACE_CALL();
98c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    status_t err;
99c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
1001f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    if (mAllocMod->lock_ycbcr == NULL) {
1011f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar        return -EINVAL; // do not log failure
1021f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    }
1031f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar
104d31824004277f554000417cea349d69f18655e95Dan Stoza    err = mAllocMod->lock_ycbcr(mAllocMod, handle, static_cast<int>(usage),
105c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala            bounds.left, bounds.top, bounds.width(), bounds.height(),
106c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala            ycbcr);
107c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
108c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
109c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    return err;
110c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala}
111c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
1123330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::unlock(buffer_handle_t handle)
113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
114cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
115b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
116b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
1170a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->unlock(mAllocMod, handle);
118b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
11932397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "unlock(...) failed %d (%s)", err, strerror(-err));
1200a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    return err;
121b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian}
122b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
1238f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::lockAsync(buffer_handle_t handle,
124d31824004277f554000417cea349d69f18655e95Dan Stoza        uint32_t usage, const Rect& bounds, void** vaddr, int fenceFd)
1258f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1268f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1278f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1288f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1298f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3) {
130d31824004277f554000417cea349d69f18655e95Dan Stoza        err = mAllocMod->lockAsync(mAllocMod, handle, static_cast<int>(usage),
1318f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1328f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                vaddr, fenceFd);
1338f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    } else {
13484f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki        if (fenceFd >= 0) {
13584f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki            sync_wait(fenceFd, -1);
13684f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki            close(fenceFd);
13784f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki        }
138d31824004277f554000417cea349d69f18655e95Dan Stoza        err = mAllocMod->lock(mAllocMod, handle, static_cast<int>(usage),
1398f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1408f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                vaddr);
1418f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1428f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1438f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "lockAsync(...) failed %d (%s)", err, strerror(-err));
1448f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1458f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1468f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1478f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle,
148d31824004277f554000417cea349d69f18655e95Dan Stoza        uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr, int fenceFd)
1498f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1508f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1518f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1528f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1531f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3
1541f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar            && mAllocMod->lockAsync_ycbcr != NULL) {
155d31824004277f554000417cea349d69f18655e95Dan Stoza        err = mAllocMod->lockAsync_ycbcr(mAllocMod, handle,
156d31824004277f554000417cea349d69f18655e95Dan Stoza                static_cast<int>(usage), bounds.left, bounds.top,
157d31824004277f554000417cea349d69f18655e95Dan Stoza                bounds.width(), bounds.height(), ycbcr, fenceFd);
1581f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    } else if (mAllocMod->lock_ycbcr != NULL) {
15984f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki        if (fenceFd >= 0) {
16084f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki            sync_wait(fenceFd, -1);
16184f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki            close(fenceFd);
16284f1d9c288f35fa399f97207b6af43a261d5989aTaiju Tsuiki        }
163d31824004277f554000417cea349d69f18655e95Dan Stoza        err = mAllocMod->lock_ycbcr(mAllocMod, handle, static_cast<int>(usage),
1648f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1658f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                ycbcr);
1661f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    } else {
1674d0cd3f5241df28d8259c5ee7df33649c5c10f2dTaiju Tsuiki        if (fenceFd >= 0) {
1684d0cd3f5241df28d8259c5ee7df33649c5c10f2dTaiju Tsuiki            close(fenceFd);
1694d0cd3f5241df28d8259c5ee7df33649c5c10f2dTaiju Tsuiki        }
1701f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar        return -EINVAL; // do not log failure
1718f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1728f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1738f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
1748f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1758f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1768f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1778f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::unlockAsync(buffer_handle_t handle, int *fenceFd)
1788f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1798f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1808f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1818f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1828f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3) {
1838f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->unlockAsync(mAllocMod, handle, fenceFd);
1848f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    } else {
1858f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        *fenceFd = -1;
1868f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->unlock(mAllocMod, handle);
1878f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1888f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1898f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "unlockAsync(...) failed %d (%s)", err, strerror(-err));
1908f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1918f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1928f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
193b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian// ---------------------------------------------------------------------------
194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}; // namespace android
195