1a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/* 27a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 3a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 4a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Redistribution and use in source and binary forms, with or without 5a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * modification, are permitted provided that the following conditions are 6a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * met: 7a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * * Redistributions of source code must retain the above copyright 8a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * notice, this list of conditions and the following disclaimer. 9a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * * Redistributions in binary form must reproduce the above 10a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * copyright notice, this list of conditions and the following 11a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * disclaimer in the documentation and/or other materials provided 12a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * with the distribution. 135070c694011ddc30673ec68a9d1d74dc713c49f2Duy Truong * * Neither the name of The Linux Foundation nor the names of its 14a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * contributors may be used to endorse or promote products derived 15a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * from this software without specific prior written permission. 16a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 17a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 29a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 30a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <cutils/log.h> 31a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <fcntl.h> 32a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis#include <dlfcn.h> 33a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gralloc_priv.h" 34a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "alloc_controller.h" 35a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "memalloc.h" 36a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "ionalloc.h" 37a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gr.h" 380f859f6f0db0e0c05d8c319d8d597ad2731513aeNaseer Ahmed#include "comptype.h" 39c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM#include "mdp_version.h" 40a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 41da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#ifdef VENUS_COLOR_FORMAT 42da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#include <media/msm_media_info.h> 43da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#else 44da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#define VENUS_Y_STRIDE(args...) 0 45da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#define VENUS_Y_SCANLINES(args...) 0 46da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#define VENUS_BUFFER_SIZE(args...) 0 47da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan#endif 48da4e354248d655a64d0f8ef8262678ed82bb429eSushil Chauhan 49926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed#define ASTC_BLOCK_SIZE 16 50926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed 51a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevusing namespace gralloc; 520f859f6f0db0e0c05d8c319d8d597ad2731513aeNaseer Ahmedusing namespace qdutils; 53a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 54b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi LuisANDROID_SINGLETON_STATIC_INSTANCE(AdrenoMemInfo); 55b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis 56a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev//Common functions 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic bool canFallback(int usage, bool triedSystem) 58a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 59a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // Fallback to system heap when alloc fails unless 60a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // 1. Composition type is MDP 61a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // 2. Alloc from system heap was already tried 62a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // 3. The heap type is requsted explicitly 63a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // 4. The heap type is protected 64a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // 5. The buffer is meant for external display only 65a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 660f859f6f0db0e0c05d8c319d8d597ad2731513aeNaseer Ahmed if(QCCompositionType::getInstance().getCompositionType() & 670f859f6f0db0e0c05d8c319d8d597ad2731513aeNaseer Ahmed COMPOSITION_TYPE_MDP) 68a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return false; 69a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(triedSystem) 70a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return false; 713fd3b60a0c8f9b40106b895e558b7f00ee62f90eSushil Chauhan if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_PROTECTED)) 72a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return false; 735d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY)) 74a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return false; 75a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev //Return true by default 76a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return true; 77a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 78a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 79a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic bool useUncached(int usage) 80a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 8189a6e5a7179ee29ca2e94ea53ee3f41badb2f2e2Naseer Ahmed if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED) 8289a6e5a7179ee29ca2e94ea53ee3f41badb2f2e2Naseer Ahmed return true; 8389a6e5a7179ee29ca2e94ea53ee3f41badb2f2e2Naseer Ahmed if(((usage & GRALLOC_USAGE_SW_WRITE_MASK) == GRALLOC_USAGE_SW_WRITE_RARELY) 8489a6e5a7179ee29ca2e94ea53ee3f41badb2f2e2Naseer Ahmed ||((usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_RARELY)) 85a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return true; 86a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return false; 87a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 88a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 89b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis//-------------- AdrenoMemInfo-----------------------// 90a6afb0b996c508db6b0368804b999d36c65b83bcNaomi LuisAdrenoMemInfo::AdrenoMemInfo() 91a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis{ 92cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan LINK_adreno_compute_aligned_width_and_height = NULL; 93cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan LINK_adreno_compute_padding = NULL; 94c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM LINK_adreno_isMacroTilingSupportedByGpu = NULL; 954f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran LINK_adreno_compute_compressedfmt_aligned_width_and_height = NULL; 96cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan 97a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis libadreno_utils = ::dlopen("libadreno_utils.so", RTLD_NOW); 98a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis if (libadreno_utils) { 99cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan *(void **)&LINK_adreno_compute_aligned_width_and_height = 100c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ::dlsym(libadreno_utils, "compute_aligned_width_and_height"); 101c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM *(void **)&LINK_adreno_compute_padding = 102c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ::dlsym(libadreno_utils, "compute_surface_padding"); 103c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM *(void **)&LINK_adreno_isMacroTilingSupportedByGpu = 104c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ::dlsym(libadreno_utils, "isMacroTilingSupportedByGpu"); 1054f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran *(void **)&LINK_adreno_compute_compressedfmt_aligned_width_and_height = 1064f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran ::dlsym(libadreno_utils, 1074f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran "compute_compressedfmt_aligned_width_and_height"); 108a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } 109a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis} 110a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis 111a6afb0b996c508db6b0368804b999d36c65b83bcNaomi LuisAdrenoMemInfo::~AdrenoMemInfo() 112a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis{ 113a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis if (libadreno_utils) { 114a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis ::dlclose(libadreno_utils); 115a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } 116a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis} 117a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis 118c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMint AdrenoMemInfo::isMacroTilingSupportedByGPU() 119c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM{ 120c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM if ((libadreno_utils)) { 121c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM if(LINK_adreno_isMacroTilingSupportedByGpu) { 122c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return LINK_adreno_isMacroTilingSupportedByGpu(); 123c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 124c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 125c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return 0; 126c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 127c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 128c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 129cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnanvoid AdrenoMemInfo::getAlignedWidthAndHeight(int width, int height, int format, 130c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int tile_enabled, int& aligned_w, int& aligned_h) 131b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis{ 132c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_w = width; 133c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_h = height; 134a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis // Currently surface padding is only computed for RGB* surfaces. 135c3e683e0a35dcf3d00f3d9415f771beaa590c9e3Jesse Hall if (format <= HAL_PIXEL_FORMAT_sRGB_X_8888) { 136c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_w = ALIGN(width, 32); 137c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_h = ALIGN(height, 32); 138195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis // Don't add any additional padding if debug.gralloc.map_fb_memory 139195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis // is enabled 140195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis char property[PROPERTY_VALUE_MAX]; 141195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis if((property_get("debug.gralloc.map_fb_memory", property, NULL) > 0) && 142195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 143195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 144cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan return; 145195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis } 146195b2ab8a276cab4d744a4123a7799da56aaf043Naomi Luis 147a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis int bpp = 4; 148a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis switch(format) 149a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis { 150a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_RGB_888: 151a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis bpp = 3; 152a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 153a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_RGB_565: 154a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis bpp = 2; 155a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 156a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis default: break; 157a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } 158cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan if (libadreno_utils) { 1596df4da3c88e59c9b7f8eebe5c0359f962ea0ceceNaomi Luis int raster_mode = 0; // Adreno unknown raster mode. 160a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis int padding_threshold = 512; // Threshold for padding surfaces. 161cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan // the function below computes aligned width and aligned height 162cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan // based on linear or macro tile mode selected. 163cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan if(LINK_adreno_compute_aligned_width_and_height) { 164c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM LINK_adreno_compute_aligned_width_and_height(width, 165c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM height, bpp, tile_enabled, 166cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan raster_mode, padding_threshold, 167cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan &aligned_w, &aligned_h); 168cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan 169cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan } else if(LINK_adreno_compute_padding) { 170cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan int surface_tile_height = 1; // Linear surface 171cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = LINK_adreno_compute_padding(width, bpp, 172cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan surface_tile_height, raster_mode, 173cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan padding_threshold); 174cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan ALOGW("%s: Warning!! Old GFX API is used to calculate stride", 175cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan __FUNCTION__); 176cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan } else { 177cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan ALOGW("%s: Warning!! Symbols compute_surface_padding and " \ 178cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan "compute_aligned_width_and_height not found", __FUNCTION__); 179cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan } 180a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } 181a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } else { 182a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis switch (format) 183a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis { 184c6e59efb88ce7688875a02f124b36eab39560f8cNaseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_420_SP: 185a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: 186cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = ALIGN(width, 32); 187a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 1885f50df31c32cfc292d8c040c67670bad30e43a37Shuzhen Wang case HAL_PIXEL_FORMAT_RAW_SENSOR: 1895f50df31c32cfc292d8c040c67670bad30e43a37Shuzhen Wang aligned_w = ALIGN(width, 16); 1905f50df31c32cfc292d8c040c67670bad30e43a37Shuzhen Wang break; 1910be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab case HAL_PIXEL_FORMAT_RAW10: 1920be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab aligned_w = ALIGN(width * 10 /8, 16); 1930be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab break; 194a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 195cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = ALIGN(width, 128); 196a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 197a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCbCr_420_SP: 198a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YV12: 199a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCbCr_422_SP: 200a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCrCb_422_SP: 20122977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCbCr_422_I: 20222977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCrCb_422_I: 203cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = ALIGN(width, 16); 204a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 205a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 206849f60270156d1b25fbaac2a66c4c10e46060a37Naseer Ahmed case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 207cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width); 208c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height); 209a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis break; 210367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed case HAL_PIXEL_FORMAT_BLOB: 211367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed break; 2127e77fca478d026f1806d106bc37465d555065e3dRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_NV21_ZSL: 213cba13e265e04a01c0095e3bdfb9896a613891265Ramkumar Radhakrishnan aligned_w = ALIGN(width, 64); 214c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah aligned_h = ALIGN(height, 64); 2157e77fca478d026f1806d106bc37465d555065e3dRamkumar Radhakrishnan break; 216926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR: 217926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 218926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR: 219926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 220926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR: 221926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 222926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR: 223926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 224926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR: 225926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 226926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR: 227926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 228926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR: 229926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 230926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR: 231926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 232926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR: 233926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 234926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR: 235926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 236926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR: 237926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 238926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR: 239926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 240926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR: 241926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 242926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR: 243926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 2444f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran if(LINK_adreno_compute_compressedfmt_aligned_width_and_height) { 2454f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran int bytesPerPixel = 0; 2464f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran int raster_mode = 0; //Adreno unknown raster mode. 2474f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran int padding_threshold = 512; //Threshold for padding 2484f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran //surfaces. 2494f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran 2504f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran LINK_adreno_compute_compressedfmt_aligned_width_and_height( 2514f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran width, height, format, 0,raster_mode, padding_threshold, 2524f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran &aligned_w, &aligned_h, &bytesPerPixel); 2534f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran 2544f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran } else { 2554f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran ALOGW("%s: Warning!! Symbols" \ 2564f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran " compute_compressedfmt_aligned_width_and_height" \ 2574f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran " not found", __FUNCTION__); 2584f7021a028183549122deb51ef8a775ade4866a6Jeykumar Sankaran } 259926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed break; 260a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis default: break; 261a6afb0b996c508db6b0368804b999d36c65b83bcNaomi Luis } 262b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis } 263b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis} 264b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis 265b178eeae07d5fdd3c6e5fa0bf1360143cc4e2c70Naomi Luis//-------------- IAllocController-----------------------// 266be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer AhmedIAllocController* IAllocController::sController = NULL; 267be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer AhmedIAllocController* IAllocController::getInstance(void) 268a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 269a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(sController == NULL) { 270a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev sController = new IonController(); 271a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 272a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return sController; 273a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 274a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 275a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 276a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev//-------------- IonController-----------------------// 277a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan MalchevIonController::IonController() 278a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 279a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev mIonAlloc = new IonAlloc(); 280a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 281a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 282be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmedint IonController::allocate(alloc_data& data, int usage) 283a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 284a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int ionFlags = 0; 285a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int ret; 286a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 287a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev data.uncached = useUncached(usage); 288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.allocType = 0; 289befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 290a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(usage & GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP) 291a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ionFlags |= ION_HEAP(ION_SF_HEAP_ID); 292a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 293bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) 294a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ionFlags |= ION_HEAP(ION_SYSTEM_HEAP_ID); 295a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 296bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed if(usage & GRALLOC_USAGE_PRIVATE_IOMMU_HEAP) 297a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID); 298a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 299ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula if(usage & GRALLOC_USAGE_PROTECTED) { 300b892f3eb28e239f4829bc327d453a5012b589099Prabhanjan Kandula if (usage & GRALLOC_USAGE_PRIVATE_MM_HEAP) { 301bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID); 302bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed ionFlags |= ION_SECURE; 303ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula } else { 304ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula // for targets/OEMs which do not need HW level protection 305ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula // do not set ion secure flag & MM heap. Fallback to IOMMU heap. 306bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID); 307bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed } 308ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula } else if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP) { 309ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula //MM Heap is exclusively a secure heap. 310ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula //If it is used for non secure cases, fallback to IOMMU heap 311ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula ALOGW("GRALLOC_USAGE_PRIVATE_MM_HEAP \ 312ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula cannot be used as an insecure heap!\ 313ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula trying to use IOMMU instead !!"); 314ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID); 315bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed } 316a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 3172942ea3dfc253dac3e20b303a4acd8bd79b78b26Arun Kumar K.R if(usage & GRALLOC_USAGE_PRIVATE_CAMERA_HEAP) 3182942ea3dfc253dac3e20b303a4acd8bd79b78b26Arun Kumar K.R ionFlags |= ION_HEAP(ION_CAMERA_HEAP_ID); 3192942ea3dfc253dac3e20b303a4acd8bd79b78b26Arun Kumar K.R 320cac62f8b97249896fd5f750976175bab625857c6Arun Kumar K.R if(usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP) 321cac62f8b97249896fd5f750976175bab625857c6Arun Kumar K.R ionFlags |= ION_HEAP(ION_ADSP_HEAP_ID); 322a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 323ea46642cafd179cedaa5bca320209959b94676d1Prabhanjan Kandula if(ionFlags & ION_SECURE) 324bd41232c3624f0b142fe80b49fa95544a305cb2bNaseer Ahmed data.allocType |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER; 325a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 326a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // if no flags are set, default to 327a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // SF + IOMMU heaps, so that bypass can work 328a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // we can fall back to system heap if 329a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // we run out. 330a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(!ionFlags) 331a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ionFlags = ION_HEAP(ION_SF_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID); 332a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 333a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev data.flags = ionFlags; 334a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ret = mIonAlloc->alloc_buffer(data); 335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 336a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // Fallback 337befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(ret < 0 && canFallback(usage, 338a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev (ionFlags & ION_SYSTEM_HEAP_ID))) 339a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev { 340a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ALOGW("Falling back to system heap"); 341a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev data.flags = ION_HEAP(ION_SYSTEM_HEAP_ID); 342a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ret = mIonAlloc->alloc_buffer(data); 343a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 344a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 345a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(ret >= 0 ) { 346befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.allocType |= private_handle_t::PRIV_FLAGS_USES_ION; 347a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 348a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 349a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return ret; 350a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 351a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 352be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer AhmedIMemAlloc* IonController::getAllocator(int flags) 353a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 3545aa9f9bebbb02ccfe9b6a4e5a092c8bd324e0e88Naseer Ahmed IMemAlloc* memalloc = NULL; 355a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (flags & private_handle_t::PRIV_FLAGS_USES_ION) { 356a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev memalloc = mIonAlloc; 357a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } else { 358a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags); 359a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 360a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 361a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return memalloc; 362a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 363a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 364c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMbool isMacroTileEnabled(int format, int usage) 365c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM{ 366c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM bool tileEnabled = false; 367c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 368c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM // Check whether GPU & MDSS supports MacroTiling feature 369c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM if(AdrenoMemInfo::getInstance().isMacroTilingSupportedByGPU() && 370c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM qdutils::MDPVersion::getInstance().supportsMacroTile()) 371c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM { 372c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM // check the format 373c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM switch(format) 374c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM { 375c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM case HAL_PIXEL_FORMAT_RGBA_8888: 376c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM case HAL_PIXEL_FORMAT_RGBX_8888: 377c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM case HAL_PIXEL_FORMAT_BGRA_8888: 3786a8289a1767dad8ba243735041ae28adf7311042Manoj Kumar AVM case HAL_PIXEL_FORMAT_RGB_565: 379c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM { 380c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM tileEnabled = true; 381c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM // check the usage flags 382c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM if (usage & (GRALLOC_USAGE_SW_READ_MASK | 383c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM GRALLOC_USAGE_SW_WRITE_MASK)) { 384c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM // Application intends to use CPU for rendering 385c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM tileEnabled = false; 386c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 387c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM break; 388c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 389c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM default: 390c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM break; 391c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 392c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 393c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return tileEnabled; 394c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 395c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 396c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM// helper function 397c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shahsize_t getSize(int format, int width, int height, const int alignedw, 398c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah const int alignedh) { 399c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah size_t size = 0; 400a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 401a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev switch (format) { 402a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_RGBA_8888: 403a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_RGBX_8888: 404a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_BGRA_8888: 405634d190af0346cff9af500bde60688604e50d853Naseer Ahmed case HAL_PIXEL_FORMAT_sRGB_A_8888: 406c3e683e0a35dcf3d00f3d9415f771beaa590c9e3Jesse Hall case HAL_PIXEL_FORMAT_sRGB_X_8888: 407a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size = alignedw * alignedh * 4; 408a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 409a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_RGB_888: 410a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size = alignedw * alignedh * 3; 411a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 412a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_RGB_565: 413367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed case HAL_PIXEL_FORMAT_RAW_SENSOR: 414a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size = alignedw * alignedh * 2; 415a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 4160be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab case HAL_PIXEL_FORMAT_RAW10: 4170be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab size = ALIGN(alignedw * alignedh, 4096); 4180be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab break; 419a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 420a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // adreno formats 421a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: // NV21 422a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size = ALIGN(alignedw*alignedh, 4096); 423a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size += ALIGN(2 * ALIGN(width/2, 32) * ALIGN(height/2, 32), 4096); 424a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 425a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: // NV12 426a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // The chroma plane is subsampled, 427a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // but the pitch in bytes is unchanged 428a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev // The GPU needs 4K alignment, but the video decoder needs 8K 429a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size = ALIGN( alignedw * alignedh, 8192); 430a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev size += ALIGN( alignedw * ALIGN(height/2, 32), 8192); 431a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 432a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev case HAL_PIXEL_FORMAT_YV12: 433a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if ((format == HAL_PIXEL_FORMAT_YV12) && ((width&1) || (height&1))) { 434a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev ALOGE("w or h is odd for the YV12 format"); 435c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah return 0; 436a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 437849f60270156d1b25fbaac2a66c4c10e46060a37Naseer Ahmed size = alignedw*alignedh + 438befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed (ALIGN(alignedw/2, 16) * (alignedh/2))*2; 4397a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R size = ALIGN(size, (size_t)4096); 440a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev break; 44152b9f901a7c1fb6599c9a108b4b8e894f1f2639fRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCbCr_420_SP: 44252b9f901a7c1fb6599c9a108b4b8e894f1f2639fRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCrCb_420_SP: 4434a0cf37f1b9eacbb811613f3807e7ea72e66f3e5Naseer Ahmed size = ALIGN((alignedw*alignedh) + (alignedw* alignedh)/2 + 1, 4096); 44452b9f901a7c1fb6599c9a108b4b8e894f1f2639fRamkumar Radhakrishnan break; 445befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_422_SP: 446befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_422_SP: 44722977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCbCr_422_I: 44822977805cde2da4defc7ee3f49577a388b01c3dbRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_YCrCb_422_I: 449befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(width & 1) { 450befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("width is odd for the YUV422_SP format"); 451c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah return 0; 452befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 453befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed size = ALIGN(alignedw * alignedh * 2, 4096); 454befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed break; 4552d9ebfd924dfc0e86b7b6fda9ec7a538a1e91955Sushil Chauhan case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 456849f60270156d1b25fbaac2a66c4c10e46060a37Naseer Ahmed case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 457d226efd37da783456f63440e4c4af18a6baacbccSushil Chauhan size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height); 4582d9ebfd924dfc0e86b7b6fda9ec7a538a1e91955Sushil Chauhan break; 459367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed case HAL_PIXEL_FORMAT_BLOB: 460367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed if(height != 1) { 461367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed ALOGE("%s: Buffers with format HAL_PIXEL_FORMAT_BLOB \ 462367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed must have height==1 ", __FUNCTION__); 463c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah return 0; 464367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed } 465367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed size = width; 466367dda46210b4d5bb284e63e30238f1ef7aa30aeNaseer Ahmed break; 4677e77fca478d026f1806d106bc37465d555065e3dRamkumar Radhakrishnan case HAL_PIXEL_FORMAT_NV21_ZSL: 4687e77fca478d026f1806d106bc37465d555065e3dRamkumar Radhakrishnan size = ALIGN((alignedw*alignedh) + (alignedw* alignedh)/2, 4096); 4697e77fca478d026f1806d106bc37465d555065e3dRamkumar Radhakrishnan break; 470926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR: 471926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR: 472926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR: 473926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR: 474926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR: 475926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR: 476926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR: 477926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR: 478926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR: 479926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR: 480926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR: 481926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR: 482926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR: 483926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR: 484926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 485926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 486926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 487926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 488926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 489926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 490926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 491926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 492926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 493926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 494926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 495926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 496926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 497017007fd0c454872ccb53bf5deb518f53672109aJeykumar Sankaran case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 498926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed size = alignedw * alignedh * ASTC_BLOCK_SIZE; 499926f26b90cebb7994e20694814a9c5e13a6e87cfNaseer Ahmed break; 500a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev default: 501befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("unrecognized pixel format: 0x%x", format); 502c401d189bc072f17189b4193e0a7cd35da2129d6Saurabh Shah return 0; 503a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 504c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return size; 505c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 506c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 507c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMsize_t getBufferSizeAndDimensions(int width, int height, int format, 508c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int& alignedw, int &alignedh) 509c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM{ 510c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM size_t size; 511c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 512c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 513c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM height, 514c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM format, 515c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM false, 516c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedw, 517c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedh); 518c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 519c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM size = getSize(format, width, height, alignedw, alignedh); 520a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 521a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return size; 522a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 523a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 524c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 525c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMsize_t getBufferSizeAndDimensions(int width, int height, int format, int usage, 526c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int& alignedw, int &alignedh) 527c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM{ 528c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM size_t size; 529c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int tileEnabled = isMacroTileEnabled(format, usage); 530c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 531c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 532c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM height, 533c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM format, 534c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM tileEnabled, 535c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedw, 536c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedh); 537c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 538c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM size = getSize(format, width, height, alignedw, alignedh); 539c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 540c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return size; 541c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 542c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 543c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 544c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMvoid getBufferAttributes(int width, int height, int format, int usage, 545c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM int& alignedw, int &alignedh, int& tileEnabled, size_t& size) 546c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM{ 547c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM tileEnabled = isMacroTileEnabled(format, usage); 548c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 549c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width, 550c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM height, 551c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM format, 552c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM tileEnabled, 553c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedw, 554c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedh); 555c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan size = getSize(format, width, height, alignedw, alignedh); 556c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 557c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 5584d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmedint getYUVPlaneInfo(private_handle_t* hnd, struct android_ycbcr* ycbcr) 5594d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed{ 5604d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed int err = 0; 5614d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed size_t ystride, cstride; 5624d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved)); 5634d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 5644d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed // Get the chroma offsets from the handle width/height. We take advantage 5654d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed // of the fact the width _is_ the stride 5664d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed switch (hnd->format) { 5674d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed //Semiplanar 5684d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_420_SP: 5694d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_422_SP: 5704d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 5714d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: //Same as YCbCr_420_SP_VENUS 572a90e404f3faa86dccd52aeb3042b35db76bff493Naseer Ahmed ystride = cstride = hnd->width; 5734d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->y = (void*)hnd->base; 5744d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cb = (void*)(hnd->base + ystride * hnd->height); 5754d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cr = (void*)(hnd->base + ystride * hnd->height + 1); 5764d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->ystride = ystride; 5774d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cstride = cstride; 5784d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->chroma_step = 2; 5794d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed break; 5804d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 5814d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_420_SP: 5824d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_422_SP: 5834d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: 5844d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_NV21_ZSL: 5854d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_RAW_SENSOR: 5860be0a3ec121d019e50558808d19375b53f22d607Mansoor Aftab case HAL_PIXEL_FORMAT_RAW10: 587a90e404f3faa86dccd52aeb3042b35db76bff493Naseer Ahmed ystride = cstride = hnd->width; 5884d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->y = (void*)hnd->base; 5894d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cr = (void*)(hnd->base + ystride * hnd->height); 5904d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cb = (void*)(hnd->base + ystride * hnd->height + 1); 5914d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->ystride = ystride; 5924d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cstride = cstride; 5934d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->chroma_step = 2; 5944d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed break; 5954d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 5964d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed //Planar 5974d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YV12: 5984d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ystride = hnd->width; 599d535e5981569b82927a1e787f7416730417a93ffLajos Molnar cstride = ALIGN(hnd->width/2, 16); 6004d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->y = (void*)hnd->base; 6014d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cr = (void*)(hnd->base + ystride * hnd->height); 6024d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cb = (void*)(hnd->base + ystride * hnd->height + 6034d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed cstride * hnd->height/2); 6044d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->ystride = ystride; 6054d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->cstride = cstride; 6064d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ycbcr->chroma_step = 1; 6074d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 6084d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed break; 6094d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed //Unsupported formats 6104d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_422_I: 6114d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCrCb_422_I: 6124d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 6134d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed default: 6144d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed ALOGD("%s: Invalid format passed: 0x%x", __FUNCTION__, 6154d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed hnd->format); 6164d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed err = -EINVAL; 6174d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed } 6184d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed return err; 6194d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 6204d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed} 6214d7187b19bdf0413b7266a471e725aef7def40e3Naseer Ahmed 622c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 623c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 624a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// Allocate buffer from width, height and format into a 625a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// private_handle_t. It is the responsibility of the caller 626a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// to free the buffer using the free_buffer function 627a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage) 628a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 629befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed alloc_data data; 630befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int alignedw, alignedh; 631be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed gralloc::IAllocController* sAlloc = 632be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed gralloc::IAllocController::getInstance(); 633befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.base = 0; 634befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.fd = -1; 635befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.offset = 0; 636c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM data.size = getBufferSizeAndDimensions(w, h, format, usage, alignedw, 637c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM alignedh); 638c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 639befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.align = getpagesize(); 640befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed data.uncached = useUncached(usage); 641befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int allocFlags = usage; 642befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 643be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed int err = sAlloc->allocate(data, allocFlags); 644befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (0 != err) { 645befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: allocate failed", __FUNCTION__); 646befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -ENOMEM; 647befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 648befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 649befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed private_handle_t* hnd = new private_handle_t(data.fd, data.size, 650be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed data.allocType, 0, format, 651be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed alignedw, alignedh); 6527a09f5d1465b17a920bbc877ce1b8c63a754aa67Arun Kumar K.R hnd->base = (uintptr_t) data.base; 653befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hnd->offset = data.offset; 654befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hnd->gpuaddr = 0; 655befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *pHnd = hnd; 656befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 657a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 658a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 659a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevvoid free_buffer(private_handle_t *hnd) 660a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 661be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed gralloc::IAllocController* sAlloc = 662be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed gralloc::IAllocController::getInstance(); 663a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (hnd && hnd->fd > 0) { 664be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IMemAlloc* memalloc = sAlloc->getAllocator(hnd->flags); 665a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev memalloc->free_buffer((void*)hnd->base, hnd->size, hnd->offset, hnd->fd); 666a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 667a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if(hnd) 668a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev delete hnd; 669a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 670a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 671