/* * Copyright (C) 2017-2020 ARM Limited. All rights reserved. * * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once // #include #define GRALLOC_USAGE_PRIVATE_MASK (0xffff0000f0000000U) /* * Below usage types overlap, this is intentional. * The reason is that for Gralloc 0.3 there are very * few usage flags we have at our disposal. * * The overlapping is handled by processing the definitions * in a specific order. * * MALI_GRALLOC_USAGE_PRIVATE_FORMAT and MALI_GRALLOC_USAGE_NO_AFBC * don't overlap and are processed first. * * MALI_GRALLOC_USAGE_YUV_CONF are only for YUV formats and clients * using MALI_GRALLOC_USAGE_NO_AFBC must never allocate YUV formats. * The latter is strictly enforced and allocations will fail. * * MALI_GRALLOC_USAGE_AFBC_PADDING is only valid if MALI_GRALLOC_USAGE_NO_AFBC * is not present. */ /* Local macro definitions to emulate Gralloc 1.0 usage interface */ #define GRALLOC_USAGE_PRIVATE_0 1ULL << 28 #define GRALLOC_USAGE_PRIVATE_1 1ULL << 29 #define GRALLOC_USAGE_PRIVATE_2 1ULL << 30 #define GRALLOC_USAGE_PRIVATE_3 1ULL << 31 #define GRALLOC_USAGE_PRIVATE_4 1ULL << 63 #define GRALLOC_USAGE_PRIVATE_5 1ULL << 62 #define GRALLOC_USAGE_PRIVATE_6 1ULL << 61 #define GRALLOC_USAGE_PRIVATE_7 1ULL << 60 #define GRALLOC_USAGE_PRIVATE_8 1ULL << 59 #define GRALLOC_USAGE_PRIVATE_9 1ULL << 58 #define GRALLOC_USAGE_PRIVATE_10 1ULL << 57 #define GRALLOC_USAGE_PRIVATE_11 1ULL << 56 #define GRALLOC_USAGE_PRIVATE_12 1ULL << 55 #define GRALLOC_USAGE_PRIVATE_13 1ULL << 54 #define GRALLOC_USAGE_PRIVATE_14 1ULL << 53 #define GRALLOC_USAGE_PRIVATE_15 1ULL << 52 #define GRALLOC_USAGE_PRIVATE_16 1ULL << 51 #define GRALLOC_USAGE_PRIVATE_17 1ULL << 50 #define GRALLOC_USAGE_PRIVATE_18 1ULL << 49 #define GRALLOC_USAGE_PRIVATE_19 1ULL << 48 typedef enum { /* 表征 "当前 调用 alloc() 的 client 通过 width 指定了其预期的 buffer stride", * 即要求 gralloc 遵循 rk_implicit_alloc_semantic (即 满足 implicit_requirement_for_rk_gralloc_allocate). */ RK_GRALLOC_USAGE_SPECIFY_STRIDE = GRALLOC_USAGE_PRIVATE_2, /* 表征 "调用 alloc() 的 client 要求分配 底层 pages 是物理连续的 buffer". * 目前的实现从 ion_cma_heap 分配. */ RK_GRALLOC_USAGE_PHY_CONTIG_BUFFER = GRALLOC_USAGE_PRIVATE_3, /* 表征 "调用 alloc() 的 client 要求分配的 buffer 的所有物理 page 的地址都在 4G 以内". */ RK_GRALLOC_USAGE_WITHIN_4G = GRALLOC_USAGE_PRIVATE_11, /* See comment for Gralloc 1.0, above. */ MALI_GRALLOC_USAGE_FRONTBUFFER = GRALLOC_USAGE_PRIVATE_0, /* See comment for Gralloc 1.0, above. */ MALI_GRALLOC_USAGE_FORCE_BACKBUFFER = GRALLOC_USAGE_PRIVATE_13, /* See comment for Gralloc 1.0, above. */ // MALI_GRALLOC_USAGE_NO_AFBC = GRALLOC_USAGE_PRIVATE_1, /* See comment for Gralloc 1.0, above. */ MALI_GRALLOC_USAGE_AFBC_PADDING = GRALLOC_USAGE_PRIVATE_14, /* See comment for Gralloc 1.0, above. */ MALI_GRALLOC_USAGE_PRIVATE_FORMAT = GRALLOC_USAGE_PRIVATE_15, /* YUV-only. */ MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_DEFAULT = 0, MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_BT601 = GRALLOC_USAGE_PRIVATE_18, MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_BT709 = GRALLOC_USAGE_PRIVATE_19, MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_BT2020 = (GRALLOC_USAGE_PRIVATE_18 | GRALLOC_USAGE_PRIVATE_19), MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_MASK = MALI_GRALLOC_USAGE_YUV_COLOR_SPACE_BT2020, MALI_GRALLOC_USAGE_RANGE_DEFAULT = 0, MALI_GRALLOC_USAGE_RANGE_NARROW = GRALLOC_USAGE_PRIVATE_16, MALI_GRALLOC_USAGE_RANGE_WIDE = GRALLOC_USAGE_PRIVATE_17, MALI_GRALLOC_USAGE_RANGE_MASK = (GRALLOC_USAGE_PRIVATE_16 | GRALLOC_USAGE_PRIVATE_17), /* AFRC coding unit sizes. * The Y and RGB coding unit sizes are encoded in vendor usage low bits to make them accessible * to the Vulkan swapchain implementation. */ MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_DEFAULT = 0, MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_16 = (GRALLOC_USAGE_PRIVATE_2 | GRALLOC_USAGE_PRIVATE_0), MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_24 = (GRALLOC_USAGE_PRIVATE_2 | GRALLOC_USAGE_PRIVATE_1), MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_32 = GRALLOC_USAGE_PRIVATE_2, MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_MASK = (MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_16 | MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_24), MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_DEFAULT = 0, MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_16 = GRALLOC_USAGE_PRIVATE_11, MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_24 = GRALLOC_USAGE_PRIVATE_12, MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_32 = GRALLOC_USAGE_PRIVATE_11 | GRALLOC_USAGE_PRIVATE_12, MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_MASK = MALI_GRALLOC_USAGE_AFRC_CHROMA_CODING_SIZE_32, } mali_gralloc_usage_type; #define GRALLOC_USAGE_SW_WRITE_RARELY static_cast(2 << 4) #define GRALLOC_USAGE_SW_WRITE_OFTEN static_cast(3 << 4) #define GRALLOC_USAGE_SW_READ_RARELY static_cast(2) #define GRALLOC_USAGE_SW_READ_OFTEN static_cast(3) #define GRALLOC_USAGE_RENDERSCRIPT static_cast(1 << 20) #define GRALLOC_USAGE_HW_FB static_cast(1 << 12) /* Bit 10 must be zero as per Gralloc 2.x interface specification. Used, however, for backward compatibility */ #define GRALLOC_USAGE_HW_2D static_cast(0x00000400) #define GRALLOC_USAGE_SW_WRITE_MASK static_cast(0xf << 4) #define GRALLOC_USAGE_SW_READ_MASK static_cast(0xf) #define GRALLOC_USAGE_PROTECTED static_cast(1 << 14) #define GRALLOC_USAGE_CURSOR static_cast(1 << 15) #define GRALLOC_USAGE_HW_RENDER static_cast(1 << 9) #define GRALLOC_USAGE_HW_CAMERA_WRITE static_cast(1 << 17) #define GRALLOC_USAGE_HW_CAMERA_READ static_cast(1 << 18) #define GRALLOC_USAGE_HW_TEXTURE static_cast(1 << 8) #define GRALLOC_USAGE_HW_VIDEO_ENCODER static_cast(1 << 16) #define GRALLOC_USAGE_HW_COMPOSER static_cast(1 << 11) #define GRALLOC_USAGE_EXTERNAL_DISP static_cast(0x00002000) #define GRALLOC_USAGE_SENSOR_DIRECT_DATA static_cast(1 << 23) #define GRALLOC_USAGE_GPU_DATA_BUFFER static_cast(1 << 24) /* Originally (Gralloc 0.x), Android did not provide an explicit DECODER usage. This was rectified in Android N-MR1/7.1 * when Gralloc 1.0 defined GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER. */ #define GRALLOC_USAGE_DECODER static_cast(1 << 22) #if 0 static const uint64_t VALID_USAGE = GRALLOC_USAGE_SW_READ_MASK | /* 0x0FU */ GRALLOC_USAGE_SW_WRITE_MASK | /* 0xF0U */ GRALLOC_USAGE_HW_TEXTURE | /* 1U << 8 */ GRALLOC_USAGE_HW_RENDER | /* 1U << 9 */ GRALLOC_USAGE_HW_2D | /* 1U << 10 */ GRALLOC_USAGE_HW_COMPOSER | /* 1U << 11 */ GRALLOC_USAGE_HW_FB | /* 1U << 12 */ GRALLOC_USAGE_EXTERNAL_DISP | /* 1U << 13 */ GRALLOC_USAGE_PROTECTED | /* 1U << 14 */ GRALLOC_USAGE_CURSOR | /* 1U << 15 */ GRALLOC_USAGE_HW_VIDEO_ENCODER | /* 1U << 16 */ GRALLOC_USAGE_HW_CAMERA_WRITE | /* 1U << 17 */ GRALLOC_USAGE_HW_CAMERA_READ | /* 1U << 18 */ GRALLOC_USAGE_RENDERSCRIPT | /* 1U << 20 */ GRALLOC_USAGE_DECODER | /* 1U << 22 */ /* Producer and consumer usage are combined, but on Gralloc version 1 there is no way to differentiate these as they * are mapped to the same value (1U << 23). */ GRALLOC_USAGE_SENSOR_DIRECT_DATA | /* 1U << 23 */ GRALLOC_USAGE_GPU_DATA_BUFFER | /* 1U << 24 */ GRALLOC_USAGE_PRIVATE_19 | /* 1U << 48 */ GRALLOC_USAGE_PRIVATE_18 | /* 1U << 49 */ GRALLOC_USAGE_PRIVATE_17 | /* 1U << 50 */ GRALLOC_USAGE_PRIVATE_16 | /* 1U << 51 */ GRALLOC_USAGE_PRIVATE_15 | /* 1U << 52 */ GRALLOC_USAGE_PRIVATE_14 | /* 1U << 53 */ GRALLOC_USAGE_PRIVATE_13 | /* 1U << 54 */ GRALLOC_USAGE_PRIVATE_12 | /* 1U << 55 */ GRALLOC_USAGE_PRIVATE_11 | /* 1U << 56 */ GRALLOC_USAGE_PRIVATE_0 | /* 1U << 28 */ GRALLOC_USAGE_PRIVATE_1 | /* 1U << 29 */ GRALLOC_USAGE_PRIVATE_2 | /* 1U << 30 */ GRALLOC_USAGE_PRIVATE_3; /* 1U << 31 */ #endif #if 0 /* * Determines whether frontbuffer usage is enabled. * * @param usage gralloc usage bits. * * @return 1, if frontbuffer usage is enabled * 0, otherwise */ static inline bool gralloc_usage_is_frontbuffer(const uint64_t usage) { /* AFRC_RGBA_LUMA_CODING_SIZE_16 shares usage bits with FRONTBUFFER. */ return (usage & MALI_GRALLOC_USAGE_FRONTBUFFER) && ((usage & MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_16) != MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_16); } /* * Determines whether no AFBC usage flag is enabled. * * @param usage gralloc usage bits. * * @return 1, if no AFBC usage flag is enabled * 0, otherwise */ static inline bool gralloc_usage_is_no_afbc(const uint64_t usage) { /* AFRC_RGBA_LUMA_CODING_SIZE_24 shares usage bits with NO_AFBC. * We assume that when AFRC is requested that AFBC is also enabled. */ return ((usage & MALI_GRALLOC_USAGE_NO_AFBC) == MALI_GRALLOC_USAGE_NO_AFBC) && ((usage & MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_24) != MALI_GRALLOC_USAGE_AFRC_RGBA_LUMA_CODING_SIZE_24); } #endif