12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
2deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Redistribution and use in source and binary forms, with or without
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * modification, are permitted provided that the following conditions are
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * met:
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *   * Redistributions of source code must retain the above copyright
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     notice, this list of conditions and the following disclaimer.
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *   * Redistributions in binary form must reproduce the above
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     copyright notice, this list of conditions and the following
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     disclaimer in the documentation and/or other materials provided
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     with the distribution.
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *   * Neither the name of The Linux Foundation nor the names of its
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     contributors may be used to endorse or promote products derived
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *     from this software without specific prior written permission.
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel */
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "gr_utils.h"
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace gralloc1 {
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool IsUncompressedRGBFormat(int format) {
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (format) {
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_8888:
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBX_8888:
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGB_888:
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGB_565:
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGR_565:
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRA_8888:
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_5551:
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_4444:
442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_R_8:
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RG_88:
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRX_8888:
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_1010102:
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_ARGB_2101010:
492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBX_1010102:
502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_XRGB_2101010:
512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRA_1010102:
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_ABGR_2101010:
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRX_1010102:
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_XBGR_2101010:
55cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel    case HAL_PIXEL_FORMAT_RGBA_FP16:
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return true;
572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    default:
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return false;
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool IsCompressedRGBFormat(int format) {
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (format) {
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR:
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR:
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR:
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR:
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR:
752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR:
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR:
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR:
812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR:
832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR:
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR:
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR:
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR:
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR:
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return true;
952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    default:
962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return false;
1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t GetBppForUncompressedRGB(int format) {
1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t bpp = 0;
1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (format) {
105cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel    case HAL_PIXEL_FORMAT_RGBA_FP16:
106cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel      bpp = 8;
107cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel      break;
1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_8888:
1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBX_8888:
1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRA_8888:
1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGRX_8888:
112deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_1010102:
113deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_ARGB_2101010:
114deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_RGBX_1010102:
115deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_XRGB_2101010:
116deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_BGRA_1010102:
117deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_ABGR_2101010:
11886f0be319b163d01870e0cc4c2d6489f5c5f117dNaseer Ahmed    case HAL_PIXEL_FORMAT_BGRX_1010102:
119deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel    case HAL_PIXEL_FORMAT_XBGR_2101010:
1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      bpp = 4;
1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGB_888:
1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      bpp = 3;
1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGB_565:
1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_BGR_565:
1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_5551:
1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HAL_PIXEL_FORMAT_RGBA_4444:
1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      bpp = 2;
1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    default:
132deb4b3808eef2b2dd0e58595f7a8b57f1a23edd6Thierry Strudel      ALOGE("Error : %s New format request = 0x%x", __FUNCTION__, format);
1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return bpp;
1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool CpuCanAccess(gralloc1_producer_usage_t prod_usage, gralloc1_consumer_usage_t cons_usage) {
1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return CpuCanRead(prod_usage, cons_usage) || CpuCanWrite(prod_usage);
1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool CpuCanRead(gralloc1_producer_usage_t prod_usage, gralloc1_consumer_usage_t cons_usage) {
1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (prod_usage & GRALLOC1_PRODUCER_USAGE_CPU_READ) {
1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return true;
1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (cons_usage & GRALLOC1_CONSUMER_USAGE_CPU_READ) {
1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return true;
1502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return false;
1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool CpuCanWrite(gralloc1_producer_usage_t prod_usage) {
1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (prod_usage & GRALLOC1_PRODUCER_USAGE_CPU_WRITE) {
1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // Application intends to use CPU for rendering
1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return true;
1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return false;
1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace gralloc1
165