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
238f3960179c56767e5077be8337792bd4e244b7d7Francis Hart#include <sync/sync.h>
248f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
25076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/Errors.h>
26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/Log.h>
27cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian#include <utils/Trace.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
293330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBufferMapper.h>
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/Rect.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
348b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
35076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiannamespace android {
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
383330b203039dea366d4981db1408a460134b2d2cMathias AgopianANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferMapper )
394243e666213029a293935987c979831093fb0779Mathias Agopian
403330b203039dea366d4981db1408a460134b2d2cMathias AgopianGraphicBufferMapper::GraphicBufferMapper()
41076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    : mAllocMod(0)
42076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
43076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    hw_module_t const* module;
44076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
45e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    ALOGE_IF(err, "FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
46076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (err == 0) {
47076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mAllocMod = (gralloc_module_t const *)module;
48076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
513330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle)
52076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
53cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
54b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
550a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
560a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->registerBuffer(mAllocMod, handle);
570a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
5832397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "registerBuffer(%p) failed %d (%s)",
590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            handle, err, strerror(-err));
60076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
61076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
62076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
633330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::unregisterBuffer(buffer_handle_t handle)
64076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
65cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
66b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
670a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
680a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->unregisterBuffer(mAllocMod, handle);
690a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
7032397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "unregisterBuffer(%p) failed %d (%s)",
710926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            handle, err, strerror(-err));
72076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
73076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
74076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
753330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::lock(buffer_handle_t handle,
760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        int usage, const Rect& bounds, void** vaddr)
77076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
78cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
79b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
800a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
810a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->lock(mAllocMod, handle, usage,
820a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian            bounds.left, bounds.top, bounds.width(), bounds.height(),
830a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian            vaddr);
840a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian
8532397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
86076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return err;
87076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
88076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
89c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvalastatus_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle,
90c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        int usage, const Rect& bounds, android_ycbcr *ycbcr)
91c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala{
92c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    ATRACE_CALL();
93c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    status_t err;
94c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
951f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    if (mAllocMod->lock_ycbcr == NULL) {
961f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar        return -EINVAL; // do not log failure
971f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    }
981f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar
99c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    err = mAllocMod->lock_ycbcr(mAllocMod, handle, usage,
100c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala            bounds.left, bounds.top, bounds.width(), bounds.height(),
101c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala            ycbcr);
102c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
103c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
104c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    return err;
105c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala}
106c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
1073330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBufferMapper::unlock(buffer_handle_t handle)
108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
109cf56319d4deb2215e5274f321f7fee71caa1ada1Mathias Agopian    ATRACE_CALL();
110b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian    status_t err;
111b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
1120a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    err = mAllocMod->unlock(mAllocMod, handle);
113b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
11432397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW_IF(err, "unlock(...) failed %d (%s)", err, strerror(-err));
1150a757814f3e4ca4db772144e85b687fe89a7fba5Mathias Agopian    return err;
116b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian}
117b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian
1188f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::lockAsync(buffer_handle_t handle,
1198f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        int usage, const Rect& bounds, void** vaddr, int fenceFd)
1208f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1218f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1228f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1238f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1248f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3) {
1258f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->lockAsync(mAllocMod, handle, usage,
1268f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1278f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                vaddr, fenceFd);
1288f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    } else {
1298f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        sync_wait(fenceFd, -1);
1308f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        close(fenceFd);
1318f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->lock(mAllocMod, handle, usage,
1328f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1338f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                vaddr);
1348f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1358f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1368f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "lockAsync(...) failed %d (%s)", err, strerror(-err));
1378f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1388f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1398f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1408f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle,
1418f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        int usage, const Rect& bounds, android_ycbcr *ycbcr, int fenceFd)
1428f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1438f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1448f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1458f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1461f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3
1471f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar            && mAllocMod->lockAsync_ycbcr != NULL) {
1488f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->lockAsync_ycbcr(mAllocMod, handle, usage,
1498f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1508f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                ycbcr, fenceFd);
1511f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    } else if (mAllocMod->lock_ycbcr != NULL) {
1528f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        sync_wait(fenceFd, -1);
1538f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        close(fenceFd);
1548f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->lock_ycbcr(mAllocMod, handle, usage,
1558f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                bounds.left, bounds.top, bounds.width(), bounds.height(),
1568f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                ycbcr);
1571f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar    } else {
1581f9f71e183946b390fff4d20900bc4a03246a882Lajos Molnar        return -EINVAL; // do not log failure
1598f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1608f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1618f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "lock(...) failed %d (%s)", err, strerror(-err));
1628f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1638f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1648f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1658f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBufferMapper::unlockAsync(buffer_handle_t handle, int *fenceFd)
1668f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
1678f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ATRACE_CALL();
1688f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t err;
1698f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1708f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    if (mAllocMod->common.module_api_version >= GRALLOC_MODULE_API_VERSION_0_3) {
1718f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->unlockAsync(mAllocMod, handle, fenceFd);
1728f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    } else {
1738f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        *fenceFd = -1;
1748f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        err = mAllocMod->unlock(mAllocMod, handle);
1758f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
1768f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
1778f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    ALOGW_IF(err, "unlockAsync(...) failed %d (%s)", err, strerror(-err));
1788f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return err;
1798f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
1808f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
181b26af23744fa73e8bc142b1eb98772fde5970c10Mathias Agopian// ---------------------------------------------------------------------------
182076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}; // namespace android
183