1d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*
2d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Copyright (C) 2008 The Android Open Source Project
38dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
4d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *
5d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
6d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * you may not use this file except in compliance with the License.
7d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * You may obtain a copy of the License at
8d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *
9d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
10d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin *
11d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * Unless required by applicable law or agreed to in writing, software
12d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
13d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * See the License for the specific language governing permissions and
15d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin * limitations under the License.
16d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin */
17d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
18d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
19d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <limits.h>
20d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <errno.h>
21d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <pthread.h>
22d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <unistd.h>
23d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <string.h>
24d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <stdarg.h>
25d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
26d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/mman.h>
27d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/stat.h>
28d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/types.h>
29d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <sys/ioctl.h>
30d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
31d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <cutils/log.h>
32d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <cutils/atomic.h>
33d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <utils/Trace.h>
34d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
35d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <hardware/hardware.h>
36d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <hardware/gralloc.h>
37d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
387a6794690431923c9d36d0a54ded65c17847114bChia-I Wu#include <gralloc1-adapter.h>
397a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
40d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "gralloc_priv.h"
41d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "gr.h"
42d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "alloc_controller.h"
43d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include "memalloc.h"
44d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin#include <qdMetaData.h>
45d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
46d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
47d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinusing namespace gralloc;
48d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/
49d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
50d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin// Return the type of allocator -
51d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin// these are used for mapping/unmapping
52d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic IMemAlloc* getAllocator(int flags)
53d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
54d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    IMemAlloc* memalloc;
55d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    IAllocController* alloc_ctrl = IAllocController::getInstance();
56d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    memalloc = alloc_ctrl->getAllocator(flags);
57d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return memalloc;
58d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
59d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
608dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmedstatic int gralloc_map_metadata(buffer_handle_t handle) {
618dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    private_handle_t* hnd = (private_handle_t*)handle;
628dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    hnd->base_metadata = 0;
638dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
648dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    void *mappedAddress = MAP_FAILED;
658dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    unsigned int size = 0;
668dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
678dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        mappedAddress = MAP_FAILED;
688dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
698dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        int ret = memalloc->map_buffer(&mappedAddress, size,
708dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed                                       hnd->offset_metadata, hnd->fd_metadata);
718dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        if(ret || mappedAddress == MAP_FAILED) {
728dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed            ALOGE("Could not mmap metadata for handle %p, fd=%d (%s)",
738dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed                  hnd, hnd->fd_metadata, strerror(errno));
748dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed            return -errno;
758dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        }
768dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        hnd->base_metadata = uint64_t(mappedAddress) + hnd->offset_metadata;
778dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    }
788dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    return 0;
798dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed}
808dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed
81d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int gralloc_map(gralloc_module_t const* module,
82d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                       buffer_handle_t handle)
83d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
84d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
85d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!module)
86d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
87d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
88d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
89d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    unsigned int size = 0;
90d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = 0;
91d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
92d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    void *mappedAddress = MAP_FAILED;
93d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    hnd->base = 0;
94d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
95d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    // Dont map framebuffer and secure buffers
96d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&
97d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {
98d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        size = hnd->size;
99d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        err = memalloc->map_buffer(&mappedAddress, size,
100d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                                       hnd->offset, hnd->fd);
101d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        if(err || mappedAddress == MAP_FAILED) {
102d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            ALOGE("Could not mmap handle %p, fd=%d (%s)",
103d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  handle, hnd->fd, strerror(errno));
104d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            return -errno;
105d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        }
106d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
107d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        hnd->base = uint64_t(mappedAddress) + hnd->offset;
1088dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    } else {
1098dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        // Cannot map secure buffers or framebuffers, but still need to map
1108dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        // metadata for secure buffers.
1118dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        // If mapping a secure buffers fails, the framework needs to get
1128dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        // an error code.
1138dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        err = -EACCES;
114d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
115d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
116d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    //Allow mapping of metadata for all buffers including secure ones, but not
117d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    //of framebuffer
1188dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    int metadata_err = gralloc_map_metadata(handle);
1198dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    if (!err) {
1208dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed        err = metadata_err;
121d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
1228dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    return err;
123d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
124d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
125d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int gralloc_unmap(gralloc_module_t const* module,
126d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                         buffer_handle_t handle)
127d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
128d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
129d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = -EINVAL;
130d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!module)
131d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return err;
132d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
133d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
134d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    IMemAlloc* memalloc = getAllocator(hnd->flags) ;
135d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!memalloc)
136d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return err;
137d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
138d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(hnd->base) {
139d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset);
140d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        if (err) {
141d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            ALOGE("Could not unmap memory at address %p, %s", (void*) hnd->base,
142d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    strerror(errno));
143d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            return -errno;
144d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        }
145d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        hnd->base = 0;
146d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
147d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
148d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(hnd->base_metadata) {
149d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        unsigned int size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
150d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        err = memalloc->unmap_buffer((void*)hnd->base_metadata,
151d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                size, hnd->offset_metadata);
152d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        if (err) {
153d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            ALOGE("Could not unmap memory at address %p, %s",
154d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    (void*) hnd->base_metadata, strerror(errno));
155d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            return -errno;
156d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        }
157d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        hnd->base_metadata = 0;
158d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
159d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
160d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return 0;
161d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
162d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
163d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/
164d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
165d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER;
166d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
167d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/
168d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
169d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_register_buffer(gralloc_module_t const* module,
170d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                            buffer_handle_t handle)
171d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
172d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
173d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
174d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
175de3ad9074f6d2039be5e5a21145641b0ea260985Eino-Ville Talvala
176b7d25ca64e8e64d0fcb6f81e9dd14bb1dd6b96d2Chia-I Wu    int err =  gralloc_map(module, handle);
177b7d25ca64e8e64d0fcb6f81e9dd14bb1dd6b96d2Chia-I Wu    /* Do not fail register_buffer for secure buffers*/
178b7d25ca64e8e64d0fcb6f81e9dd14bb1dd6b96d2Chia-I Wu    if (err == -EACCES)
179b7d25ca64e8e64d0fcb6f81e9dd14bb1dd6b96d2Chia-I Wu        err = 0;
1808dde137e441eae475a414dc575e33585d7d6413eNaseer Ahmed    return err;
181d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
182d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
183d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_unregister_buffer(gralloc_module_t const* module,
184d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                              buffer_handle_t handle)
185d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
186d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
187d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
188d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
189d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
190d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    /*
191d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * If the buffer has been mapped during a lock operation, it's time
192d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * to un-map it. It's an error to be here with a locked buffer.
193d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * NOTE: the framebuffer is handled differently and is never unmapped.
194d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * Also base and base_metadata are reset.
195d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     */
196d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return gralloc_unmap(module, handle);
197d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
198d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
199d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint terminateBuffer(gralloc_module_t const* module,
200d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    private_handle_t* hnd)
201d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
202d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
203d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!module)
204d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
205d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
206d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    /*
207d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * If the buffer has been mapped during a lock operation, it's time
208d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * to un-map it. It's an error to be here with a locked buffer.
209d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * NOTE: the framebuffer is handled differently and is never unmapped.
210d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     * Also base and base_metadata are reset.
211d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin     */
212d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return gralloc_unmap(module, hnd);
213d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
214d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
215d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinstatic int gralloc_map_and_invalidate (gralloc_module_t const* module,
216d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                                       buffer_handle_t handle, int usage)
217d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
218d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
219d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
220d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
221d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
222d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = 0;
223d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
224d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) {
225d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        if (hnd->base == 0) {
226d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            // we need to map for real
227d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            pthread_mutex_t* const lock = &sMapLock;
228d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            pthread_mutex_lock(lock);
229d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            err = gralloc_map(module, handle);
230d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            pthread_mutex_unlock(lock);
231d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        }
232d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION and
233d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                hnd->flags & private_handle_t::PRIV_FLAGS_CACHED) {
234d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            //Invalidate if CPU reads in software and there are non-CPU
235d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            //writers. No need to do this for the metadata buffer as it is
236d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            //only read/written in software.
237d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            if ((usage & GRALLOC_USAGE_SW_READ_MASK) and
238d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    (hnd->flags & private_handle_t::PRIV_FLAGS_NON_CPU_WRITER))
239d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
240d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                IMemAlloc* memalloc = getAllocator(hnd->flags) ;
241d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                err = memalloc->clean_buffer((void*)hnd->base,
242d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        hnd->size, hnd->offset, hnd->fd,
243d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        CACHE_INVALIDATE);
244d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            }
245d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            //Mark the buffer to be flushed after CPU write.
246d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            if (usage & GRALLOC_USAGE_SW_WRITE_MASK) {
247d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
248d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            }
249d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        }
250d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
251d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
252d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return err;
253d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
254d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
255d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_lock(gralloc_module_t const* module,
256d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 buffer_handle_t handle, int usage,
257d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
258d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 void** vaddr)
259d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
260d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
261d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
262d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = gralloc_map_and_invalidate(module, handle, usage);
263d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!err)
264d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        *vaddr = (void*)hnd->base;
265d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return err;
266d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
267d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
268d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_lock_ycbcr(gralloc_module_t const* module,
269d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 buffer_handle_t handle, int usage,
270d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
271d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                 struct android_ycbcr *ycbcr)
272d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
273d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
274d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
275d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = gralloc_map_and_invalidate(module, handle, usage);
276d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!err)
277d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        err = getYUVPlaneInfo(hnd, ycbcr);
278d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return err;
279d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
280d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
281d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_unlock(gralloc_module_t const* module,
282d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                   buffer_handle_t handle)
283d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
284d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    ATRACE_CALL();
285d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (!module || private_handle_t::validate(handle) < 0)
286d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return -EINVAL;
287d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
288d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int err = 0;
289d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    private_handle_t* hnd = (private_handle_t*)handle;
290d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
291d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    IMemAlloc* memalloc = getAllocator(hnd->flags);
292d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
293d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        err = memalloc->clean_buffer((void*)hnd->base,
294d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                hnd->size, hnd->offset, hnd->fd,
295d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                CACHE_CLEAN);
296d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
297d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
298d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
299d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return err;
300d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
301d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
302d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin/*****************************************************************************/
303d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
3047a6794690431923c9d36d0a54ded65c17847114bChia-I Wustatic bool isYUV(private_handle_t* hnd)
3057a6794690431923c9d36d0a54ded65c17847114bChia-I Wu{
3067a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    bool is_yuv;
3077a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3087a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    switch (hnd->format) {
3097a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        //Semiplanar
3107a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
3117a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
3127a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
3137a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: //Same as YCbCr_420_SP_VENUS
3147a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
3157a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_422_SP:
3167a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
3177a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_NV21_ZSL:
3187a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_RAW10:
3197a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_RAW16:
3207a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        //Planar
3217a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YV12:
3227a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            is_yuv = true;
3237a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        break;
3247a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        //Unsupported formats
3257a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_422_I:
3267a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCrCb_422_I:
3277a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
3287a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        default:
3297a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            is_yuv = false;
3307a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            break;
3317a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    }
3327a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3337a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    return is_yuv;
3347a6794690431923c9d36d0a54ded65c17847114bChia-I Wu}
3357a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3367a6794690431923c9d36d0a54ded65c17847114bChia-I Wustatic void ycbcr_to_flexible_layout(const struct android_ycbcr* ycbcr,
3377a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        struct android_flex_layout* layout)
3387a6794690431923c9d36d0a54ded65c17847114bChia-I Wu{
3397a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->format = FLEX_FORMAT_YCbCr;
3407a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->num_planes = 3;
3417a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3427a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    for (uint32_t i = 0; i < layout->num_planes; i++) {
3437a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].bits_per_component = 8;
3447a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].bits_used = 8;
3457a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].h_increment = 1;
3467a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].v_increment = 1;
3477a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].h_subsampling = 2;
3487a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        layout->planes[i].v_subsampling = 2;
3497a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    }
3507a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3517a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[0].top_left = (uint8_t*)ycbcr->y;
3527a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[0].component = FLEX_COMPONENT_Y;
3537a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[0].v_increment = (int32_t)ycbcr->ystride;
3547a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3557a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[1].top_left = (uint8_t*)ycbcr->cb;
3567a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[1].component = FLEX_COMPONENT_Cb;
3577a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[1].h_increment = (int32_t)ycbcr->chroma_step;
3587a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[1].v_increment = (int32_t)ycbcr->cstride;
3597a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
3607a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[2].top_left = (uint8_t*)ycbcr->cr;
3617a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[2].component = FLEX_COMPONENT_Cr;
3627a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[2].h_increment = (int32_t)ycbcr->chroma_step;
3637a6794690431923c9d36d0a54ded65c17847114bChia-I Wu    layout->planes[2].v_increment = (int32_t)ycbcr->cstride;
3647a6794690431923c9d36d0a54ded65c17847114bChia-I Wu}
3657a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
366d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjinint gralloc_perform(struct gralloc_module_t const* module,
367d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    int operation, ... )
368d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin{
369d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    int res = -EINVAL;
370d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    va_list args;
371d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    if(!module)
372d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        return res;
373d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
374d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    va_start(args, operation);
375d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    switch (operation) {
376d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER:
377d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
378d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int fd = va_arg(args, int);
379d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                unsigned int size = va_arg(args, unsigned int);
380d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                unsigned int offset = va_arg(args, unsigned int);
381d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                void* base = va_arg(args, void*);
382d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int width = va_arg(args, int);
383d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int height = va_arg(args, int);
384d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int format = va_arg(args, int);
385d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
386d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                native_handle_t** handle = va_arg(args, native_handle_t**);
387d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd = (private_handle_t*)native_handle_create(
388d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    private_handle_t::sNumFds, private_handle_t::sNumInts());
389d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (hnd) {
390d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->magic = private_handle_t::sMagic;
391d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->fd = fd;
392d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->flags =  private_handle_t::PRIV_FLAGS_USES_ION;
393d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->size = size;
394d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->offset = offset;
395d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->base = uint64_t(base) + offset;
396d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->gpuaddr = 0;
397d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->width = width;
398d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->height = height;
399d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  hnd->format = format;
400d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  *handle = (native_handle_t *)hnd;
401d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                  res = 0;
402d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
403d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                break;
404d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
405d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            }
406d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_STRIDE:
407d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
408d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int width   = va_arg(args, int);
409d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int format  = va_arg(args, int);
410d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *stride = va_arg(args, int *);
411d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int alignedw = 0, alignedh = 0;
412d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
413d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        0, format, 0, alignedw, alignedh);
414d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *stride = alignedw;
415d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                res = 0;
416d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
417d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
418d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE:
419d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
420d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                const private_handle_t* hnd =  va_arg(args, private_handle_t*);
421d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *stride = va_arg(args, int *);
422d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (private_handle_t::validate(hnd)) {
423d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    return res;
424d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
425d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
426d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int alignedw = 0, alignedh = 0;
427d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(hnd, alignedw, alignedh);
428d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *stride = alignedw;
429d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
430d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                res = 0;
431d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
432d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
433d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE:
434d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
435d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                const private_handle_t* hnd =  va_arg(args, private_handle_t*);
436d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *stride = va_arg(args, int *);
437d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *height = va_arg(args, int *);
438d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (private_handle_t::validate(hnd)) {
439d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    return res;
440d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
441d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
442d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int alignedw = 0, alignedh = 0;
443d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(hnd, alignedw, alignedh);
444d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *stride = alignedw;
445d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *height = alignedh;
446d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
447d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                res = 0;
448d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
449d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
450d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES:
451d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
452d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int width   = va_arg(args, int);
453d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int height  = va_arg(args, int);
454d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int format  = va_arg(args, int);
455d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int usage   = va_arg(args, int);
456d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *alignedWidth = va_arg(args, int *);
457d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *alignedHeight = va_arg(args, int *);
458d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *tileEnabled = va_arg(args,int *);
459d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *tileEnabled = isUBwcEnabled(format, usage) ||
460d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                               isMacroTileEnabled(format, usage);
461d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
462d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        height, format, usage, *alignedWidth, *alignedHeight);
463d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                res = 0;
464d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
465d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
466d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE:
467d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
468d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
469d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *color_space = va_arg(args, int *);
470d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (private_handle_t::validate(hnd)) {
471d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    return res;
472d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
473d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
474d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if(metadata && metadata->operation & UPDATE_COLOR_SPACE) {
475d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    *color_space = metadata->colorSpace;
476d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    res = 0;
477d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
478d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
479d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
480d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO:
481d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
482d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
483d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *);
484d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (!private_handle_t::validate(hnd)) {
485d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    res = getYUVPlaneInfo(hnd, ycbcr);
486d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
487d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
488d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
489d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_MAP_SECURE_BUFFER_INFO:
490d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
491d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
492d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *map_secure_buffer = va_arg(args, int *);
493d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (private_handle_t::validate(hnd)) {
494d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    return res;
495d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
496d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
497d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if(metadata && metadata->operation & MAP_SECURE_BUFFER) {
498d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    *map_secure_buffer = metadata->mapSecureBuffer;
499d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    res = 0;
500d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                } else {
501d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    *map_secure_buffer = 0;
502d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
503d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
504d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
505d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_UBWC_FLAG:
506d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
507d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
508d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                int *flag = va_arg(args, int *);
509d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (private_handle_t::validate(hnd)) {
510d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    return res;
511d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
512d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                *flag = hnd->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED;
513d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
514d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (metadata && (metadata->operation & LINEAR_FORMAT)) {
515d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    *flag = 0;
516d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
517d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                res = 0;
518d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
519d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
520d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_RGB_DATA_ADDRESS:
521d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
522d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd = va_arg(args, private_handle_t*);
523d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                void** rgb_data = va_arg(args, void**);
524d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (!private_handle_t::validate(hnd)) {
525d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    res = getRgbDataAddress(hnd, rgb_data);
526d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
527d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
528d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
529d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_GET_IGC:
530d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
531d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd = va_arg(args, private_handle_t*);
532d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                uint32_t *igc = va_arg(args, uint32_t *);
533d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                if (!private_handle_t::validate(hnd) && igc) {
534d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
535d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    if (metadata && (metadata->operation & SET_IGC)) {
536d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        *igc = metadata->igc;
537d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                        res = 0;
538d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                    }
539d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
540d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
541d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
542d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_SET_IGC:
5431c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed            res = 0;
5441c83c9c682ae9a6a43bd7e1a199355333c70a8cdNaseer Ahmed            break;
545d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin
546d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        case GRALLOC_MODULE_PERFORM_SET_SINGLE_BUFFER_MODE:
547d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            {
548d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                private_handle_t* hnd =  va_arg(args, private_handle_t*);
549d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                uint32_t *enable = va_arg(args, uint32_t*);
550f31e45897c5f3d981922222644b9778af2302474Patrick Tjin                if (!private_handle_t::validate(hnd)) {
551f31e45897c5f3d981922222644b9778af2302474Patrick Tjin                    setMetaData(hnd, SET_SINGLE_BUFFER_MODE, enable);
552f31e45897c5f3d981922222644b9778af2302474Patrick Tjin                    res = 0;
553d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin                }
554d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            } break;
5557a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5567a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_REAL_MODULE_API_VERSION_MINOR:
5577a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5587a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outMinorVersion = va_arg(args, int*);
5597a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outMinorVersion = 1; // GRALLOC_MODULE_API_VERSION_0_1
5607a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
5617a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5627a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_SET_USAGES:
5637a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5647a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
5657a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto producerUsage = va_arg(args, int);
5667a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto consumerUsage = va_arg(args, int);
5677a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                hnd->producer_usage = producerUsage;
5687a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                hnd->consumer_usage = consumerUsage;
5697a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
5707a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5717a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_DIMENSIONS:
5727a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5737a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
5747a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outWidth = va_arg(args, int*);
5757a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outHeight = va_arg(args, int*);
5767a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outWidth = hnd->original_width;
5777a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outHeight = hnd->height;
5787a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
5797a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5807a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_FORMAT:
5817a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5827a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
5837a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outFormat = va_arg(args, int*);
5847a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outFormat = hnd->original_format;
5857a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
5867a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5877a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_PRODUCER_USAGE:
5887a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5897a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
5907a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outUsage = va_arg(args, int*);
5917a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outUsage = hnd->producer_usage;
5927a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
5937a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
5947a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_CONSUMER_USAGE:
5957a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
5967a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
5977a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outUsage = va_arg(args, int*);
5987a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outUsage = hnd->consumer_usage;
5997a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
6007a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6017a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_BACKING_STORE:
6027a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
6037a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
6047a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outBackingStore = va_arg(args, uint64_t*);
6057a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outBackingStore = hnd->backing_store;
6067a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
6077a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6087a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_NUM_FLEX_PLANES:
6097a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
6107a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
6117a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outNumFlexPlanes = va_arg(args, int*);
6127a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6137a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                (void) hnd;
6147a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                // for simpilicity
6157a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outNumFlexPlanes = 4;
6167a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
6177a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6187a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_GET_STRIDE:
6197a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
6207a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
6217a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outStride = va_arg(args, int*);
6227a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                *outStride = hnd->width;
6237a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
6247a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6257a6794690431923c9d36d0a54ded65c17847114bChia-I Wu        case GRALLOC1_ADAPTER_PERFORM_LOCK_FLEX:
6267a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            {
6277a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto hnd =  va_arg(args, private_handle_t*);
6287a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto producerUsage = va_arg(args, int);
6297a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto consumerUsage = va_arg(args, int);
6307a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto left = va_arg(args, int);
6317a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto top = va_arg(args, int);
6327a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto width = va_arg(args, int);
6337a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto height = va_arg(args, int);
6347a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto outLayout = va_arg(args, android_flex_layout*);
6357a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                // always -1
6367a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                auto acquireFence = va_arg(args, int);
6377a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                (void) acquireFence;
6387a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6397a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                // TODO lock RGB as a flexible format
6407a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                if (!isYUV(hnd)) {
6417a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                    return -EINVAL;
6427a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                }
6437a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6447a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                struct android_ycbcr ycbcr;
6457a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                res = gralloc_lock_ycbcr(module, hnd,
6467a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                        producerUsage | consumerUsage,
6477a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                        left, top, width, height, &ycbcr);
6487a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                if (res != 0) {
6497a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                    return res;
6507a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                }
6517a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
6527a6794690431923c9d36d0a54ded65c17847114bChia-I Wu                ycbcr_to_flexible_layout(&ycbcr, outLayout);
6537a6794690431923c9d36d0a54ded65c17847114bChia-I Wu            } break;
6547a6794690431923c9d36d0a54ded65c17847114bChia-I Wu
655d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin        default:
656d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin            break;
657d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    }
658d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    va_end(args);
659d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin    return res;
660d68a2e45260f864503d7bd6da93fd29589afd89ePatrick Tjin}
661