1*0a9764feSAndroid Build Coastguard Worker /* 2*0a9764feSAndroid Build Coastguard Worker * Copyright (C) 2020 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 #pragma once 18*0a9764feSAndroid Build Coastguard Worker 19*0a9764feSAndroid Build Coastguard Worker #include <drm/drm_fourcc.h> 20*0a9764feSAndroid Build Coastguard Worker #include <hardware/gralloc.h> 21*0a9764feSAndroid Build Coastguard Worker 22*0a9764feSAndroid Build Coastguard Worker #include <optional> 23*0a9764feSAndroid Build Coastguard Worker 24*0a9764feSAndroid Build Coastguard Worker #include "BufferInfo.h" 25*0a9764feSAndroid Build Coastguard Worker #include "drm/DrmDevice.h" 26*0a9764feSAndroid Build Coastguard Worker 27*0a9764feSAndroid Build Coastguard Worker #ifndef DRM_FORMAT_INVALID 28*0a9764feSAndroid Build Coastguard Worker #define DRM_FORMAT_INVALID 0 29*0a9764feSAndroid Build Coastguard Worker #endif 30*0a9764feSAndroid Build Coastguard Worker 31*0a9764feSAndroid Build Coastguard Worker namespace android { 32*0a9764feSAndroid Build Coastguard Worker 33*0a9764feSAndroid Build Coastguard Worker using BufferUniqueId = uint64_t; 34*0a9764feSAndroid Build Coastguard Worker 35*0a9764feSAndroid Build Coastguard Worker class BufferInfoGetter { 36*0a9764feSAndroid Build Coastguard Worker public: 37*0a9764feSAndroid Build Coastguard Worker virtual ~BufferInfoGetter() = default; 38*0a9764feSAndroid Build Coastguard Worker 39*0a9764feSAndroid Build Coastguard Worker virtual auto GetBoInfo(buffer_handle_t handle) 40*0a9764feSAndroid Build Coastguard Worker -> std::optional<BufferInfo> = 0; 41*0a9764feSAndroid Build Coastguard Worker 42*0a9764feSAndroid Build Coastguard Worker virtual std::optional<BufferUniqueId> GetUniqueId(buffer_handle_t handle); 43*0a9764feSAndroid Build Coastguard Worker 44*0a9764feSAndroid Build Coastguard Worker static BufferInfoGetter *GetInstance(); 45*0a9764feSAndroid Build Coastguard Worker 46*0a9764feSAndroid Build Coastguard Worker static bool IsDrmFormatRgb(uint32_t drm_format); 47*0a9764feSAndroid Build Coastguard Worker }; 48*0a9764feSAndroid Build Coastguard Worker 49*0a9764feSAndroid Build Coastguard Worker class LegacyBufferInfoGetter : public BufferInfoGetter { 50*0a9764feSAndroid Build Coastguard Worker public: 51*0a9764feSAndroid Build Coastguard Worker using BufferInfoGetter::BufferInfoGetter; 52*0a9764feSAndroid Build Coastguard Worker 53*0a9764feSAndroid Build Coastguard Worker int Init(); 54*0a9764feSAndroid Build Coastguard Worker ValidateGralloc()55*0a9764feSAndroid Build Coastguard Worker virtual int ValidateGralloc() { 56*0a9764feSAndroid Build Coastguard Worker return 0; 57*0a9764feSAndroid Build Coastguard Worker } 58*0a9764feSAndroid Build Coastguard Worker 59*0a9764feSAndroid Build Coastguard Worker static std::unique_ptr<LegacyBufferInfoGetter> CreateInstance(); 60*0a9764feSAndroid Build Coastguard Worker 61*0a9764feSAndroid Build Coastguard Worker static uint32_t ConvertHalFormatToDrm(uint32_t hal_format); 62*0a9764feSAndroid Build Coastguard Worker 63*0a9764feSAndroid Build Coastguard Worker // NOLINTNEXTLINE:(readability-identifier-naming) 64*0a9764feSAndroid Build Coastguard Worker const gralloc_module_t *gralloc_; 65*0a9764feSAndroid Build Coastguard Worker }; 66*0a9764feSAndroid Build Coastguard Worker 67*0a9764feSAndroid Build Coastguard Worker #ifdef DISABLE_LEGACY_GETTERS 68*0a9764feSAndroid Build Coastguard Worker #define LEGACY_BUFFER_INFO_GETTER(getter_) 69*0a9764feSAndroid Build Coastguard Worker #else 70*0a9764feSAndroid Build Coastguard Worker // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 71*0a9764feSAndroid Build Coastguard Worker #define LEGACY_BUFFER_INFO_GETTER(getter_) \ 72*0a9764feSAndroid Build Coastguard Worker std::unique_ptr<LegacyBufferInfoGetter> \ 73*0a9764feSAndroid Build Coastguard Worker LegacyBufferInfoGetter::CreateInstance() { \ 74*0a9764feSAndroid Build Coastguard Worker auto instance = std::make_unique<getter_>(); \ 75*0a9764feSAndroid Build Coastguard Worker if (instance) { \ 76*0a9764feSAndroid Build Coastguard Worker int err = instance->Init(); \ 77*0a9764feSAndroid Build Coastguard Worker if (err) { \ 78*0a9764feSAndroid Build Coastguard Worker ALOGE("Failed to initialize the " #getter_ " getter %d", err); \ 79*0a9764feSAndroid Build Coastguard Worker instance.reset(); \ 80*0a9764feSAndroid Build Coastguard Worker } \ 81*0a9764feSAndroid Build Coastguard Worker err = instance->ValidateGralloc(); \ 82*0a9764feSAndroid Build Coastguard Worker if (err) { \ 83*0a9764feSAndroid Build Coastguard Worker instance.reset(); \ 84*0a9764feSAndroid Build Coastguard Worker } \ 85*0a9764feSAndroid Build Coastguard Worker } \ 86*0a9764feSAndroid Build Coastguard Worker return std::move(instance); \ 87*0a9764feSAndroid Build Coastguard Worker } 88*0a9764feSAndroid Build Coastguard Worker #endif 89*0a9764feSAndroid Build Coastguard Worker 90*0a9764feSAndroid Build Coastguard Worker } // namespace android 91