1a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/* 2a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Copyright (C) 2008 The Android Open Source Project 385b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 4a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 5a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 6a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * you may not use this file except in compliance with the License. 7a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * You may obtain a copy of the License at 8a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 9a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 10a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 11a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Unless required by applicable law or agreed to in writing, software 12a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 13a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * See the License for the specific language governing permissions and 15a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * limitations under the License. 16a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 17a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 18a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <limits.h> 19a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <errno.h> 20a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <pthread.h> 21a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <unistd.h> 22a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <string.h> 23a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <stdarg.h> 24a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 25a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/mman.h> 26a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/stat.h> 27a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/types.h> 28a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/ioctl.h> 29a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 30a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <cutils/log.h> 31a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <cutils/atomic.h> 32a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 33a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <hardware/hardware.h> 34a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <hardware/gralloc.h> 35a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 36a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gralloc_priv.h" 37a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gr.h" 38a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "alloc_controller.h" 39a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "memalloc.h" 40591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include <qdMetaData.h> 41a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 42a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevusing namespace gralloc; 43a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/*****************************************************************************/ 44a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 45a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// Return the type of allocator - 46a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// these are used for mapping/unmapping 47be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmedstatic IMemAlloc* getAllocator(int flags) 48a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 49be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IMemAlloc* memalloc; 50be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IAllocController* alloc_ctrl = IAllocController::getInstance(); 51a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev memalloc = alloc_ctrl->getAllocator(flags); 52a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return memalloc; 53a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 54a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 55a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic int gralloc_map(gralloc_module_t const* module, 56cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed buffer_handle_t handle) 57a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 587a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if(!module) 597a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R return -EINVAL; 607a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R 61a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 62a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev void *mappedAddress; 63a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) && 64a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) { 65a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size_t size = hnd->size; 66be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags) ; 67a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int err = memalloc->map_buffer(&mappedAddress, size, 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hnd->offset, hnd->fd); 69591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan if(err || mappedAddress == MAP_FAILED) { 70a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ALOGE("Could not mmap handle %p, fd=%d (%s)", 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed handle, hnd->fd, strerror(errno)); 72a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->base = 0; 73a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return -errno; 74a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 75a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 76a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->base = intptr_t(mappedAddress) + hnd->offset; 77591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan mappedAddress = MAP_FAILED; 78591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 79591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan err = memalloc->map_buffer(&mappedAddress, size, 80591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan hnd->offset_metadata, hnd->fd_metadata); 81591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan if(err || mappedAddress == MAP_FAILED) { 82591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan ALOGE("Could not mmap handle %p, fd=%d (%s)", 83591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan handle, hnd->fd_metadata, strerror(errno)); 84591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan hnd->base_metadata = 0; 85591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan return -errno; 86591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan } 87591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan hnd->base_metadata = intptr_t(mappedAddress) + hnd->offset_metadata; 88a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 89a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return 0; 90a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 91a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 92a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic int gralloc_unmap(gralloc_module_t const* module, 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle) 94a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 957a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if(!module) 967a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R return -EINVAL; 977a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R 98a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 99a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) { 100a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int err = -EINVAL; 101a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev void* base = (void*)hnd->base; 102a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size_t size = hnd->size; 103be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags) ; 104591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan if(memalloc != NULL) { 105a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev err = memalloc->unmap_buffer(base, size, hnd->offset); 106591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan if (err) { 107591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan ALOGE("Could not unmap memory at address %p", base); 108591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan } 109591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan base = (void*)hnd->base_metadata; 110591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan size = ROUND_UP_PAGESIZE(sizeof(MetaData_t)); 111591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan err = memalloc->unmap_buffer(base, size, hnd->offset_metadata); 112591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan if (err) { 113591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan ALOGE("Could not unmap memory at address %p", base); 114591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan } 115a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 116a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 117a0b7f4e1300ee86ca60c40fb238ed5d3f518941eRamkumar Radhakrishnan /* need to initialize the pointer to NULL otherwise unmapping for that 118a0b7f4e1300ee86ca60c40fb238ed5d3f518941eRamkumar Radhakrishnan * buffer happens twice which leads to crash */ 119a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->base = 0; 120a0b7f4e1300ee86ca60c40fb238ed5d3f518941eRamkumar Radhakrishnan hnd->base_metadata = 0; 121a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return 0; 122a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 123a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 124a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/*****************************************************************************/ 125a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 126a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER; 127a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 128a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/*****************************************************************************/ 129a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 130a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint gralloc_register_buffer(gralloc_module_t const* module, 131befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle) 132a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 1337a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 134a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return -EINVAL; 135a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 136a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // In this implementation, we don't need to do anything here 137a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 138a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev /* NOTE: we need to initialize the buffer as not mapped/not locked 139a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * because it shouldn't when this function is called the first time 140a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * in a new process. Ideally these flags shouldn't be part of the 141a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * handle, but instead maintained in the kernel or at least 142a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * out-of-line 143a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 144a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 145a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 14677a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar hnd->base = 0; 147a0b7f4e1300ee86ca60c40fb238ed5d3f518941eRamkumar Radhakrishnan hnd->base_metadata = 0; 148cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed int err = gralloc_map(module, handle); 14977a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar if (err) { 15077a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar ALOGE("%s: gralloc_map failed", __FUNCTION__); 15177a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar return err; 15277a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar } 153a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 154a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return 0; 155a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 156a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 157a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint gralloc_unregister_buffer(gralloc_module_t const* module, 158befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle) 159a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 1607a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 161a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return -EINVAL; 162a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 163a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev /* 164a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * If the buffer has been mapped during a lock operation, it's time 165a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * to un-map it. It's an error to be here with a locked buffer. 166a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * NOTE: the framebuffer is handled differently and is never unmapped. 167a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 168a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 169a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 170a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 17177a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar if (hnd->base != 0) { 17277a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar gralloc_unmap(module, handle); 17377a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar } 17477a5ae0adc2e220228a988c65696757b37d0826eKinjal Bhavsar hnd->base = 0; 175a0b7f4e1300ee86ca60c40fb238ed5d3f518941eRamkumar Radhakrishnan hnd->base_metadata = 0; 176a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return 0; 177a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 178a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 179a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint terminateBuffer(gralloc_module_t const* module, 180befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t* hnd) 181a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 1827a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if(!module) 1837a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R return -EINVAL; 1847a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R 185a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev /* 186a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * If the buffer has been mapped during a lock operation, it's time 187a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * to un-map it. It's an error to be here with a locked buffer. 188a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 189a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 190a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (hnd->base != 0) { 191a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // this buffer was mapped, unmap it now 192a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (hnd->flags & (private_handle_t::PRIV_FLAGS_USES_PMEM | 193a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP | 194a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t::PRIV_FLAGS_USES_ASHMEM | 195a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t::PRIV_FLAGS_USES_ION)) { 196a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev gralloc_unmap(module, hnd); 197a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } else { 198befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("terminateBuffer: unmapping a non pmem/ashmem buffer flags = 0x%x", 199befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hnd->flags); 200a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev gralloc_unmap(module, hnd); 201a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 202a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 203a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 204a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return 0; 205a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 206a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 207cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmedstatic int gralloc_map_and_invalidate (gralloc_module_t const* module, 208cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed buffer_handle_t handle, int usage) 209a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 2107a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 211a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return -EINVAL; 212a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 213a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int err = 0; 214a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 215a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) { 216a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (hnd->base == 0) { 217a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // we need to map for real 218a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev pthread_mutex_t* const lock = &sMapLock; 219a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev pthread_mutex_lock(lock); 220cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed err = gralloc_map(module, handle); 221a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev pthread_mutex_unlock(lock); 222a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 223d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) { 224d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed //Invalidate if reading in software. No need to do this for the 225d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed //metadata buffer as it is only read/written in software. 226d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags) ; 227d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed err = memalloc->clean_buffer((void*)hnd->base, 228d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->size, hnd->offset, hnd->fd, 229d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed CACHE_INVALIDATE); 230d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed if (usage & GRALLOC_USAGE_SW_WRITE_MASK) { 231d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed // Mark the buffer to be flushed after cpu read/write 232d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 233d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed } 234a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 2352a0417549a81c49b4826c27edd90e0bae3902233Naseer Ahmed } else { 2362a0417549a81c49b4826c27edd90e0bae3902233Naseer Ahmed hnd->flags |= private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH; 237a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 238a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return err; 239a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 240a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 241cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmedint gralloc_lock(gralloc_module_t const* module, 242cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed buffer_handle_t handle, int usage, 243cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed int /*l*/, int /*t*/, int /*w*/, int /*h*/, 244cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed void** vaddr) 245cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed{ 246cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed private_handle_t* hnd = (private_handle_t*)handle; 247cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed int err = gralloc_map_and_invalidate(module, handle, usage); 248cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed if(!err) 249cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed *vaddr = (void*)hnd->base; 250cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed return err; 251cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed} 252cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed 253cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmedint gralloc_lock_ycbcr(gralloc_module_t const* module, 254cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed buffer_handle_t handle, int usage, 255cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed int /*l*/, int /*t*/, int /*w*/, int /*h*/, 256cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed struct android_ycbcr *ycbcr) 257cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed{ 258cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed private_handle_t* hnd = (private_handle_t*)handle; 259cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed int err = gralloc_map_and_invalidate(module, handle, usage); 2604d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed if(!err) 2614d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed err = getYUVPlaneInfo(hnd, ycbcr); 262cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed return err; 263cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed} 264cbc630614b5f9a3299bfde07377b991b4a87ae16Naseer Ahmed 265a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint gralloc_unlock(gralloc_module_t const* module, 266befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle) 267a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 2687a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if (!module || private_handle_t::validate(handle) < 0) 269a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return -EINVAL; 2707a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R 2712a0417549a81c49b4826c27edd90e0bae3902233Naseer Ahmed int err = 0; 272a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)handle; 273a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 274d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) { 27567aa558115b4d484ff2328ca19387613bde57ed2Naseer Ahmed IMemAlloc* memalloc = getAllocator(hnd->flags); 276d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) { 277d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed err = memalloc->clean_buffer((void*)hnd->base, 278d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->size, hnd->offset, hnd->fd, 279d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed CACHE_CLEAN_AND_INVALIDATE); 280d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH; 281d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed } else if(hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) { 282d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->flags &= ~private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH; 283d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed } else { 284d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed //Probably a round about way to do this, but this avoids adding new 285d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed //flags 286d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed err = memalloc->clean_buffer((void*)hnd->base, 287d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed hnd->size, hnd->offset, hnd->fd, 288d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed CACHE_INVALIDATE); 289d2b1b25bd45c1135668ce06b7643b5bb72b23200Naseer Ahmed } 290a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 291a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 2922a0417549a81c49b4826c27edd90e0bae3902233Naseer Ahmed return err; 293a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 294a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 295a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/*****************************************************************************/ 296a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 297a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint gralloc_perform(struct gralloc_module_t const* module, 298befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int operation, ... ) 299a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 300a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int res = -EINVAL; 301a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev va_list args; 3027a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R if(!module) 3037a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R return res; 3047a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R 305a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev va_start(args, operation); 306a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev switch (operation) { 307a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: 308a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev { 309a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int fd = va_arg(args, int); 310a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size_t size = va_arg(args, size_t); 311a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size_t offset = va_arg(args, size_t); 312a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev void* base = va_arg(args, void*); 313a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int width = va_arg(args, int); 314a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int height = va_arg(args, int); 315a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int format = va_arg(args, int); 316a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 317a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev native_handle_t** handle = va_arg(args, native_handle_t**); 318a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev private_handle_t* hnd = (private_handle_t*)native_handle_create( 319befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t::sNumFds, private_handle_t::sNumInts); 320a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->magic = private_handle_t::sMagic; 321a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->fd = fd; 322be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed hnd->flags = private_handle_t::PRIV_FLAGS_USES_ION; 323a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->size = size; 324a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->offset = offset; 325a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->base = intptr_t(base) + offset; 326a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->gpuaddr = 0; 327a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->width = width; 328a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->height = height; 329a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev hnd->format = format; 330a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev *handle = (native_handle_t *)hnd; 331a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev res = 0; 332a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 333a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 334a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 33559644b2127280052ca410cb053f0a41c3181a97aNaseer Ahmed#ifdef QCOM_BSP 3365fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan case GRALLOC_MODULE_PERFORM_UPDATE_BUFFER_GEOMETRY: 3375fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan { 3385fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan int width = va_arg(args, int); 3395fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan int height = va_arg(args, int); 3405fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan int format = va_arg(args, int); 3415fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan private_handle_t* hnd = va_arg(args, private_handle_t*); 3425fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan if (private_handle_t::validate(hnd)) { 3435fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan return res; 3445fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan } 3455fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan hnd->width = width; 3465fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan hnd->height = height; 3475fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan hnd->format = format; 3485fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan res = 0; 3495fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan } 3505fd30e6b24fdb48b95c1aab8546da63a07a58043Ramkumar Radhakrishnan break; 35117412ead5d762cfc0c8f9c9c15a8c9ab3e8f7e33Naseer Ahmed#endif 352b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis case GRALLOC_MODULE_PERFORM_GET_STRIDE: 353b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis { 354b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis int width = va_arg(args, int); 355b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis int format = va_arg(args, int); 356b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis int *stride = va_arg(args, int *); 357cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan int alignedw = 0, alignedh = 0; 358cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 359c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 0, format, false, alignedw, alignedh); 360cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan *stride = alignedw; 361b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis res = 0; 362b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis } break; 363c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 36451fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE: 36551fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed { 36651fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed private_handle_t* hnd = va_arg(args, private_handle_t*); 36751fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed int *stride = va_arg(args, int *); 36851fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed if (private_handle_t::validate(hnd)) { 36951fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed return res; 37051fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed } 37151fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 37251fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 37351fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed *stride = metadata->bufferDim.sliceWidth; 37451fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed } else { 37551fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed *stride = hnd->width; 37651fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed } 37751fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed res = 0; 37851fd2ca95bed3fa28515ca05a4e6b38865c60961Naseer Ahmed } break; 379c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 38011349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE: 38111349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal { 38211349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal private_handle_t* hnd = va_arg(args, private_handle_t*); 38311349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal int *stride = va_arg(args, int *); 38411349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal int *height = va_arg(args, int *); 38511349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal if (private_handle_t::validate(hnd)) { 38611349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal return res; 38711349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal } 38811349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 38911349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 39011349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal *stride = metadata->bufferDim.sliceWidth; 39111349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal *height = metadata->bufferDim.sliceHeight; 39211349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal } else { 39311349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal *stride = hnd->width; 39411349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal *height = hnd->height; 39511349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal } 39611349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal res = 0; 39711349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal } break; 39811349e1dd46e6fee2a6f82667d15d811d8a3f378Raj Kamal 399c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES: 400c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM { 401c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int width = va_arg(args, int); 402c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int height = va_arg(args, int); 403c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int format = va_arg(args, int); 404c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int usage = va_arg(args, int); 405c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int *alignedWidth = va_arg(args, int *); 406c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int *alignedHeight = va_arg(args, int *); 407c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int *tileEnabled = va_arg(args,int *); 408c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM *tileEnabled = isMacroTileEnabled(format, usage); 409c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 410c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM height, format, *tileEnabled, *alignedWidth, 411c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM *alignedHeight); 412c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM res = 0; 413c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } break; 414c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 41585b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE: 41685b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang { 41785b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang private_handle_t* hnd = va_arg(args, private_handle_t*); 41885b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang int *color_space = va_arg(args, int *); 41985b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang if (private_handle_t::validate(hnd)) { 42085b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang return res; 42185b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang } 42285b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 42385b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang if(metadata && metadata->operation & UPDATE_COLOR_SPACE) { 42485b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang *color_space = metadata->colorSpace; 42585b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang res = 0; 42685b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang } 42785b1615c5a11a14fe9fcb0e74e7c8843af2b0733Shuzhen Wang } break; 4284d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO: 4294d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed { 4304d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed private_handle_t* hnd = va_arg(args, private_handle_t*); 4314d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *); 4324d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed if (!private_handle_t::validate(hnd)) { 4334d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed res = getYUVPlaneInfo(hnd, ycbcr); 4344d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed } 4354d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed } break; 4364d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 437a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev default: 438a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 439a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 440a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev va_end(args); 441a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return res; 442a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 443