1*0a9764feSAndroid Build Coastguard Worker /* 2*0a9764feSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*0a9764feSAndroid Build Coastguard Worker * 4*0a9764feSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*0a9764feSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*0a9764feSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*0a9764feSAndroid Build Coastguard Worker * 8*0a9764feSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*0a9764feSAndroid Build Coastguard Worker * 10*0a9764feSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*0a9764feSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*0a9764feSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*0a9764feSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*0a9764feSAndroid Build Coastguard Worker * limitations under the License. 15*0a9764feSAndroid Build Coastguard Worker */ 16*0a9764feSAndroid Build Coastguard Worker 17*0a9764feSAndroid Build Coastguard Worker #define LOG_TAG "drmhwc" 18*0a9764feSAndroid Build Coastguard Worker 19*0a9764feSAndroid Build Coastguard Worker #include "BufferInfoMaliMeson.h" 20*0a9764feSAndroid Build Coastguard Worker 21*0a9764feSAndroid Build Coastguard Worker #include <xf86drm.h> 22*0a9764feSAndroid Build Coastguard Worker #include <xf86drmMode.h> 23*0a9764feSAndroid Build Coastguard Worker 24*0a9764feSAndroid Build Coastguard Worker #include <cinttypes> 25*0a9764feSAndroid Build Coastguard Worker 26*0a9764feSAndroid Build Coastguard Worker #include "gralloc_priv.h" 27*0a9764feSAndroid Build Coastguard Worker #include "utils/log.h" 28*0a9764feSAndroid Build Coastguard Worker 29*0a9764feSAndroid Build Coastguard Worker namespace android { 30*0a9764feSAndroid Build Coastguard Worker 31*0a9764feSAndroid Build Coastguard Worker LEGACY_BUFFER_INFO_GETTER(BufferInfoMaliMeson); 32*0a9764feSAndroid Build Coastguard Worker 33*0a9764feSAndroid Build Coastguard Worker #if defined(MALI_GRALLOC_INTFMT_AFBC_BASIC) && \ 34*0a9764feSAndroid Build Coastguard Worker defined(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16) ConvertGrallocFormatToDrmModifiers(uint64_t flags)35*0a9764feSAndroid Build Coastguard Workeruint64_t BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( 36*0a9764feSAndroid Build Coastguard Worker uint64_t flags) { 37*0a9764feSAndroid Build Coastguard Worker uint64_t features = 0UL; 38*0a9764feSAndroid Build Coastguard Worker 39*0a9764feSAndroid Build Coastguard Worker if (flags & MALI_GRALLOC_INTFMT_AFBC_BASIC) { 40*0a9764feSAndroid Build Coastguard Worker if (flags & MALI_GRALLOC_INTFMT_AFBC_WIDEBLK) 41*0a9764feSAndroid Build Coastguard Worker features |= AFBC_FORMAT_MOD_BLOCK_SIZE_32x8; 42*0a9764feSAndroid Build Coastguard Worker else 43*0a9764feSAndroid Build Coastguard Worker features |= AFBC_FORMAT_MOD_BLOCK_SIZE_16x16; 44*0a9764feSAndroid Build Coastguard Worker } 45*0a9764feSAndroid Build Coastguard Worker 46*0a9764feSAndroid Build Coastguard Worker if (flags & MALI_GRALLOC_INTFMT_AFBC_SPLITBLK) 47*0a9764feSAndroid Build Coastguard Worker features |= (AFBC_FORMAT_MOD_SPLIT | AFBC_FORMAT_MOD_SPARSE); 48*0a9764feSAndroid Build Coastguard Worker 49*0a9764feSAndroid Build Coastguard Worker if (flags & MALI_GRALLOC_INTFMT_AFBC_TILED_HEADERS) 50*0a9764feSAndroid Build Coastguard Worker features |= AFBC_FORMAT_MOD_TILED; 51*0a9764feSAndroid Build Coastguard Worker 52*0a9764feSAndroid Build Coastguard Worker if (features) 53*0a9764feSAndroid Build Coastguard Worker return DRM_FORMAT_MOD_ARM_AFBC(features | AFBC_FORMAT_MOD_YTR); 54*0a9764feSAndroid Build Coastguard Worker 55*0a9764feSAndroid Build Coastguard Worker return 0; 56*0a9764feSAndroid Build Coastguard Worker } 57*0a9764feSAndroid Build Coastguard Worker #else ConvertGrallocFormatToDrmModifiers(uint64_t)58*0a9764feSAndroid Build Coastguard Workeruint64_t BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( 59*0a9764feSAndroid Build Coastguard Worker uint64_t /* flags */) { 60*0a9764feSAndroid Build Coastguard Worker return 0; 61*0a9764feSAndroid Build Coastguard Worker } 62*0a9764feSAndroid Build Coastguard Worker #endif 63*0a9764feSAndroid Build Coastguard Worker GetBoInfo(buffer_handle_t handle)64*0a9764feSAndroid Build Coastguard Workerauto BufferInfoMaliMeson::GetBoInfo(buffer_handle_t handle) 65*0a9764feSAndroid Build Coastguard Worker -> std::optional<BufferInfo> { 66*0a9764feSAndroid Build Coastguard Worker const auto *hnd = (private_handle_t const *)handle; 67*0a9764feSAndroid Build Coastguard Worker if (!hnd) 68*0a9764feSAndroid Build Coastguard Worker return {}; 69*0a9764feSAndroid Build Coastguard Worker 70*0a9764feSAndroid Build Coastguard Worker if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) 71*0a9764feSAndroid Build Coastguard Worker return {}; 72*0a9764feSAndroid Build Coastguard Worker 73*0a9764feSAndroid Build Coastguard Worker const uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); 74*0a9764feSAndroid Build Coastguard Worker if (fmt == DRM_FORMAT_INVALID) 75*0a9764feSAndroid Build Coastguard Worker return {}; 76*0a9764feSAndroid Build Coastguard Worker 77*0a9764feSAndroid Build Coastguard Worker BufferInfo bi{}; 78*0a9764feSAndroid Build Coastguard Worker 79*0a9764feSAndroid Build Coastguard Worker bi.modifiers[0] = BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( 80*0a9764feSAndroid Build Coastguard Worker hnd->internal_format); 81*0a9764feSAndroid Build Coastguard Worker 82*0a9764feSAndroid Build Coastguard Worker bi.width = hnd->width; 83*0a9764feSAndroid Build Coastguard Worker bi.height = hnd->height; 84*0a9764feSAndroid Build Coastguard Worker bi.format = fmt; 85*0a9764feSAndroid Build Coastguard Worker bi.prime_fds[0] = hnd->share_fd; 86*0a9764feSAndroid Build Coastguard Worker bi.pitches[0] = hnd->byte_stride; 87*0a9764feSAndroid Build Coastguard Worker bi.offsets[0] = 0; 88*0a9764feSAndroid Build Coastguard Worker 89*0a9764feSAndroid Build Coastguard Worker return bi; 90*0a9764feSAndroid Build Coastguard Worker } 91*0a9764feSAndroid Build Coastguard Worker 92*0a9764feSAndroid Build Coastguard Worker } // namespace android 93