xref: /aosp_15_r20/external/drm_hwcomposer/bufferinfo/BufferInfoGetter.h (revision 0a9764fe0a15e71ebbeb85e87e10990c23aab47f)
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