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