Home | History | Annotate | Download | only in libgralloc
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  * Copyright (c) 2011-2014,2017 The Linux Foundation. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #include <limits.h>
     19 #include <unistd.h>
     20 #include <fcntl.h>
     21 #include <cutils/properties.h>
     22 #include <sys/mman.h>
     23 #include <linux/msm_ion.h>
     24 #ifdef COMPILE_DRM
     25 #include <drm/drm_fourcc.h>
     26 #include <drm_master.h>
     27 #endif
     28 #include <qdMetaData.h>
     29 #include <qd_utils.h>
     30 
     31 #include <algorithm>
     32 
     33 #include "gr.h"
     34 #include "gpu.h"
     35 #include "memalloc.h"
     36 #include "alloc_controller.h"
     37 
     38 #ifdef COMPILE_DRM
     39 #ifndef DRM_FORMAT_MOD_QCOM_COMPRESSED
     40 #define DRM_FORMAT_MOD_QCOM_COMPRESSED fourcc_mod_code(QCOM, 1)
     41 #endif
     42 #endif
     43 
     44 using namespace gralloc;
     45 
     46 #ifdef COMPILE_DRM
     47 using namespace drm_utils;
     48 
     49 static int getPlaneStrideOffset(private_handle_t *hnd, uint32_t *stride,
     50         uint32_t *offset, uint32_t *num_planes) {
     51     struct android_ycbcr yuvInfo = {};
     52     *num_planes = 1;
     53 
     54     switch (hnd->format) {
     55         case HAL_PIXEL_FORMAT_RGB_565:
     56         case HAL_PIXEL_FORMAT_BGR_565:
     57         case HAL_PIXEL_FORMAT_RGBA_5551:
     58         case HAL_PIXEL_FORMAT_RGBA_4444:
     59             stride[0] = hnd->width * 2;
     60             break;
     61         case HAL_PIXEL_FORMAT_RGB_888:
     62             stride[0] = hnd->width * 3;
     63             break;
     64         case HAL_PIXEL_FORMAT_RGBA_8888:
     65         case HAL_PIXEL_FORMAT_BGRA_8888:
     66         case HAL_PIXEL_FORMAT_RGBX_8888:
     67         case HAL_PIXEL_FORMAT_BGRX_8888:
     68         case HAL_PIXEL_FORMAT_RGBA_1010102:
     69         case HAL_PIXEL_FORMAT_ARGB_2101010:
     70         case HAL_PIXEL_FORMAT_RGBX_1010102:
     71         case HAL_PIXEL_FORMAT_XRGB_2101010:
     72         case HAL_PIXEL_FORMAT_BGRA_1010102:
     73         case HAL_PIXEL_FORMAT_ABGR_2101010:
     74         case HAL_PIXEL_FORMAT_BGRX_1010102:
     75         case HAL_PIXEL_FORMAT_XBGR_2101010:
     76             stride[0] = hnd->width * 4;
     77             break;
     78     }
     79 
     80     // Format is RGB
     81     if (stride[0]) {
     82         return 0;
     83     }
     84 
     85     (*num_planes)++;
     86     int ret = getYUVPlaneInfo(hnd, &yuvInfo);
     87     if (ret < 0) {
     88         ALOGE("%s failed", __FUNCTION__);
     89         return ret;
     90     }
     91 
     92     stride[0] = static_cast<uint32_t>(yuvInfo.ystride);
     93     offset[0] = static_cast<uint32_t>(
     94                     reinterpret_cast<uint64_t>(yuvInfo.y) - hnd->base);
     95     stride[1] = static_cast<uint32_t>(yuvInfo.cstride);
     96     switch (hnd->format) {
     97         case HAL_PIXEL_FORMAT_YCbCr_420_SP:
     98         case HAL_PIXEL_FORMAT_YCbCr_422_SP:
     99         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
    100         case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
    101         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
    102         case HAL_PIXEL_FORMAT_YCbCr_420_P010:
    103         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
    104             offset[1] = static_cast<uint32_t>(
    105                     reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
    106             break;
    107         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    108         case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
    109         case HAL_PIXEL_FORMAT_YCrCb_422_SP:
    110             offset[1] = static_cast<uint32_t>(
    111                     reinterpret_cast<uint64_t>(yuvInfo.cr) - hnd->base);
    112             break;
    113         case HAL_PIXEL_FORMAT_YV12:
    114             offset[1] = static_cast<uint32_t>(
    115                     reinterpret_cast<uint64_t>(yuvInfo.cr) - hnd->base);
    116             stride[2] = static_cast<uint32_t>(yuvInfo.cstride);
    117             offset[2] = static_cast<uint32_t>(
    118                     reinterpret_cast<uint64_t>(yuvInfo.cb) - hnd->base);
    119             (*num_planes)++;
    120             break;
    121         default:
    122             ALOGW("%s: Unsupported format %s", __FUNCTION__,
    123                     qdutils::GetHALPixelFormatString(hnd->format));
    124     }
    125 
    126     if (hnd->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
    127         std::fill(offset, offset + 4, 0);
    128     }
    129 
    130     return 0;
    131 }
    132 
    133 static void getDRMFormat(int hal_format, int flags, uint32_t *drm_format,
    134         uint64_t *drm_format_modifier) {
    135 
    136     if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
    137         *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
    138     }
    139 
    140     switch (hal_format) {
    141         case HAL_PIXEL_FORMAT_RGBA_8888:
    142             *drm_format = DRM_FORMAT_RGBA8888;
    143             break;
    144         case HAL_PIXEL_FORMAT_RGBA_5551:
    145             *drm_format = DRM_FORMAT_RGBA5551;
    146             break;
    147         case HAL_PIXEL_FORMAT_RGBA_4444:
    148             *drm_format = DRM_FORMAT_RGBA4444;
    149             break;
    150         case HAL_PIXEL_FORMAT_BGRA_8888:
    151             *drm_format = DRM_FORMAT_BGRA8888;
    152             break;
    153         case HAL_PIXEL_FORMAT_RGBX_8888:
    154             *drm_format = DRM_FORMAT_RGBX8888;
    155             break;
    156         case HAL_PIXEL_FORMAT_BGRX_8888:
    157             *drm_format = DRM_FORMAT_BGRX8888;
    158             break;
    159         case HAL_PIXEL_FORMAT_RGB_888:
    160             *drm_format = DRM_FORMAT_RGB888;
    161             break;
    162         case HAL_PIXEL_FORMAT_RGB_565:
    163             *drm_format = DRM_FORMAT_RGB565;
    164             break;
    165         case HAL_PIXEL_FORMAT_BGR_565:
    166             *drm_format = DRM_FORMAT_BGR565;
    167             break;
    168         case HAL_PIXEL_FORMAT_RGBA_1010102:
    169             *drm_format = DRM_FORMAT_RGBA1010102;
    170             break;
    171         case HAL_PIXEL_FORMAT_ARGB_2101010:
    172             *drm_format = DRM_FORMAT_ARGB2101010;
    173             break;
    174         case HAL_PIXEL_FORMAT_RGBX_1010102:
    175             *drm_format = DRM_FORMAT_RGBX1010102;
    176             break;
    177         case HAL_PIXEL_FORMAT_XRGB_2101010:
    178             *drm_format = DRM_FORMAT_XRGB2101010;
    179             break;
    180         case HAL_PIXEL_FORMAT_BGRA_1010102:
    181             *drm_format = DRM_FORMAT_BGRA1010102;
    182             break;
    183         case HAL_PIXEL_FORMAT_ABGR_2101010:
    184             *drm_format = DRM_FORMAT_ABGR2101010;
    185             break;
    186         case HAL_PIXEL_FORMAT_BGRX_1010102:
    187             *drm_format = DRM_FORMAT_BGRX1010102;
    188             break;
    189         case HAL_PIXEL_FORMAT_XBGR_2101010:
    190             *drm_format = DRM_FORMAT_XBGR2101010;
    191             break;
    192         case HAL_PIXEL_FORMAT_YCbCr_420_SP:
    193             *drm_format = DRM_FORMAT_NV12;
    194             break;
    195         case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
    196         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
    197             *drm_format = DRM_FORMAT_NV12;
    198             break;
    199         case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
    200             *drm_format = DRM_FORMAT_NV12;
    201             *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
    202             break;
    203         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    204             *drm_format = DRM_FORMAT_NV21;
    205             break;
    206         case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
    207             *drm_format = DRM_FORMAT_NV21;
    208             break;
    209         case HAL_PIXEL_FORMAT_YCbCr_420_P010:
    210             // TODO *drm_format = DRM_FORMAT_P010;
    211             break;
    212         case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
    213             // TODO *drm_format = DRM_FORMAT_P010;
    214             // *drm_format_modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED |
    215             //        DRM_FORMAT_MOD_QCOM_TIGHT;
    216             break;
    217         case HAL_PIXEL_FORMAT_YCbCr_422_SP:
    218             *drm_format = DRM_FORMAT_NV16;
    219             break;
    220         case HAL_PIXEL_FORMAT_YCrCb_422_SP:
    221             *drm_format = DRM_FORMAT_NV61;
    222             break;
    223         case HAL_PIXEL_FORMAT_YV12:
    224             *drm_format = DRM_FORMAT_YVU420;
    225             break;
    226         default:
    227             ALOGW("%s: Unsupported format %s", __FUNCTION__,
    228                     qdutils::GetHALPixelFormatString(hal_format));
    229     }
    230 }
    231 #endif
    232 
    233 gpu_context_t::gpu_context_t(const private_module_t* module,
    234                              IAllocController* alloc_ctrl ) :
    235     mAllocCtrl(alloc_ctrl)
    236 {
    237     // Zero out the alloc_device_t
    238     memset(static_cast<alloc_device_t*>(this), 0, sizeof(alloc_device_t));
    239 
    240     // Initialize the procs
    241     common.tag     = HARDWARE_DEVICE_TAG;
    242     common.version = 0;
    243     common.module  = const_cast<hw_module_t*>(&module->base.common);
    244     common.close   = gralloc_close;
    245     alloc          = gralloc_alloc;
    246     free           = gralloc_free;
    247 
    248 }
    249 
    250 int gpu_context_t::gralloc_alloc_buffer(unsigned int size, int usage,
    251                                         buffer_handle_t* pHandle, int bufferType,
    252                                         int format, int width, int height)
    253 {
    254     int err = 0;
    255     int flags = 0;
    256     int alignedw = 0;
    257     int alignedh = 0;
    258 
    259     AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
    260             height,
    261             format,
    262             usage,
    263             alignedw,
    264             alignedh);
    265 
    266     size = roundUpToPageSize(size);
    267     alloc_data data;
    268     data.offset = 0;
    269     data.fd = -1;
    270     data.base = 0;
    271     if(format == HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED)
    272         data.align = 8192;
    273     else
    274         data.align = getpagesize();
    275 
    276     if (usage & GRALLOC_USAGE_PROTECTED) {
    277             if ((usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY) ||
    278                 (usage & GRALLOC_USAGE_HW_CAMERA_MASK)) {
    279                 /* The alignment here reflects qsee mmu V7L/V8L requirement */
    280                 data.align = SZ_2M;
    281             } else {
    282                 data.align = SECURE_ALIGN;
    283             }
    284         size = ALIGN(size, data.align);
    285     }
    286 
    287     data.size = size;
    288     data.pHandle = (uintptr_t) pHandle;
    289     err = mAllocCtrl->allocate(data, usage);
    290 
    291     if (!err) {
    292         /* allocate memory for enhancement data */
    293         alloc_data eData;
    294         eData.fd = -1;
    295         eData.base = 0;
    296         eData.offset = 0;
    297         eData.size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
    298         eData.pHandle = data.pHandle;
    299         eData.align = getpagesize();
    300         int eDataUsage = 0;
    301         int eDataErr = mAllocCtrl->allocate(eData, eDataUsage);
    302         ALOGE_IF(eDataErr, "gralloc failed for eDataErr=%s",
    303                                           strerror(-eDataErr));
    304 
    305         if (usage & GRALLOC_USAGE_PRIVATE_EXTERNAL_ONLY) {
    306             flags |= private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY;
    307         }
    308 
    309         if (usage & GRALLOC_USAGE_PRIVATE_INTERNAL_ONLY) {
    310             flags |= private_handle_t::PRIV_FLAGS_INTERNAL_ONLY;
    311         }
    312 
    313         if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER ) {
    314             flags |= private_handle_t::PRIV_FLAGS_VIDEO_ENCODER;
    315         }
    316 
    317         if (usage & GRALLOC_USAGE_HW_CAMERA_WRITE) {
    318             flags |= private_handle_t::PRIV_FLAGS_CAMERA_WRITE;
    319         }
    320 
    321         if (usage & GRALLOC_USAGE_HW_CAMERA_READ) {
    322             flags |= private_handle_t::PRIV_FLAGS_CAMERA_READ;
    323         }
    324 
    325         if (usage & GRALLOC_USAGE_HW_COMPOSER) {
    326             flags |= private_handle_t::PRIV_FLAGS_HW_COMPOSER;
    327         }
    328 
    329         if (usage & GRALLOC_USAGE_HW_TEXTURE) {
    330             flags |= private_handle_t::PRIV_FLAGS_HW_TEXTURE;
    331         }
    332 
    333         if(usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY) {
    334             flags |= private_handle_t::PRIV_FLAGS_SECURE_DISPLAY;
    335         }
    336 
    337         if (isUBwcEnabled(format, usage)) {
    338             flags |= private_handle_t::PRIV_FLAGS_UBWC_ALIGNED;
    339         }
    340 
    341         if(usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) {
    342             flags |= private_handle_t::PRIV_FLAGS_CPU_RENDERED;
    343         }
    344 
    345         if (usage & (GRALLOC_USAGE_HW_VIDEO_ENCODER |
    346                 GRALLOC_USAGE_HW_CAMERA_WRITE |
    347                 GRALLOC_USAGE_HW_RENDER |
    348                 GRALLOC_USAGE_HW_FB)) {
    349             flags |= private_handle_t::PRIV_FLAGS_NON_CPU_WRITER;
    350         }
    351 
    352         if(usage & GRALLOC_USAGE_HW_COMPOSER) {
    353             flags |= private_handle_t::PRIV_FLAGS_DISP_CONSUMER;
    354         }
    355 
    356         if(false == data.uncached) {
    357             flags |= private_handle_t::PRIV_FLAGS_CACHED;
    358         }
    359 
    360         flags |= data.allocType;
    361         uint64_t eBaseAddr = (uint64_t)(eData.base) + eData.offset;
    362         private_handle_t *hnd = new private_handle_t(data.fd, size, flags,
    363                 bufferType, format, alignedw, alignedh,
    364                 eData.fd, eData.offset, eBaseAddr, width, height);
    365 
    366         hnd->offset = data.offset;
    367         hnd->base = (uint64_t)(data.base) + data.offset;
    368         hnd->gpuaddr = 0;
    369         ColorSpace_t colorSpace = ITU_R_601;
    370         setMetaData(hnd, UPDATE_COLOR_SPACE, (void*) &colorSpace);
    371 
    372 #ifdef COMPILE_DRM
    373         if (qdutils::getDriverType() == qdutils::DriverType::DRM &&
    374                 usage & GRALLOC_USAGE_HW_COMPOSER) {
    375             DRMBuffer buf = {};
    376             int ret = getPlaneStrideOffset(hnd, buf.stride, buf.offset,
    377                     &buf.num_planes);
    378             if (ret < 0) {
    379                 ALOGE("%s failed", __FUNCTION__);
    380                 return ret;
    381             }
    382 
    383             buf.fd = hnd->fd;
    384             buf.width = hnd->width;
    385             buf.height = hnd->height;
    386             getDRMFormat(hnd->format, flags, &buf.drm_format,
    387                     &buf.drm_format_modifier);
    388 
    389             DRMMaster *master = nullptr;
    390             ret = DRMMaster::GetInstance(&master);
    391             if (ret < 0) {
    392                 ALOGE("%s Failed to acquire DRMMaster instance", __FUNCTION__);
    393                 return ret;
    394             }
    395 
    396             ret = master->CreateFbId(buf, &hnd->gem_handle, &hnd->fb_id);
    397             if (ret < 0) {
    398                 ALOGE("%s: CreateFbId failed. width %d, height %d, " \
    399                         "format: %s, stride %u, error %d", __FUNCTION__,
    400                         buf.width, buf.height,
    401                         qdutils::GetHALPixelFormatString(hnd->format),
    402                         buf.stride[0], errno);
    403                 return ret;
    404             }
    405         }
    406 #endif
    407 
    408         *pHandle = hnd;
    409     }
    410 
    411     ALOGE_IF(err, "gralloc failed err=%s", strerror(-err));
    412     return err;
    413 }
    414 
    415 void gpu_context_t::getGrallocInformationFromFormat(int inputFormat,
    416                                                     int *bufferType)
    417 {
    418     *bufferType = BUFFER_TYPE_VIDEO;
    419 
    420     if (isUncompressedRgbFormat(inputFormat) == TRUE) {
    421         // RGB formats
    422         *bufferType = BUFFER_TYPE_UI;
    423     }
    424 }
    425 
    426 int gpu_context_t::gralloc_alloc_framebuffer_locked(int usage,
    427                                                     buffer_handle_t* pHandle)
    428 {
    429     private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
    430 
    431     // This allocation will only happen when gralloc is in fb mode
    432 
    433     if (m->framebuffer == NULL) {
    434         ALOGE("%s: Invalid framebuffer", __FUNCTION__);
    435         return -EINVAL;
    436     }
    437 
    438     const unsigned int bufferMask = m->bufferMask;
    439     const uint32_t numBuffers = m->numBuffers;
    440     unsigned int bufferSize = m->finfo.line_length * m->info.yres;
    441 
    442     //adreno needs FB size to be page aligned
    443     bufferSize = roundUpToPageSize(bufferSize);
    444 
    445     if (numBuffers == 1) {
    446         // If we have only one buffer, we never use page-flipping. Instead,
    447         // we return a regular buffer which will be memcpy'ed to the main
    448         // screen when post is called.
    449         int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D;
    450         return gralloc_alloc_buffer(bufferSize, newUsage, pHandle, BUFFER_TYPE_UI,
    451                                     m->fbFormat, m->info.xres, m->info.yres);
    452     }
    453 
    454     if (bufferMask >= ((1LU<<numBuffers)-1)) {
    455         // We ran out of buffers.
    456         return -ENOMEM;
    457     }
    458 
    459     // create a "fake" handle for it
    460     uint64_t vaddr = uint64_t(m->framebuffer->base);
    461     // As GPU needs ION FD, the private handle is created
    462     // using ION fd and ION flags are set
    463     private_handle_t* hnd = new private_handle_t(
    464         dup(m->framebuffer->fd), bufferSize,
    465         private_handle_t::PRIV_FLAGS_USES_ION |
    466         private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
    467         BUFFER_TYPE_UI, m->fbFormat, m->info.xres,
    468         m->info.yres);
    469 
    470     // find a free slot
    471     for (uint32_t i=0 ; i<numBuffers ; i++) {
    472         if ((bufferMask & (1LU<<i)) == 0) {
    473             m->bufferMask |= (uint32_t)(1LU<<i);
    474             break;
    475         }
    476         vaddr += bufferSize;
    477     }
    478     hnd->base = vaddr;
    479     hnd->offset = (unsigned int)(vaddr - m->framebuffer->base);
    480     *pHandle = hnd;
    481     return 0;
    482 }
    483 
    484 
    485 int gpu_context_t::gralloc_alloc_framebuffer(int usage,
    486                                              buffer_handle_t* pHandle)
    487 {
    488     private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
    489     pthread_mutex_lock(&m->lock);
    490     int err = gralloc_alloc_framebuffer_locked(usage, pHandle);
    491     pthread_mutex_unlock(&m->lock);
    492     return err;
    493 }
    494 
    495 int gpu_context_t::alloc_impl(int w, int h, int format, int usage,
    496                               buffer_handle_t* pHandle, int* pStride,
    497                               unsigned int bufferSize) {
    498     if (!pHandle || !pStride)
    499         return -EINVAL;
    500 
    501     unsigned int size;
    502     int alignedw, alignedh;
    503     int grallocFormat = format;
    504     int bufferType;
    505 
    506     //If input format is HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED then based on
    507     //the usage bits, gralloc assigns a format.
    508     if(format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED ||
    509        format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
    510         if (usage & GRALLOC_USAGE_PRIVATE_ALLOC_UBWC)
    511             grallocFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
    512         else if(usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
    513             if(MDPCapabilityInfo::getInstance().isWBUBWCSupportedByMDP() &&
    514                !IAllocController::getInstance()->isDisableUBWCForEncoder() &&
    515                usage & GRALLOC_USAGE_HW_COMPOSER)
    516               grallocFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC;
    517             else
    518               grallocFormat = HAL_PIXEL_FORMAT_NV12_ENCODEABLE; //NV12
    519         } else if((usage & GRALLOC_USAGE_HW_CAMERA_MASK)
    520                 == GRALLOC_USAGE_HW_CAMERA_ZSL)
    521             grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL; //NV21 ZSL
    522         else if(usage & GRALLOC_USAGE_HW_CAMERA_READ)
    523             grallocFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; //NV21
    524         else if(usage & GRALLOC_USAGE_HW_CAMERA_WRITE) {
    525            if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
    526                grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL; //NV21
    527            } else {
    528                grallocFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; //NV12 preview
    529            }
    530         } else if(usage & GRALLOC_USAGE_HW_COMPOSER)
    531             //XXX: If we still haven't set a format, default to RGBA8888
    532             grallocFormat = HAL_PIXEL_FORMAT_RGBA_8888;
    533         else if(format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
    534             //If no other usage flags are detected, default the
    535             //flexible YUV format to NV21_ZSL
    536             grallocFormat = HAL_PIXEL_FORMAT_NV21_ZSL;
    537         }
    538     }
    539 
    540     bool useFbMem = false;
    541     char property[PROPERTY_VALUE_MAX];
    542     char isUBWC[PROPERTY_VALUE_MAX];
    543     if (usage & GRALLOC_USAGE_HW_FB) {
    544         if ((property_get("debug.gralloc.map_fb_memory", property, NULL) > 0) &&
    545             (!strncmp(property, "1", PROPERTY_VALUE_MAX ) ||
    546             (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
    547             useFbMem = true;
    548         } else {
    549             usage &= ~GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
    550             if (property_get("debug.gralloc.enable_fb_ubwc", isUBWC, NULL) > 0){
    551                 if ((!strncmp(isUBWC, "1", PROPERTY_VALUE_MAX)) ||
    552                     (!strncasecmp(isUBWC, "true", PROPERTY_VALUE_MAX))) {
    553                     // Allocate UBWC aligned framebuffer
    554                     usage |= GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
    555                 }
    556             }
    557         }
    558     }
    559 
    560     getGrallocInformationFromFormat(grallocFormat, &bufferType);
    561     size = getBufferSizeAndDimensions(w, h, grallocFormat, usage, alignedw,
    562                    alignedh);
    563 
    564     if ((unsigned int)size <= 0)
    565         return -EINVAL;
    566     size = (bufferSize >= size)? bufferSize : size;
    567 
    568     int err = 0;
    569     if(useFbMem) {
    570         err = gralloc_alloc_framebuffer(usage, pHandle);
    571     } else {
    572         err = gralloc_alloc_buffer(size, usage, pHandle, bufferType,
    573                                    grallocFormat, w, h);
    574     }
    575 
    576     if (err < 0) {
    577         return err;
    578     }
    579 
    580     *pStride = alignedw;
    581     return 0;
    582 }
    583 
    584 int gpu_context_t::free_impl(private_handle_t const* hnd) {
    585     private_module_t* m = reinterpret_cast<private_module_t*>(common.module);
    586     if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
    587         const unsigned int bufferSize = m->finfo.line_length * m->info.yres;
    588         unsigned int index = (unsigned int) ((hnd->base - m->framebuffer->base)
    589                 / bufferSize);
    590         m->bufferMask &= (uint32_t)~(1LU<<index);
    591     } else {
    592 
    593         terminateBuffer(&m->base, const_cast<private_handle_t*>(hnd));
    594         IMemAlloc* memalloc = mAllocCtrl->getAllocator(hnd->flags);
    595         int err = memalloc->free_buffer((void*)hnd->base, hnd->size,
    596                                         hnd->offset, hnd->fd);
    597         if(err)
    598             return err;
    599         // free the metadata space
    600         unsigned int size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
    601         err = memalloc->free_buffer((void*)hnd->base_metadata,
    602                                     size, hnd->offset_metadata,
    603                                     hnd->fd_metadata);
    604         if (err)
    605             return err;
    606     }
    607 
    608 #ifdef COMPILE_DRM
    609     if (hnd->fb_id) {
    610         DRMMaster *master = nullptr;
    611         int ret = DRMMaster::GetInstance(&master);
    612         if (ret < 0) {
    613             ALOGE("%s Failed to acquire DRMMaster instance", __FUNCTION__);
    614             return ret;
    615         }
    616         ret = master->RemoveFbId(hnd->gem_handle, hnd->fb_id);
    617         if (ret < 0) {
    618             ALOGE("%s: Removing fb_id %d failed with error %d", __FUNCTION__,
    619                     hnd->fb_id, errno);
    620         }
    621     }
    622 #endif
    623 
    624     delete hnd;
    625     return 0;
    626 }
    627 
    628 int gpu_context_t::gralloc_alloc(alloc_device_t* dev, int w, int h, int format,
    629                                  int usage, buffer_handle_t* pHandle,
    630                                  int* pStride)
    631 {
    632     if (!dev) {
    633         return -EINVAL;
    634     }
    635     gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev);
    636     return gpu->alloc_impl(w, h, format, usage, pHandle, pStride, 0);
    637 }
    638 int gpu_context_t::gralloc_alloc_size(alloc_device_t* dev, int w, int h,
    639                                       int format, int usage,
    640                                       buffer_handle_t* pHandle, int* pStride,
    641                                       int bufferSize)
    642 {
    643     if (!dev) {
    644         return -EINVAL;
    645     }
    646     gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev);
    647     return gpu->alloc_impl(w, h, format, usage, pHandle, pStride, bufferSize);
    648 }
    649 
    650 
    651 int gpu_context_t::gralloc_free(alloc_device_t* dev,
    652                                 buffer_handle_t handle)
    653 {
    654     if (private_handle_t::validate(handle) < 0)
    655         return -EINVAL;
    656 
    657     private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
    658     gpu_context_t* gpu = reinterpret_cast<gpu_context_t*>(dev);
    659     return gpu->free_impl(hnd);
    660 }
    661 
    662 /*****************************************************************************/
    663 
    664 int gpu_context_t::gralloc_close(struct hw_device_t *dev)
    665 {
    666     gpu_context_t* ctx = reinterpret_cast<gpu_context_t*>(dev);
    667     if (ctx) {
    668         /* TODO: keep a list of all buffer_handle_t created, and free them
    669          * all here.
    670          */
    671         delete ctx;
    672     }
    673     return 0;
    674 }
    675 
    676