1/*
2 * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
3
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *   * Redistributions of source code must retain the above copyright
8 *     notice, this list of conditions and the following disclaimer.
9 *   * Redistributions in binary form must reproduce the above
10 *     copyright notice, this list of conditions and the following
11 *     disclaimer in the documentation and/or other materials provided
12 *     with the distribution.
13 *   * Neither the name of The Linux Foundation nor the names of its
14 *     contributors may be used to endorse or promote products derived
15 *     from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include "gr_utils.h"
31
32namespace gralloc1 {
33
34bool IsUncompressedRGBFormat(int format) {
35  switch (format) {
36    case HAL_PIXEL_FORMAT_RGBA_8888:
37    case HAL_PIXEL_FORMAT_RGBX_8888:
38    case HAL_PIXEL_FORMAT_RGB_888:
39    case HAL_PIXEL_FORMAT_RGB_565:
40    case HAL_PIXEL_FORMAT_BGR_565:
41    case HAL_PIXEL_FORMAT_BGRA_8888:
42    case HAL_PIXEL_FORMAT_RGBA_5551:
43    case HAL_PIXEL_FORMAT_RGBA_4444:
44    case HAL_PIXEL_FORMAT_R_8:
45    case HAL_PIXEL_FORMAT_RG_88:
46    case HAL_PIXEL_FORMAT_BGRX_8888:
47    case HAL_PIXEL_FORMAT_RGBA_1010102:
48    case HAL_PIXEL_FORMAT_ARGB_2101010:
49    case HAL_PIXEL_FORMAT_RGBX_1010102:
50    case HAL_PIXEL_FORMAT_XRGB_2101010:
51    case HAL_PIXEL_FORMAT_BGRA_1010102:
52    case HAL_PIXEL_FORMAT_ABGR_2101010:
53    case HAL_PIXEL_FORMAT_BGRX_1010102:
54    case HAL_PIXEL_FORMAT_XBGR_2101010:
55    case HAL_PIXEL_FORMAT_RGBA_FP16:
56      return true;
57    default:
58      break;
59  }
60
61  return false;
62}
63
64bool IsCompressedRGBFormat(int format) {
65  switch (format) {
66    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR:
67    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
68    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR:
69    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
70    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR:
71    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
72    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR:
73    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
74    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR:
75    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
76    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR:
77    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
78    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR:
79    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
80    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR:
81    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
82    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR:
83    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
84    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR:
85    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
86    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR:
87    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
88    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR:
89    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
90    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR:
91    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
92    case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR:
93    case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
94      return true;
95    default:
96      break;
97  }
98
99  return false;
100}
101
102uint32_t GetBppForUncompressedRGB(int format) {
103  uint32_t bpp = 0;
104  switch (format) {
105    case HAL_PIXEL_FORMAT_RGBA_FP16:
106      bpp = 8;
107      break;
108    case HAL_PIXEL_FORMAT_RGBA_8888:
109    case HAL_PIXEL_FORMAT_RGBX_8888:
110    case HAL_PIXEL_FORMAT_BGRA_8888:
111    case HAL_PIXEL_FORMAT_BGRX_8888:
112    case HAL_PIXEL_FORMAT_RGBA_1010102:
113    case HAL_PIXEL_FORMAT_ARGB_2101010:
114    case HAL_PIXEL_FORMAT_RGBX_1010102:
115    case HAL_PIXEL_FORMAT_XRGB_2101010:
116    case HAL_PIXEL_FORMAT_BGRA_1010102:
117    case HAL_PIXEL_FORMAT_ABGR_2101010:
118    case HAL_PIXEL_FORMAT_BGRX_1010102:
119    case HAL_PIXEL_FORMAT_XBGR_2101010:
120      bpp = 4;
121      break;
122    case HAL_PIXEL_FORMAT_RGB_888:
123      bpp = 3;
124      break;
125    case HAL_PIXEL_FORMAT_RGB_565:
126    case HAL_PIXEL_FORMAT_BGR_565:
127    case HAL_PIXEL_FORMAT_RGBA_5551:
128    case HAL_PIXEL_FORMAT_RGBA_4444:
129      bpp = 2;
130      break;
131    default:
132      ALOGE("Error : %s New format request = 0x%x", __FUNCTION__, format);
133      break;
134  }
135
136  return bpp;
137}
138
139bool CpuCanAccess(gralloc1_producer_usage_t prod_usage, gralloc1_consumer_usage_t cons_usage) {
140  return CpuCanRead(prod_usage, cons_usage) || CpuCanWrite(prod_usage);
141}
142
143bool CpuCanRead(gralloc1_producer_usage_t prod_usage, gralloc1_consumer_usage_t cons_usage) {
144  if (prod_usage & GRALLOC1_PRODUCER_USAGE_CPU_READ) {
145    return true;
146  }
147
148  if (cons_usage & GRALLOC1_CONSUMER_USAGE_CPU_READ) {
149    return true;
150  }
151
152  return false;
153}
154
155bool CpuCanWrite(gralloc1_producer_usage_t prod_usage) {
156  if (prod_usage & GRALLOC1_PRODUCER_USAGE_CPU_WRITE) {
157    // Application intends to use CPU for rendering
158    return true;
159  }
160
161  return false;
162}
163
164}  // namespace gralloc1
165