1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2008 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <limits.h> 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h> 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <pthread.h> 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <unistd.h> 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <string.h> 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdarg.h> 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/mman.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/stat.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/types.h> 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/ioctl.h> 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h> 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/atomic.h> 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/hardware.h> 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/gralloc.h> 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gralloc_priv.h" 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gr.h" 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "alloc_controller.h" 39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "memalloc.h" 40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <qdMetaData.h> 41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace gralloc; 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/ 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Return the type of allocator - 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// these are used for mapping/unmapping 47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic IMemAlloc* getAllocator(int flags) 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IMemAlloc* memalloc; 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IAllocController* alloc_ctrl = IAllocController::getInstance(); 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson memalloc = alloc_ctrl->getAllocator(flags); 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return memalloc; 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int gralloc_map(gralloc_module_t const* module, 56a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed buffer_handle_t handle) 57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 5815c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if(!module) 5915c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R return -EINVAL; 6015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void *mappedAddress; 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) && 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) { 6592e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah unsigned int size = hnd->size; 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IMemAlloc* memalloc = getAllocator(hnd->flags) ; 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int err = memalloc->map_buffer(&mappedAddress, size, 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->offset, hnd->fd); 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(err || mappedAddress == MAP_FAILED) { 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Could not mmap handle %p, fd=%d (%s)", 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson handle, hnd->fd, strerror(errno)); 72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base = 0; 73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 7692e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah hnd->base = uint64_t(mappedAddress) + hnd->offset; 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mappedAddress = MAP_FAILED; 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->map_buffer(&mappedAddress, size, 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->offset_metadata, hnd->fd_metadata); 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(err || mappedAddress == MAP_FAILED) { 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Could not mmap handle %p, fd=%d (%s)", 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson handle, hnd->fd_metadata, strerror(errno)); 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base_metadata = 0; 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -errno; 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 8792e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah hnd->base_metadata = uint64_t(mappedAddress) + hnd->offset_metadata; 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int gralloc_unmap(gralloc_module_t const* module, 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buffer_handle_t handle) 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 9515c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if(!module) 9615c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R return -EINVAL; 9715c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R 98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) { 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int err = -EINVAL; 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void* base = (void*)hnd->base; 10292e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah unsigned int size = hnd->size; 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IMemAlloc* memalloc = getAllocator(hnd->flags) ; 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(memalloc != NULL) { 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->unmap_buffer(base, size, hnd->offset); 106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (err) { 107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Could not unmap memory at address %p", base); 108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson base = (void*)hnd->base_metadata; 110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->unmap_buffer(base, size, hnd->offset_metadata); 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (err) { 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Could not unmap memory at address %p", base); 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson /* need to initialize the pointer to NULL otherwise unmapping for that 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * buffer happens twice which leads to crash */ 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base = 0; 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base_metadata = 0; 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/ 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER; 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/ 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_register_buffer(gralloc_module_t const* module, 131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buffer_handle_t handle) 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 13315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // In this implementation, we don't need to do anything here 137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson /* NOTE: we need to initialize the buffer as not mapped/not locked 139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * because it shouldn't when this function is called the first time 140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * in a new process. Ideally these flags shouldn't be part of the 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * handle, but instead maintained in the kernel or at least 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * out-of-line 143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base = 0; 147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base_metadata = 0; 148a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed int err = gralloc_map(module, handle); 149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (err) { 150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: gralloc_map failed", __FUNCTION__); 151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return err; 152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_unregister_buffer(gralloc_module_t const* module, 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buffer_handle_t handle) 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 16015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson /* 164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * If the buffer has been mapped during a lock operation, it's time 165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * to un-map it. It's an error to be here with a locked buffer. 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * NOTE: the framebuffer is handled differently and is never unmapped. 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->base != 0) { 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson gralloc_unmap(module, handle); 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base = 0; 175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->base_metadata = 0; 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint terminateBuffer(gralloc_module_t const* module, 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd) 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 18215c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if(!module) 18315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R return -EINVAL; 18415c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson /* 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * If the buffer has been mapped during a lock operation, it's time 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * to un-map it. It's an error to be here with a locked buffer. 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->base != 0) { 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // this buffer was mapped, unmap it now 192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->flags & (private_handle_t::PRIV_FLAGS_USES_PMEM | 193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP | 194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t::PRIV_FLAGS_USES_ASHMEM | 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t::PRIV_FLAGS_USES_ION)) { 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson gralloc_unmap(module, hnd); 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("terminateBuffer: unmapping a non pmem/ashmem buffer flags = 0x%x", 199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags); 200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson gralloc_unmap(module, hnd); 201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 207a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedstatic int gralloc_map_and_invalidate (gralloc_module_t const* module, 208a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed buffer_handle_t handle, int usage) 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 21015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int err = 0; 214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) { 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->base == 0) { 217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // we need to map for real 218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson pthread_mutex_t* const lock = &sMapLock; 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson pthread_mutex_lock(lock); 220a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed err = gralloc_map(module, handle); 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson pthread_mutex_unlock(lock); 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) { 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Invalidate if reading in software. No need to do this for the 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //metadata buffer as it is only read/written in software. 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IMemAlloc* memalloc = getAllocator(hnd->flags) ; 227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->clean_buffer((void*)hnd->base, 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->size, hnd->offset, hnd->fd, 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson CACHE_INVALIDATE); 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (usage & GRALLOC_USAGE_SW_WRITE_MASK) { 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Mark the buffer to be flushed after cpu read/write 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags |= private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH; 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return err; 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 241a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedint gralloc_lock(gralloc_module_t const* module, 242a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed buffer_handle_t handle, int usage, 243a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed int /*l*/, int /*t*/, int /*w*/, int /*h*/, 244a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed void** vaddr) 245a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed{ 246a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed private_handle_t* hnd = (private_handle_t*)handle; 247a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed int err = gralloc_map_and_invalidate(module, handle, usage); 248a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed if(!err) 249a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed *vaddr = (void*)hnd->base; 250a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed return err; 251a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed} 252a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed 253a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedint gralloc_lock_ycbcr(gralloc_module_t const* module, 254a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed buffer_handle_t handle, int usage, 255a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed int /*l*/, int /*t*/, int /*w*/, int /*h*/, 256a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed struct android_ycbcr *ycbcr) 257a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed{ 258a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed private_handle_t* hnd = (private_handle_t*)handle; 259a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed int err = gralloc_map_and_invalidate(module, handle, usage); 2600a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed if(!err) 2610a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed err = getYUVPlaneInfo(hnd, ycbcr); 262a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed return err; 263a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed} 264a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_unlock(gralloc_module_t const* module, 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson buffer_handle_t handle) 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 26815c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -EINVAL; 27015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int err = 0; 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)handle; 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) { 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IMemAlloc* memalloc = getAllocator(hnd->flags); 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) { 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->clean_buffer((void*)hnd->base, 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->size, hnd->offset, hnd->fd, 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson CACHE_CLEAN_AND_INVALIDATE); 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if(hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) { 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags &= ~private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH; 283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Probably a round about way to do this, but this avoids adding new 285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //flags 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson err = memalloc->clean_buffer((void*)hnd->base, 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->size, hnd->offset, hnd->fd, 288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson CACHE_INVALIDATE); 289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return err; 293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/ 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_perform(struct gralloc_module_t const* module, 298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int operation, ... ) 299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int res = -EINVAL; 301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_list args; 30215c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R if(!module) 30315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R return res; 30415c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R 305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_start(args, operation); 306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch (operation) { 307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: 308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { 309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int fd = va_arg(args, int); 31092e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah unsigned int size = va_arg(args, unsigned int); 31192e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah unsigned int offset = va_arg(args, unsigned int); 312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void* base = va_arg(args, void*); 313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int width = va_arg(args, int); 314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int height = va_arg(args, int); 315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int format = va_arg(args, int); 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson native_handle_t** handle = va_arg(args, native_handle_t**); 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = (private_handle_t*)native_handle_create( 31992e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah private_handle_t::sNumFds, private_handle_t::sNumInts()); 320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->magic = private_handle_t::sMagic; 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->fd = fd; 322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->flags = private_handle_t::PRIV_FLAGS_USES_ION; 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->size = size; 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->offset = offset; 32592e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah hnd->base = uint64_t(base) + offset; 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->gpuaddr = 0; 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->width = width; 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->height = height; 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->format = format; 330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *handle = (native_handle_t *)hnd; 331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson res = 0; 332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef QCOM_BSP 336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case GRALLOC_MODULE_PERFORM_UPDATE_BUFFER_GEOMETRY: 337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { 338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int width = va_arg(args, int); 339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int height = va_arg(args, int); 340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int format = va_arg(args, int); 341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = va_arg(args, private_handle_t*); 342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (private_handle_t::validate(hnd)) { 343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return res; 344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->width = width; 346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->height = height; 347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hnd->format = format; 348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson res = 0; 349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 350ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case GRALLOC_MODULE_PERFORM_GET_STRIDE: 353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { 354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int width = va_arg(args, int); 355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int format = va_arg(args, int); 356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int *stride = va_arg(args, int *); 357a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int alignedw = 0, alignedh = 0; 358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 0, format, false, alignedw, alignedh); 360a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson *stride = alignedw; 361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson res = 0; 362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } break; 363a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE: 365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { 366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson private_handle_t* hnd = va_arg(args, private_handle_t*); 367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int *stride = va_arg(args, int *); 368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (private_handle_t::validate(hnd)) { 369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return res; 370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *stride = metadata->bufferDim.sliceWidth; 374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *stride = hnd->width; 376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson res = 0; 378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } break; 379a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 380ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE: 381ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal { 382ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal private_handle_t* hnd = va_arg(args, private_handle_t*); 383ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal int *stride = va_arg(args, int *); 384ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal int *height = va_arg(args, int *); 385ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal if (private_handle_t::validate(hnd)) { 386ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal return res; 387ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal } 388ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 389ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 390ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal *stride = metadata->bufferDim.sliceWidth; 391ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal *height = metadata->bufferDim.sliceHeight; 392ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal } else { 393ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal *stride = hnd->width; 394ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal *height = hnd->height; 395ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal } 396ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal res = 0; 397ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal } break; 398ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal 399a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES: 400a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson { 401a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int width = va_arg(args, int); 402a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int height = va_arg(args, int); 403a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int format = va_arg(args, int); 404a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int usage = va_arg(args, int); 405a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int *alignedWidth = va_arg(args, int *); 406a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int *alignedHeight = va_arg(args, int *); 407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int *tileEnabled = va_arg(args,int *); 408a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson *tileEnabled = isMacroTileEnabled(format, usage); 409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson height, format, *tileEnabled, *alignedWidth, 411a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson *alignedHeight); 412a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res = 0; 413a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } break; 414a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 415a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE: 416a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson { 417a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson private_handle_t* hnd = va_arg(args, private_handle_t*); 418a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int *color_space = va_arg(args, int *); 419a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (private_handle_t::validate(hnd)) { 420a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return res; 421a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 422a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 423a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(metadata && metadata->operation & UPDATE_COLOR_SPACE) { 424a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson *color_space = metadata->colorSpace; 425a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson res = 0; 426a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 427a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } break; 4280a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO: 4290a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed { 4300a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed private_handle_t* hnd = va_arg(args, private_handle_t*); 4310a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *); 4323099482d2523f4c2ca6f7939ac4a4a587253d838Naseer Ahmed if (!private_handle_t::validate(hnd)) { 4330a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed res = getYUVPlaneInfo(hnd, ycbcr); 4340a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed } 4350a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed } break; 4360a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed 437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 438ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson break; 439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 440ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson va_end(args); 441ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return res; 442ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 443