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