1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2008 The Android Open Source Project
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License.
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <limits.h>
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <errno.h>
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <pthread.h>
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <unistd.h>
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <string.h>
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdarg.h>
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/mman.h>
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/stat.h>
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/types.h>
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <sys/ioctl.h>
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h>
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/atomic.h>
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <utils/Trace.h>
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hardware/hardware.h>
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <hardware/gralloc.h>
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
3886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu#include <gralloc1-adapter.h>
3986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gralloc_priv.h"
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "gr.h"
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "alloc_controller.h"
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "memalloc.h"
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <qdMetaData.h>
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace gralloc;
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Return the type of allocator -
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// these are used for mapping/unmapping
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic IMemAlloc* getAllocator(int flags)
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    IMemAlloc* memalloc;
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    IAllocController* alloc_ctrl = IAllocController::getInstance();
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    memalloc = alloc_ctrl->getAllocator(flags);
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return memalloc;
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
60b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmedstatic int gralloc_map_metadata(buffer_handle_t handle) {
61b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    private_handle_t* hnd = (private_handle_t*)handle;
62b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    hnd->base_metadata = 0;
63b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
64b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    void *mappedAddress = MAP_FAILED;
65b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    unsigned int size = 0;
66b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
67b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        mappedAddress = MAP_FAILED;
68b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
69b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        int ret = memalloc->map_buffer(&mappedAddress, size,
70b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed                                       hnd->offset_metadata, hnd->fd_metadata);
71b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        if(ret || mappedAddress == MAP_FAILED) {
72b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed            ALOGE("Could not mmap metadata for handle %p, fd=%d (%s)",
73b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed                  hnd, hnd->fd_metadata, strerror(errno));
74b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed            return -errno;
75b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        }
76b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        hnd->base_metadata = uint64_t(mappedAddress) + hnd->offset_metadata;
77b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    }
78b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    return 0;
79b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed}
80b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_map(gralloc_module_t const* module,
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                       buffer_handle_t handle)
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!module)
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    unsigned int size = 0;
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int err = 0;
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
9205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    void *mappedAddress = MAP_FAILED;
9305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    hnd->base = 0;
9405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed
9505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    // Dont map framebuffer and secure buffers
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        size = hnd->size;
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = memalloc->map_buffer(&mappedAddress, size,
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                       hnd->offset, hnd->fd);
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if(err || mappedAddress == MAP_FAILED) {
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            ALOGE("Could not mmap handle %p, fd=%d (%s)",
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                  handle, hnd->fd, strerror(errno));
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            return -errno;
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hnd->base = uint64_t(mappedAddress) + hnd->offset;
108b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    } else {
109b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        // Cannot map secure buffers or framebuffers, but still need to map
110b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        // metadata for secure buffers.
111b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        // If mapping a secure buffers fails, the framework needs to get
112b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        // an error code.
11351b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed        err = -EACCES;
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
11605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    //Allow mapping of metadata for all buffers including secure ones, but not
11705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    //of framebuffer
118b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    int metadata_err = gralloc_map_metadata(handle);
119b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    if(!err) {
120b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed        err = metadata_err;
121f026d04dde743a0524235ae57e2ce8ac5364d44bSteve Pfetsch    }
122b7d1a389b00370fc9d2a7db1268ce26271ead7e2Naseer Ahmed    return err;
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_unmap(gralloc_module_t const* module,
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         buffer_handle_t handle)
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
12905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    int err = -EINVAL;
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!module)
13105d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        return err;
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
13405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
13505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    if(!memalloc)
13605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        return err;
13705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed
13805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    if(hnd->base) {
13905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset);
14005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        if (err) {
141abe67dd75cce255d3449ce9af5fa37109c83444eColin Cross            ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base,
14205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed                    strerror(errno));
14305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed            return -errno;
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
14505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        hnd->base = 0;
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
14705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed
14805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    if(hnd->base_metadata) {
14905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        unsigned int size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
15005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        err = memalloc->unmap_buffer((void*)hnd->base_metadata,
15105d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed                size, hnd->offset_metadata);
15205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        if (err) {
15305d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed            ALOGE("Could not unmap memory at address %p, %s",
154abe67dd75cce255d3449ce9af5fa37109c83444eColin Cross                    (void*) hnd->base_metadata, strerror(errno));
15505d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed            return -errno;
15605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        }
15705d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed        hnd->base_metadata = 0;
15805d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    }
15905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return 0;
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER;
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_register_buffer(gralloc_module_t const* module,
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                            buffer_handle_t handle)
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
17551b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed
17651b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed    int err =  gralloc_map(module, handle);
17751b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed    /* Do not fail register_buffer for secure buffers*/
17851b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed    if (err == -EACCES)
17951b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed        err = 0;
18051b4299f42c61d3a919c8e86c38a85f40902226bNaseer Ahmed    return err;
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_unregister_buffer(gralloc_module_t const* module,
184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                              buffer_handle_t handle)
185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /*
191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * If the buffer has been mapped during a lock operation, it's time
192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * to un-map it. It's an error to be here with a locked buffer.
193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * NOTE: the framebuffer is handled differently and is never unmapped.
19405d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed     * Also base and base_metadata are reset.
195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     */
19605d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    return gralloc_unmap(module, handle);
197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint terminateBuffer(gralloc_module_t const* module,
200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    private_handle_t* hnd)
201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!module)
204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /*
207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * If the buffer has been mapped during a lock operation, it's time
208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     * to un-map it. It's an error to be here with a locked buffer.
20905d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed     * NOTE: the framebuffer is handled differently and is never unmapped.
21005d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed     * Also base and base_metadata are reset.
211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin     */
21205d37027d2422f070136f2117e9a4a6464714f25Naseer Ahmed    return gralloc_unmap(module, hnd);
213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinstatic int gralloc_map_and_invalidate (gralloc_module_t const* module,
216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                       buffer_handle_t handle, int usage)
217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int err = 0;
223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) {
225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (hnd->base == 0) {
226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            // we need to map for real
227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            pthread_mutex_t* const lock = &sMapLock;
228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            pthread_mutex_lock(lock);
229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            err = gralloc_map(module, handle);
230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            pthread_mutex_unlock(lock);
231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION and
233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->flags & private_handle_t::PRIV_FLAGS_CACHED) {
234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            //Invalidate if CPU reads in software and there are non-CPU
235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            //writers. No need to do this for the metadata buffer as it is
236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            //only read/written in software.
237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if ((usage & GRALLOC_USAGE_SW_READ_MASK) and
238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    (hnd->flags & private_handle_t::PRIV_FLAGS_NON_CPU_WRITER))
239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                IMemAlloc* memalloc = getAllocator(hnd->flags) ;
241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                err = memalloc->clean_buffer((void*)hnd->base,
242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                        hnd->size, hnd->offset, hnd->fd,
243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                        CACHE_INVALIDATE);
244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            //Mark the buffer to be flushed after CPU write.
246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            if (usage & GRALLOC_USAGE_SW_WRITE_MASK) {
247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        }
250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_lock(gralloc_module_t const* module,
256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 buffer_handle_t handle, int usage,
257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 void** vaddr)
259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int err = gralloc_map_and_invalidate(module, handle, usage);
263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!err)
264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        *vaddr = (void*)hnd->base;
265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_lock_ycbcr(gralloc_module_t const* module,
269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 buffer_handle_t handle, int usage,
270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                 struct android_ycbcr *ycbcr)
272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int err = gralloc_map_and_invalidate(module, handle, usage);
276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!err)
277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = getYUVPlaneInfo(hnd, ycbcr);
278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_unlock(gralloc_module_t const* module,
282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                   buffer_handle_t handle)
283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ATRACE_CALL();
285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return -EINVAL;
287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int err = 0;
289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    IMemAlloc* memalloc = getAllocator(hnd->flags);
292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = memalloc->clean_buffer((void*)hnd->base,
294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->size, hnd->offset, hnd->fd,
295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                CACHE_CLEAN);
296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wustatic bool isYUV(private_handle_t* hnd)
30586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu{
30686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    bool is_yuv;
30786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
30886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    switch (hnd->format) {
30986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        //Semiplanar
31086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
31186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
31286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
31386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: //Same as YCbCr_420_SP_VENUS
31486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
31586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_422_SP:
31686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
31786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_NV21_ZSL:
31886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_RAW10:
31986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_RAW16:
32086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        //Planar
32186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YV12:
32286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            is_yuv = true;
32386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        break;
32486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        //Unsupported formats
32586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_422_I:
32686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_422_I:
32786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
32886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        default:
32986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            is_yuv = false;
33086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            break;
33186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    }
33286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
33386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    return is_yuv;
33486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu}
33586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
33686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wustatic void ycbcr_to_flexible_layout(const struct android_ycbcr* ycbcr,
33786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        struct android_flex_layout* layout)
33886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu{
33986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->format = FLEX_FORMAT_YCbCr;
34086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->num_planes = 3;
34186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
34286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    for (uint32_t i = 0; i < layout->num_planes; i++) {
34386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].bits_per_component = 8;
34486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].bits_used = 8;
34586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].h_increment = 1;
34686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].v_increment = 1;
34786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].h_subsampling = 2;
34886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        layout->planes[i].v_subsampling = 2;
34986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    }
35086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
35186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[0].top_left = (uint8_t*)ycbcr->y;
35286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[0].component = FLEX_COMPONENT_Y;
35386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[0].v_increment = (int32_t)ycbcr->ystride;
35486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
35586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[1].top_left = (uint8_t*)ycbcr->cb;
35686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[1].component = FLEX_COMPONENT_Cb;
35786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[1].h_increment = (int32_t)ycbcr->chroma_step;
35886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[1].v_increment = (int32_t)ycbcr->cstride;
35986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
36086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[2].top_left = (uint8_t*)ycbcr->cr;
36186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[2].component = FLEX_COMPONENT_Cr;
36286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[2].h_increment = (int32_t)ycbcr->chroma_step;
36386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu    layout->planes[2].v_increment = (int32_t)ycbcr->cstride;
36486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu}
36586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint gralloc_perform(struct gralloc_module_t const* module,
367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    int operation, ... )
368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin{
369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int res = -EINVAL;
370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    va_list args;
371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!module)
372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        return res;
373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    va_start(args, operation);
375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    switch (operation) {
376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER:
377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int fd = va_arg(args, int);
379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                unsigned int size = va_arg(args, unsigned int);
380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                unsigned int offset = va_arg(args, unsigned int);
381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                void* base = va_arg(args, void*);
382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int width = va_arg(args, int);
383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int height = va_arg(args, int);
384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int format = va_arg(args, int);
385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                native_handle_t** handle = va_arg(args, native_handle_t**);
387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd = (private_handle_t*)native_handle_create(
388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    private_handle_t::sNumFds, private_handle_t::sNumInts());
389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->magic = private_handle_t::sMagic;
390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->fd = fd;
391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->flags =  private_handle_t::PRIV_FLAGS_USES_ION;
392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->size = size;
393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->offset = offset;
394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->base = uint64_t(base) + offset;
395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->gpuaddr = 0;
396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->width = width;
397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->height = height;
398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                hnd->format = format;
399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                *handle = (native_handle_t *)hnd;
400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                res = 0;
401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                break;
402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            }
404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_STRIDE:
405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int width   = va_arg(args, int);
407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int format  = va_arg(args, int);
408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *stride = va_arg(args, int *);
409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int alignedw = 0, alignedh = 0;
410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                        0, format, 0, alignedw, alignedh);
412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                *stride = alignedw;
413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                res = 0;
414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE:
417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *stride = va_arg(args, int *);
420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if (private_handle_t::validate(hnd)) {
421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    return res;
422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *stride = metadata->bufferDim.sliceWidth;
426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                } else {
427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *stride = hnd->width;
428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                res = 0;
430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE:
433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *stride = va_arg(args, int *);
436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *height = va_arg(args, int *);
437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if (private_handle_t::validate(hnd)) {
438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    return res;
439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *stride = metadata->bufferDim.sliceWidth;
443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *height = metadata->bufferDim.sliceHeight;
444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                } else {
445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *stride = hnd->width;
446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *height = hnd->height;
447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                res = 0;
449054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
450054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
451054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES:
452054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
453054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int width   = va_arg(args, int);
454054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int height  = va_arg(args, int);
455054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int format  = va_arg(args, int);
456054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int usage   = va_arg(args, int);
457054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *alignedWidth = va_arg(args, int *);
458054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *alignedHeight = va_arg(args, int *);
459054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *tileEnabled = va_arg(args,int *);
460054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                *tileEnabled = isMacroTileEnabled(format, usage);
461054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
462054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                        height, format, usage, *alignedWidth, *alignedHeight);
463054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                res = 0;
464054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
465054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
466054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE:
467054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
468054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
469054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *color_space = va_arg(args, int *);
470054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if (private_handle_t::validate(hnd)) {
471054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    return res;
472054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
473054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
474054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if(metadata && metadata->operation & UPDATE_COLOR_SPACE) {
475054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *color_space = metadata->colorSpace;
476054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    res = 0;
477054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
478054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
479054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
480054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO:
481054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
482054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
483054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *);
484054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if (!private_handle_t::validate(hnd)) {
485054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    res = getYUVPlaneInfo(hnd, ycbcr);
486054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
487054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
488054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
489054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO:
490054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            {
491054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
492054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                int *map_secure_buffer = va_arg(args, int *);
493054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if (private_handle_t::validate(hnd)) {
494054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    return res;
495054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
496054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
497054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                if(metadata && metadata->operation & MAP_SECURE_BUFFER) {
498054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *map_secure_buffer = metadata->mapSecureBuffer;
499054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    res = 0;
500054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                } else {
501054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                    *map_secure_buffer = 0;
502054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                }
503054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            } break;
504054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
50586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_REAL_MODULE_API_VERSION_MINOR:
50686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
50786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outMinorVersion = va_arg(args, int*);
50886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outMinorVersion = 1; // GRALLOC_MODULE_API_VERSION_0_1
50986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
51086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
51186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_SET_USAGES:
51286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
51386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
51486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto producerUsage = va_arg(args, int);
51586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto consumerUsage = va_arg(args, int);
51686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                hnd->producer_usage = producerUsage;
51786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                hnd->consumer_usage = consumerUsage;
51886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
51986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
52086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_DIMENSIONS:
52186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
52286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
52386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outWidth = va_arg(args, int*);
52486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outHeight = va_arg(args, int*);
52586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outWidth = hnd->original_width;
52686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outHeight = hnd->height;
52786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
52886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
52986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_FORMAT:
53086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
53186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
53286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outFormat = va_arg(args, int*);
53386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outFormat = hnd->original_format;
53486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
53586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
53686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_PRODUCER_USAGE:
53786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
53886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
53986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outUsage = va_arg(args, int*);
54086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outUsage = hnd->producer_usage;
54186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
54286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
54386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_CONSUMER_USAGE:
54486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
54586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
54686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outUsage = va_arg(args, int*);
54786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outUsage = hnd->consumer_usage;
54886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
54986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
55086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_BACKING_STORE:
55186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
55286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
55386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outBackingStore = va_arg(args, uint64_t*);
55486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outBackingStore = hnd->backing_store;
55586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
55686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
55786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_NUM_FLEX_PLANES:
55886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
55986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
56086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outNumFlexPlanes = va_arg(args, int*);
56186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
56286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                (void) hnd;
56386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                // for simpilicity
56486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outNumFlexPlanes = 4;
56586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
56686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
56786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_STRIDE:
56886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
56986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
57086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outStride = va_arg(args, int*);
57186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                *outStride = hnd->width;
57286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
57386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
57486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu        case GRALLOC1_ADAPTER_PERFORM_LOCK_FLEX:
57586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            {
57686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
57786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto producerUsage = va_arg(args, int);
57886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto consumerUsage = va_arg(args, int);
57986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto left = va_arg(args, int);
58086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto top = va_arg(args, int);
58186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto width = va_arg(args, int);
58286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto height = va_arg(args, int);
58386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto outLayout = va_arg(args, android_flex_layout*);
58486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                // always -1
58586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                auto acquireFence = va_arg(args, int);
58686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                (void) acquireFence;
58786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
58886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                // TODO lock RGB as a flexible format
58986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                if (!isYUV(hnd)) {
59086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                    return -EINVAL;
59186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                }
59286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
59386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                struct android_ycbcr ycbcr;
59486384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                res = gralloc_lock_ycbcr(module, hnd,
59586384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                        producerUsage | consumerUsage,
59686384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                        left, top, width, height, &ycbcr);
59786384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                if (res != 0) {
59886384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                    return res;
59986384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                }
60086384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
60186384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu                ycbcr_to_flexible_layout(&ycbcr, outLayout);
60286384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu            } break;
60386384cfc3e03e37fcff03900d2150e373e9ed864Chia-I Wu
604054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        default:
605054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            break;
606054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
607054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    va_end(args);
608054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return res;
609054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
610